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"/> - -