This commit is contained in:
GukSang.Jin
2026-01-29 17:02:47 +08:00
parent 71a0b7ae76
commit aa2c73daec
4 changed files with 116 additions and 11 deletions

View File

@@ -38,6 +38,8 @@ namespace COFTester.Resources
["StartTest"] = "开始测试",
["Stop"] = "停止",
["ResetSystem"] = "复位",
["Resetting"] = "复位中",
["ResetComplete"] = "复位",
["Connect"] = "连接",
["Disconnect"] = "断开",
["Reconnect"] = "重新连接",
@@ -186,6 +188,8 @@ namespace COFTester.Resources
["StartTest"] = "Start Test",
["Stop"] = "Stop",
["ResetSystem"] = "Reset System",
["Resetting"] = "Resetting",
["ResetComplete"] = "Reset",
["Connect"] = "Connect",
["Disconnect"] = "Disconnect",
["Reconnect"] = "Reconnect",
@@ -344,6 +348,8 @@ namespace COFTester.Resources
public string StartTest => GetString("StartTest");
public string Stop => GetString("Stop");
public string ResetSystem => GetString("ResetSystem");
public string Resetting => GetString("Resetting");
public string ResetComplete => GetString("ResetComplete");
public string TestParameters => GetString("TestParameters");
public string Standard => GetString("Standard");
public string SledMass => GetString("SledMass");
@@ -485,6 +491,8 @@ namespace COFTester.Resources
OnPropertyChanged(nameof(StartTest));
OnPropertyChanged(nameof(Stop));
OnPropertyChanged(nameof(ResetSystem));
OnPropertyChanged(nameof(Resetting));
OnPropertyChanged(nameof(ResetComplete));
OnPropertyChanged(nameof(TestParameters));
OnPropertyChanged(nameof(Standard));
OnPropertyChanged(nameof(SledMass));

View File

@@ -221,6 +221,47 @@ namespace COFTester.Services
}
}
/// <summary>
/// 切换型复位按钮 - 使用 NModbus 3.0.81 API
/// 实现方式:读取当前状态 → 写入相反状态 → 延迟 100ms
/// 参考case ButtonType.切换型
/// </summary>
/// <param name="address">线圈地址例如M1301</param>
/// <returns>返回操作是否成功</returns>
public virtual async Task<bool> ToggleResetAsync(ushort address)
{
try
{
if (_modbusMaster != null && _isConnected)
{
System.Diagnostics.Debug.WriteLine($"[Modbus] 开始切换型复位操作 - 地址: {address}");
// 1. 读取当前线圈状态
var coils = await _modbusMaster.ReadCoilsAsync(1, address, 1);
bool currentState = coils[0];
System.Diagnostics.Debug.WriteLine($"[Modbus] 当前状态: {currentState}");
// 2. 写入相反状态
bool newState = !currentState;
await _modbusMaster.WriteSingleCoilAsync(1, address, newState);
System.Diagnostics.Debug.WriteLine($"[Modbus] 写入新状态: {newState}");
// 3. 延迟 100ms 确保 PLC 处理完成
await Task.Delay(100);
System.Diagnostics.Debug.WriteLine($"[Modbus] 切换型复位操作完成");
return true;
}
return false;
}
catch (Exception ex)
{
OnErrorOccurred($"切换型复位失败: {ex.Message}");
System.Diagnostics.Debug.WriteLine($"[Modbus] 切换型复位异常: {ex.Message}");
return false;
}
}
/// <summary>
/// 零點標定,向 M1300 寫入脉冲信号(复归型按钮)
/// 实现方式:写入 true → 延迟 100ms → 写入 false → 延迟 100ms

View File

@@ -40,6 +40,7 @@ namespace COFTester.ViewModels
private int _testCounter = 0;
private bool _disposed = false;
private string _selectedDirection = ""; // 选中的方向Up/Down/Right/Left
private string _resetButtonText; // 复位按钮文本
public MainViewModel(IDataAcquisitionService daqService, DataProcessingService processingService, AppConfig config)
{
@@ -50,6 +51,7 @@ namespace COFTester.ViewModels
// 初始化状态消息
_statusMessage = LanguageResources.Instance.SystemReady;
_resetButtonText = LanguageResources.Instance.ResetSystem;
// 訂閱數據採集服務事件
_daqService.DataReceived += OnDataReceived;
@@ -411,6 +413,12 @@ namespace COFTester.ViewModels
set { _currentDateTime = value; OnPropertyChanged(); }
}
public string ResetButtonText
{
get => _resetButtonText;
set { _resetButtonText = value; OnPropertyChanged(); }
}
#endregion
#region Commands
@@ -637,16 +645,60 @@ namespace COFTester.ViewModels
StatusMessage = Lang.TestStopped;
}
private void Reset()
private async void Reset()
{
_realTimePoints.Clear();
OnPropertyChanged(nameof(DataPointsCount));
LatestResult = null;
CurrentForce = 0;
CurrentDisp = 0;
StatusMessage = Lang.SystemReset;
UpdateScottPlot();
_daqService.ResetSensors();
try
{
// 1. 更新按钮文本为"复位中"
ResetButtonText = Lang.Resetting;
StatusMessage = Lang.Resetting;
// 2. 清除界面数据
_realTimePoints.Clear();
OnPropertyChanged(nameof(DataPointsCount));
LatestResult = null;
CurrentForce = 0;
CurrentDisp = 0;
UpdateScottPlot();
// 3. 执行切换型复位操作(使用 NModbus 3.0.81 API
// 复位线圈地址为 M90
const ushort RESET_COIL_ADDRESS = 90;
if (_daqService is ModbusServiceBase modbusService)
{
bool success = await modbusService.ToggleResetAsync(RESET_COIL_ADDRESS);
if (success)
{
StatusMessage = Lang.SystemReset;
}
else
{
StatusMessage = "复位失败";
}
}
else
{
// 兼容旧的复位方式
_daqService.ResetSensors();
StatusMessage = Lang.SystemReset;
}
}
catch (Exception ex)
{
StatusMessage = $"复位异常: {ex.Message}";
System.Diagnostics.Debug.WriteLine($"[Reset] 异常: {ex.Message}");
}
finally
{
// 4. 恢复按钮文本为"复位"
ResetButtonText = Lang.ResetComplete;
// 延迟 500ms 后恢复原始文本
await Task.Delay(500);
ResetButtonText = Lang.ResetSystem;
}
}
/// <summary>
@@ -982,6 +1034,10 @@ namespace COFTester.ViewModels
StatusMessage = Lang.Testing;
else if (_statusMessage.Contains("分析完成") || _statusMessage.Contains("Analysis Completed"))
StatusMessage = Lang.AnalysisCompleted;
// 更新复位按钮文本
if (!_isTesting)
ResetButtonText = Lang.ResetSystem;
}
private void OpenConfig()

View File

@@ -260,8 +260,8 @@
Height="70" Width="110" Background="#27AE60"
Style="{StaticResource IndustrialButtonStyle}" Margin="5"/>
<!-- 复位按钮 -->
<Button Content="{Binding Lang.ResetSystem}" Command="{Binding ResetCommand}"
<!-- 复位按钮 - 动态显示状态:复位 → 复位中 → 复位 -->
<Button Content="{Binding ResetButtonText}" Command="{Binding ResetCommand}"
Height="70" Width="110" Background="#3498DB"
Style="{StaticResource IndustrialButtonStyle}" Margin="5"/>
</StackPanel>