更新121

This commit is contained in:
GukSang.Jin
2026-06-09 15:17:53 +08:00
parent 90a5e93833
commit e8e81b1e46
2 changed files with 45 additions and 5 deletions

View File

@@ -871,7 +871,7 @@
LostTouchCapture="ManualMotionButton_LostTouchCapture" LostTouchCapture="ManualMotionButton_LostTouchCapture"
Margin="8,0,8,0" /> Margin="8,0,8,0" />
<Button Grid.Column="2" <Button Grid.Column="2"
Content="通气阀" Content="{Binding VentValveButtonText}"
Command="{Binding VentValveCommand}" Command="{Binding VentValveCommand}"
Margin="8,0,8,0" /> Margin="8,0,8,0" />
<Button Grid.Column="3" <Button Grid.Column="3"

View File

@@ -41,6 +41,7 @@ public sealed class MainWindowViewModel : ObservableObject
private const ushort VentValveCoil = 6; private const ushort VentValveCoil = 6;
private const ushort AxialForceModeCoil = 30; private const ushort AxialForceModeCoil = 30;
private const ushort AxialStartCoil = 70; private const ushort AxialStartCoil = 70;
private const ushort AxialDoneCoil = 72;
private const ushort AxialStopCoil = 73; private const ushort AxialStopCoil = 73;
private const ushort SpeedTorqueStartCoil = 80; private const ushort SpeedTorqueStartCoil = 80;
private const ushort SpeedTorqueDoneCoil = 82; private const ushort SpeedTorqueDoneCoil = 82;
@@ -136,6 +137,8 @@ public sealed class MainWindowViewModel : ObservableObject
private static readonly ushort[] RealtimeCoilAddresses = private static readonly ushort[] RealtimeCoilAddresses =
[ [
VentValveCoil,
AxialDoneCoil,
SpeedTorqueDoneCoil, SpeedTorqueDoneCoil,
SpeedTorqueResetEnabledCoil, SpeedTorqueResetEnabledCoil,
SpeedTorqueResetDoneCoil, SpeedTorqueResetDoneCoil,
@@ -203,6 +206,7 @@ public sealed class MainWindowViewModel : ObservableObject
private bool _isApplyingParameterConfigToInputs; private bool _isApplyingParameterConfigToInputs;
private bool _isDisplacementResetting; private bool _isDisplacementResetting;
private bool _isSpeedTorqueResetting; private bool _isSpeedTorqueResetting;
private bool _isVentValveOpen;
private bool _hasShownSpeedTorqueEndWarnings; private bool _hasShownSpeedTorqueEndWarnings;
private DateTime _lastParameterReadFailureLogAt = DateTime.MinValue; private DateTime _lastParameterReadFailureLogAt = DateTime.MinValue;
private string _relativeDisplacementText = "0.000 mm"; private string _relativeDisplacementText = "0.000 mm";
@@ -238,6 +242,7 @@ public sealed class MainWindowViewModel : ObservableObject
private string _axialForceSetpointModeButtonText = "轴向跳动力设置"; private string _axialForceSetpointModeButtonText = "轴向跳动力设置";
private string _displacementResetButtonText = "复位"; private string _displacementResetButtonText = "复位";
private string _speedTorqueResetButtonText = "复位"; private string _speedTorqueResetButtonText = "复位";
private string _ventValveButtonText = "开启通气阀";
public MainWindowViewModel(IPlcCoilService plcCoilService, IPlcRegisterService plcRegisterService, IFileDialogService fileDialogService) public MainWindowViewModel(IPlcCoilService plcCoilService, IPlcRegisterService plcRegisterService, IFileDialogService fileDialogService)
{ {
@@ -261,7 +266,7 @@ public sealed class MainWindowViewModel : ObservableObject
SelectAxialJumpForceSetpointModeCommand = new AsyncRelayCommand(SelectAxialJumpForceSetpointModeAsync); SelectAxialJumpForceSetpointModeCommand = new AsyncRelayCommand(SelectAxialJumpForceSetpointModeAsync);
ForwardSpeedTorqueCommand = new AsyncRelayCommand(ForwardSpeedTorqueAsync); ForwardSpeedTorqueCommand = new AsyncRelayCommand(ForwardSpeedTorqueAsync);
BackwardSpeedTorqueCommand = new AsyncRelayCommand(BackwardSpeedTorqueAsync); BackwardSpeedTorqueCommand = new AsyncRelayCommand(BackwardSpeedTorqueAsync);
VentValveCommand = new AsyncRelayCommand(TriggerVentValveAsync); VentValveCommand = new AsyncRelayCommand(ToggleVentValveAsync);
StartSpeedTorqueCommand = new AsyncRelayCommand(StartSpeedTorqueAsync); StartSpeedTorqueCommand = new AsyncRelayCommand(StartSpeedTorqueAsync);
StopSpeedTorqueCommand = new AsyncRelayCommand(StopSpeedTorqueAsync); StopSpeedTorqueCommand = new AsyncRelayCommand(StopSpeedTorqueAsync);
ResetSpeedTorqueCommand = new AsyncRelayCommand(ResetSpeedTorqueAsync); ResetSpeedTorqueCommand = new AsyncRelayCommand(ResetSpeedTorqueAsync);
@@ -662,6 +667,12 @@ public sealed class MainWindowViewModel : ObservableObject
private set => SetProperty(ref _speedTorqueResetButtonText, value); private set => SetProperty(ref _speedTorqueResetButtonText, value);
} }
public string VentValveButtonText
{
get => _ventValveButtonText;
private set => SetProperty(ref _ventValveButtonText, value);
}
private async void RealtimeTimer_Tick(object? sender, EventArgs e) private async void RealtimeTimer_Tick(object? sender, EventArgs e)
{ {
if (_isReadingRealtime) if (_isReadingRealtime)
@@ -697,6 +708,7 @@ public sealed class MainWindowViewModel : ObservableObject
_realtimeSpeed = realtimeSpeed; _realtimeSpeed = realtimeSpeed;
AppendTorqueSample(GetScaledTorque(), DateTime.Now); AppendTorqueSample(GetScaledTorque(), DateTime.Now);
ApplyResetCoilValues(coilValues); ApplyResetCoilValues(coilValues);
UpdateVentValveState(ReadCoilValue(coilValues, VentValveCoil));
CaptureRealtimeSample(dialIndicator, coilValues); CaptureRealtimeSample(dialIndicator, coilValues);
FinalizeNoLoadSpeedRunIfDue(); FinalizeNoLoadSpeedRunIfDue();
QueueSnapshotIfDue(); QueueSnapshotIfDue();
@@ -706,6 +718,11 @@ public sealed class MainWindowViewModel : ObservableObject
_maxDisplacement = Math.Max(_maxDisplacement, Math.Abs(_relativeDisplacement)); _maxDisplacement = Math.Max(_maxDisplacement, Math.Abs(_relativeDisplacement));
} }
if (_isDisplacementRunning && ReadCoilValue(coilValues, AxialDoneCoil))
{
StopDisplacementTest("状态:已完成");
}
if (_isSpeedTorqueRunning && ReadCoilValue(coilValues, SpeedTorqueDoneCoil)) if (_isSpeedTorqueRunning && ReadCoilValue(coilValues, SpeedTorqueDoneCoil))
{ {
await StopSpeedTorqueTestAsync("状态:已完成"); await StopSpeedTorqueTestAsync("状态:已完成");
@@ -2040,11 +2057,28 @@ public sealed class MainWindowViewModel : ObservableObject
await MoveSpeedTorqueDisplacementAsync(); await MoveSpeedTorqueDisplacementAsync();
} }
private async Task TriggerVentValveAsync() private async Task ToggleVentValveAsync()
{ {
if (await PulsePlcAsync(VentValveCoil, "通气阀")) try
{ {
StatusText = "通气阀已触发。"; IReadOnlyDictionary<ushort, bool> values = await _plcCoilService.ReadCoilValuesAsync(
_parameterConfig.ToPlcConnectionConfig(),
[VentValveCoil]);
bool targetState = !ReadCoilValue(values, VentValveCoil);
await _plcCoilService.WriteCoilAsync(
_parameterConfig.ToPlcConnectionConfig(),
VentValveCoil,
targetState);
UpdateVentValveState(targetState);
StatusText = targetState ? "通气阀已开启。" : "通气阀已关闭。";
Log.Information("PLC常开触点开关成功通气阀M{CoilAddress}={Value}", VentValveCoil, targetState ? 1 : 0);
}
catch (Exception ex)
{
StatusText = $"PLC 通气阀开关失败:{OperatorMessageFormatter.FromException(ex)}";
Log.Error(ex, "PLC常开触点开关失败通气阀M{CoilAddress}", VentValveCoil);
} }
} }
@@ -2838,6 +2872,12 @@ public sealed class MainWindowViewModel : ObservableObject
SpeedTorqueResetButtonText = _isSpeedTorqueResetting || enabled ? "复位中" : "复位"; SpeedTorqueResetButtonText = _isSpeedTorqueResetting || enabled ? "复位中" : "复位";
} }
private void UpdateVentValveState(bool isOpen)
{
_isVentValveOpen = isOpen;
VentValveButtonText = _isVentValveOpen ? "关闭通气阀" : "开启通气阀";
}
private static bool ReadCoilValue(IReadOnlyDictionary<ushort, bool> coilValues, ushort address) private static bool ReadCoilValue(IReadOnlyDictionary<ushort, bool> coilValues, ushort address)
{ {
return coilValues.TryGetValue(address, out bool value) && value; return coilValues.TryGetValue(address, out bool value) && value;