From b2da230e240da24df5e47fd05068e225b37442b0 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Wed, 20 May 2026 17:45:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Models/PlcConfiguration.cs | 1 + ViewModels/StationViewModel.cs | 70 +++++++++++++++++++++++++++++----- Views/MainWindow.xaml | 2 +- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/Models/PlcConfiguration.cs b/Models/PlcConfiguration.cs index a72d46c..9aafdd8 100644 --- a/Models/PlcConfiguration.cs +++ b/Models/PlcConfiguration.cs @@ -24,6 +24,7 @@ // 兼容旧代码:硬度完成线圈与溶出或硬度实时值寄存器地址 public ushort HardnessOver { get; set; } public ushort HardnessCompleteCoil { get; set; } + public ushort HardnessStartOver { get; set; } public ushort HardnessPoSun { get; set; } public ushort HardnessPressure { get; set; } // 脆碎度 diff --git a/ViewModels/StationViewModel.cs b/ViewModels/StationViewModel.cs index deecf3c..50f3c9b 100644 --- a/ViewModels/StationViewModel.cs +++ b/ViewModels/StationViewModel.cs @@ -77,6 +77,8 @@ namespace TabletTester2025.ViewModels [ObservableProperty] private double _hardnessRSD; [ObservableProperty] private double _hardnessInternalMin = 40; [ObservableProperty] private double _hardnessInternalMax = 60; + [ObservableProperty] private bool _isHardnessResetting; + public string HardnessResetButtonText => IsHardnessResetting ? "复位中" : "复位"; //硬度新增 @@ -267,16 +269,7 @@ namespace TabletTester2025.ViewModels }); //硬复位 - HardnessResetCommand = new AsyncRelayCommand(async () => - { - // 1. 标准PLC按钮脉冲逻辑:置1 → 延时 → 置0(模拟按下再松开按钮) - await _plc.WriteCoilAsync(_plcConfig.HardnessStartReset, true); - await Task.Delay(100); // 脉冲宽度,可根据PLC程序调整20~100ms - await _plc.WriteCoilAsync(_plcConfig.HardnessStartReset, false); - _isHardnessRunning = false; - RefreshOverallPhase(); - - }); + HardnessResetCommand = new AsyncRelayCommand(ResetHardnessAsync, CanResetHardness); // 硬前进按钮命令 HardnessForward = new AsyncRelayCommand(async () => @@ -1725,6 +1718,63 @@ namespace TabletTester2025.ViewModels HardnessSudu = value; } + partial void OnIsHardnessResettingChanged(bool value) + { + OnPropertyChanged(nameof(HardnessResetButtonText)); + HardnessResetCommand?.NotifyCanExecuteChanged(); + } + + private bool CanResetHardness() + { + return !IsHardnessResetting; + } + + private async Task ResetHardnessAsync() + { + if (IsHardnessResetting) + return; + + IsHardnessResetting = true; + try + { + await PulseCoilAsync(_plcConfig.HardnessStartReset); + _isHardnessRunning = false; + RefreshOverallPhase(); + await WaitForHardnessResetCompleteAsync(ResolveHardnessResetCompleteCoil()); + } + catch (Exception ex) + { + await Application.Current.Dispatcher.InvokeAsync(() => + MessageBox.Show($"硬度复位出错: {ex.Message}")); + } + finally + { + IsHardnessResetting = false; + } + } + + private ushort ResolveHardnessResetCompleteCoil() + { + return _plcConfig.HardnessStartOver; + } + + private async Task WaitForHardnessResetCompleteAsync(ushort completeCoil) + { + if (completeCoil == 0) + throw new InvalidOperationException("硬度复位完成线圈未配置"); + + DateTime deadline = DateTime.Now.AddSeconds(120); + while (DateTime.Now <= deadline) + { + if (await _plc.ReadCoilAsync(completeCoil)) + return; + + await Task.Delay(100); + } + + throw new TimeoutException("等待硬度复位完成信号超时"); + } + private async Task WaitForHardnessSampleCompleteAsync(ushort completeCoil) { DateTime deadline = DateTime.Now.AddSeconds(120); diff --git a/Views/MainWindow.xaml b/Views/MainWindow.xaml index 2061fbc..81ca3ae 100644 --- a/Views/MainWindow.xaml +++ b/Views/MainWindow.xaml @@ -469,7 +469,7 @@