diff --git a/CSI-H238M/CSI-H238M/Resources/LanguageResources.cs b/CSI-H238M/CSI-H238M/Resources/LanguageResources.cs
index cba1e9a..08417b8 100644
--- a/CSI-H238M/CSI-H238M/Resources/LanguageResources.cs
+++ b/CSI-H238M/CSI-H238M/Resources/LanguageResources.cs
@@ -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));
diff --git a/CSI-H238M/CSI-H238M/Services/ModbusService.cs b/CSI-H238M/CSI-H238M/Services/ModbusService.cs
index cb7c5fc..cea9cae 100644
--- a/CSI-H238M/CSI-H238M/Services/ModbusService.cs
+++ b/CSI-H238M/CSI-H238M/Services/ModbusService.cs
@@ -221,6 +221,47 @@ namespace COFTester.Services
}
}
+ ///
+ /// 切换型复位按钮 - 使用 NModbus 3.0.81 API
+ /// 实现方式:读取当前状态 → 写入相反状态 → 延迟 100ms
+ /// 参考:case ButtonType.切换型
+ ///
+ /// 线圈地址(例如:M1301)
+ /// 返回操作是否成功
+ public virtual async Task 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;
+ }
+ }
+
///
/// 零點標定,向 M1300 寫入脉冲信号(复归型按钮)
/// 实现方式:写入 true → 延迟 100ms → 写入 false → 延迟 100ms
diff --git a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs
index 7b1ba53..0ae889c 100644
--- a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs
+++ b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs
@@ -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;
@@ -410,6 +412,12 @@ namespace COFTester.ViewModels
get => _currentDateTime;
set { _currentDateTime = value; OnPropertyChanged(); }
}
+
+ public string ResetButtonText
+ {
+ get => _resetButtonText;
+ set { _resetButtonText = value; OnPropertyChanged(); }
+ }
#endregion
@@ -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;
+ }
}
///
@@ -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()
diff --git a/CSI-H238M/CSI-H238M/Views/TestPage.xaml b/CSI-H238M/CSI-H238M/Views/TestPage.xaml
index 8b61969..9f125b8 100644
--- a/CSI-H238M/CSI-H238M/Views/TestPage.xaml
+++ b/CSI-H238M/CSI-H238M/Views/TestPage.xaml
@@ -260,8 +260,8 @@
Height="70" Width="110" Background="#27AE60"
Style="{StaticResource IndustrialButtonStyle}" Margin="5"/>
-
-