This commit is contained in:
GukSang.Jin
2026-06-09 14:45:12 +08:00
parent d9fe314e84
commit 8e683372ee
2 changed files with 54 additions and 174 deletions

View File

@@ -384,7 +384,6 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="实时千分表" Style="{StaticResource MetricTitle}" /> <TextBlock Text="实时千分表" Style="{StaticResource MetricTitle}" />
<TextBlock Grid.Row="1" <TextBlock Grid.Row="1"
@@ -393,13 +392,6 @@
Style="{StaticResource MetricValue}" Style="{StaticResource MetricValue}"
Foreground="#0F766E" Foreground="#0F766E"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
<TextBlock Grid.Row="2"
x:Name="DisplacementStatusText"
Text="{Binding DisplacementStatusText}"
FontSize="22"
FontWeight="SemiBold"
HorizontalAlignment="Center"
Foreground="#52616F" />
</Grid> </Grid>
</Border> </Border>
@@ -408,7 +400,6 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="实时轴向力" Style="{StaticResource MetricTitle}" /> <TextBlock Text="实时轴向力" Style="{StaticResource MetricTitle}" />
<TextBlock Grid.Row="1" <TextBlock Grid.Row="1"
@@ -417,11 +408,6 @@
Style="{StaticResource MetricValue}" Style="{StaticResource MetricValue}"
Foreground="#1D4ED8" Foreground="#1D4ED8"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
<TextBlock Grid.Row="2"
Text="达到设定力自动停止"
FontSize="18"
HorizontalAlignment="Center"
Foreground="#52616F" />
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>
@@ -683,25 +669,11 @@
Foreground="#0F766E" Foreground="#0F766E"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
<Border Grid.Row="2" Style="{StaticResource InfoStrip}"> <Border Grid.Row="2" Style="{StaticResource InfoStrip}">
<Grid> <TextBlock x:Name="RealtimePressureText"
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock x:Name="SpeedTorqueStatusText"
Text="{Binding SpeedTorqueStatusText}"
FontSize="19"
FontWeight="SemiBold"
HorizontalAlignment="Center"
Foreground="#334155" />
<TextBlock Grid.Row="1"
x:Name="RealtimePressureText"
Text="{Binding RealtimePressureText}" Text="{Binding RealtimePressureText}"
FontSize="16" FontSize="16"
HorizontalAlignment="Center" HorizontalAlignment="Center"
Foreground="#52616F" Foreground="#52616F" />
Margin="0,4,0,0" />
</Grid>
</Border> </Border>
</Grid> </Grid>
</Border> </Border>
@@ -981,7 +953,6 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="210" /> <ColumnDefinition Width="210" />
@@ -1007,16 +978,6 @@
Style="{StaticResource MutedText}" Style="{StaticResource MutedText}"
Margin="0,16,0,0" Margin="0,16,0,0"
VerticalAlignment="Center" /> VerticalAlignment="Center" />
<Border Grid.Row="2"
Grid.ColumnSpan="3"
Style="{StaticResource InfoStrip}"
Margin="0,16,0,0">
<TextBlock Text="{Binding NoLoadSpeedStatusText}"
FontSize="18"
FontWeight="SemiBold"
HorizontalAlignment="Center"
Foreground="#334155" />
</Border>
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>

View File

@@ -204,10 +204,6 @@ public sealed class MainWindowViewModel : ObservableObject
private bool _isDisplacementResetting; private bool _isDisplacementResetting;
private bool _isSpeedTorqueResetting; private bool _isSpeedTorqueResetting;
private bool _hasShownSpeedTorqueEndWarnings; private bool _hasShownSpeedTorqueEndWarnings;
private bool _isAxialResetEnabled;
private bool _isAxialResetDone;
private bool _isSpeedTorqueResetEnabled;
private bool _isSpeedTorqueResetDone;
private DateTime _lastParameterReadFailureLogAt = DateTime.MinValue; private DateTime _lastParameterReadFailureLogAt = DateTime.MinValue;
private string _relativeDisplacementText = "0.000 mm"; private string _relativeDisplacementText = "0.000 mm";
private string _axialAxisPositionText = "0.000 mm"; private string _axialAxisPositionText = "0.000 mm";
@@ -217,15 +213,12 @@ public sealed class MainWindowViewModel : ObservableObject
private string _finalDisplacementText = "--"; private string _finalDisplacementText = "--";
private string _axialForceText = "0.00 N"; private string _axialForceText = "0.00 N";
private string _finalAxialForceText = "--"; private string _finalAxialForceText = "--";
private string _displacementStatusText = "状态:待复位";
private string _realtimeSpeedText = "0 r/min"; private string _realtimeSpeedText = "0 r/min";
private string _realtimeTorqueText = $"0.00 {TorqueUnit}"; private string _realtimeTorqueText = $"0.00 {TorqueUnit}";
private string _realtimePressureText = "0.000 MPa"; private string _realtimePressureText = "0.000 MPa";
private string _noLoadSpeedRecordText = "0 r/min"; private string _noLoadSpeedRecordText = "0 r/min";
private string _noLoadSpeedErrorRateText = "0.00 %"; private string _noLoadSpeedErrorRateText = "0.00 %";
private string _noLoadSpeedStatusText = "状态:待记录";
private string _noLoadSpeedSettingInput = "0"; private string _noLoadSpeedSettingInput = "0";
private string _speedTorqueStatusText = "状态:待启动";
private string _finalSpeedTorqueText = "最终:-- / --"; private string _finalSpeedTorqueText = "最终:-- / --";
private string _speedTorqueAxisPositionText = "0.000 mm"; private string _speedTorqueAxisPositionText = "0.000 mm";
private string _speedTorqueDisplacementText = "0.000 mm"; private string _speedTorqueDisplacementText = "0.000 mm";
@@ -277,8 +270,8 @@ public sealed class MainWindowViewModel : ObservableObject
_parameterConfig = LoadParameterConfig(); _parameterConfig = LoadParameterConfig();
ApplyParameterConfigToInputs(); ApplyParameterConfigToInputs();
UpdateDisplacementDisplay("状态:待复位"); UpdateDisplacementDisplay();
UpdateSpeedTorqueDisplay("状态:待启动"); UpdateSpeedTorqueDisplay();
RefreshOverallResult(); RefreshOverallResult();
UpdateDataCaptureStatus(); UpdateDataCaptureStatus();
@@ -401,9 +394,7 @@ public sealed class MainWindowViewModel : ObservableObject
if (!TryReadNonNegative(value, GetActiveAxialForceSetpointName(), out double axialForceSetpoint, out string error)) if (!TryReadNonNegative(value, GetActiveAxialForceSetpointName(), out double axialForceSetpoint, out string error))
{ {
SetTestPageInputStatus( SetTestPageInputStatus(error);
_parameterConfig.UseAxialPullForceSetpoint ? TestPageInputParameter.AxialPullForceSetpoint : TestPageInputParameter.AxialJumpForceSetpoint,
error);
return; return;
} }
@@ -553,12 +544,6 @@ public sealed class MainWindowViewModel : ObservableObject
private set => SetProperty(ref _finalAxialForceText, value); private set => SetProperty(ref _finalAxialForceText, value);
} }
public string DisplacementStatusText
{
get => _displacementStatusText;
private set => SetProperty(ref _displacementStatusText, value);
}
public string RealtimeSpeedText public string RealtimeSpeedText
{ {
get => _realtimeSpeedText; get => _realtimeSpeedText;
@@ -589,18 +574,6 @@ public sealed class MainWindowViewModel : ObservableObject
private set => SetProperty(ref _noLoadSpeedErrorRateText, value); private set => SetProperty(ref _noLoadSpeedErrorRateText, value);
} }
public string NoLoadSpeedStatusText
{
get => _noLoadSpeedStatusText;
private set => SetProperty(ref _noLoadSpeedStatusText, value);
}
public string SpeedTorqueStatusText
{
get => _speedTorqueStatusText;
private set => SetProperty(ref _speedTorqueStatusText, value);
}
public string FinalSpeedTorqueText public string FinalSpeedTorqueText
{ {
get => _finalSpeedTorqueText; get => _finalSpeedTorqueText;
@@ -738,8 +711,8 @@ public sealed class MainWindowViewModel : ObservableObject
await StopSpeedTorqueTestAsync("状态:已完成"); await StopSpeedTorqueTestAsync("状态:已完成");
} }
UpdateDisplacementDisplay(ResolveDisplacementStatus(DisplacementStatusText)); UpdateDisplacementDisplay();
UpdateSpeedTorqueDisplay(ResolveSpeedTorqueStatus(SpeedTorqueStatusText)); UpdateSpeedTorqueDisplay();
UpdateNoLoadSpeedDisplay(); UpdateNoLoadSpeedDisplay();
await AutoStopIfSetpointReachedAsync(); await AutoStopIfSetpointReachedAsync();
await AutoStopIfSpeedTorqueProtectionReachedAsync(); await AutoStopIfSpeedTorqueProtectionReachedAsync();
@@ -747,7 +720,6 @@ public sealed class MainWindowViewModel : ObservableObject
if (_lastRealtimeReadFailed) if (_lastRealtimeReadFailed)
{ {
StatusText = "实时数据已恢复"; StatusText = "实时数据已恢复";
NoLoadSpeedStatusText = "状态:实时数据已恢复";
_lastRealtimeReadFailed = false; _lastRealtimeReadFailed = false;
Log.Information("PLC实时数据读取已恢复"); Log.Information("PLC实时数据读取已恢复");
} }
@@ -757,7 +729,6 @@ public sealed class MainWindowViewModel : ObservableObject
if (!_lastRealtimeReadFailed) if (!_lastRealtimeReadFailed)
{ {
StatusText = $"实时数据读取失败:{ex.Message}"; StatusText = $"实时数据读取失败:{ex.Message}";
NoLoadSpeedStatusText = "状态:实时数据读取失败";
_lastRealtimeReadFailed = true; _lastRealtimeReadFailed = true;
Log.Warning(ex, "PLC实时数据读取失败后续相同故障将等待恢复后再记录"); Log.Warning(ex, "PLC实时数据读取失败后续相同故障将等待恢复后再记录");
} }
@@ -849,8 +820,8 @@ public sealed class MainWindowViewModel : ObservableObject
ApplyParameterConfigToInputs(); ApplyParameterConfigToInputs();
NoLoadSpeedSettingInput = FormatConfigNumber(noLoadSpeedSetting); NoLoadSpeedSettingInput = FormatConfigNumber(noLoadSpeedSetting);
NotifyParameterInputsChanged(); NotifyParameterInputsChanged();
UpdateDisplacementDisplay(DisplacementStatusText); UpdateDisplacementDisplay();
UpdateSpeedTorqueDisplay(SpeedTorqueStatusText); UpdateSpeedTorqueDisplay();
_hasLoadedParameterConfigFromPlc = true; _hasLoadedParameterConfigFromPlc = true;
_parameterRetryTimer.Stop(); _parameterRetryTimer.Stop();
ParameterStatusText = "通信读取成功"; ParameterStatusText = "通信读取成功";
@@ -1850,8 +1821,8 @@ public sealed class MainWindowViewModel : ObservableObject
_parameterConfig = config; _parameterConfig = config;
SaveParameterConfig(); SaveParameterConfig();
UpdateParameterSummaries(); UpdateParameterSummaries();
UpdateDisplacementDisplay(_isDisplacementRunning ? "状态:测试中" : _finalDisplacement.HasValue ? "状态:已停止" : "状态:待启动"); UpdateDisplacementDisplay();
UpdateSpeedTorqueDisplay(_isSpeedTorqueRunning ? "状态:测试中" : _finalSpeed.HasValue ? "状态:已停止" : "状态:待启动"); UpdateSpeedTorqueDisplay();
await AutoStopIfSetpointReachedAsync(); await AutoStopIfSetpointReachedAsync();
await AutoStopIfSpeedTorqueProtectionReachedAsync(); await AutoStopIfSpeedTorqueProtectionReachedAsync();
_hasLoadedParameterConfigFromPlc = true; _hasLoadedParameterConfigFromPlc = true;
@@ -2055,7 +2026,7 @@ public sealed class MainWindowViewModel : ObservableObject
return; return;
} }
await MoveSpeedTorqueDisplacementAsync("状态:前进"); await MoveSpeedTorqueDisplacementAsync();
} }
private async Task BackwardSpeedTorqueAsync() private async Task BackwardSpeedTorqueAsync()
@@ -2065,7 +2036,7 @@ public sealed class MainWindowViewModel : ObservableObject
return; return;
} }
await MoveSpeedTorqueDisplacementAsync("状态:后退"); await MoveSpeedTorqueDisplacementAsync();
} }
private async Task TriggerVentValveAsync() private async Task TriggerVentValveAsync()
@@ -2085,7 +2056,7 @@ public sealed class MainWindowViewModel : ObservableObject
if (!TryReadNonNegative(input, fieldName, out double value, out string error)) if (!TryReadNonNegative(input, fieldName, out double value, out string error))
{ {
SetTestPageInputStatus(parameter, error); SetTestPageInputStatus(error);
return; return;
} }
@@ -2102,7 +2073,7 @@ public sealed class MainWindowViewModel : ObservableObject
if (!TryReadNonNegative(input, fieldName, out double value, out string error) if (!TryReadNonNegative(input, fieldName, out double value, out string error)
|| !CanScaleTenthsToPlc(value, fieldName, out error)) || !CanScaleTenthsToPlc(value, fieldName, out error))
{ {
SetTestPageInputStatus(parameter, error); SetTestPageInputStatus(error);
return; return;
} }
@@ -2126,7 +2097,7 @@ public sealed class MainWindowViewModel : ObservableObject
} }
catch (Exception ex) catch (Exception ex)
{ {
SetTestPageInputStatus(parameter, $"{fieldName}自动写入 D{registerAddress} 失败:{ex.Message}"); SetTestPageInputStatus($"{fieldName}自动写入 D{registerAddress} 失败:{ex.Message}");
Log.Error(ex, "{FieldName}自动写入失败D{RegisterAddress}={Value}", fieldName, registerAddress, value); Log.Error(ex, "{FieldName}自动写入失败D{RegisterAddress}={Value}", fieldName, registerAddress, value);
} }
finally finally
@@ -2149,7 +2120,7 @@ public sealed class MainWindowViewModel : ObservableObject
} }
catch (Exception ex) catch (Exception ex)
{ {
SetTestPageInputStatus(parameter, $"{fieldName}自动写入 D{registerAddress} 失败:{ex.Message}"); SetTestPageInputStatus($"{fieldName}自动写入 D{registerAddress} 失败:{ex.Message}");
Log.Error(ex, "{FieldName}自动写入失败D{RegisterAddress}={Value}", fieldName, registerAddress, value); Log.Error(ex, "{FieldName}自动写入失败D{RegisterAddress}={Value}", fieldName, registerAddress, value);
} }
finally finally
@@ -2176,7 +2147,7 @@ public sealed class MainWindowViewModel : ObservableObject
UpdateTorqueCurveStatus(); UpdateTorqueCurveStatus();
} }
SetTestPageInputStatus(parameter, $"{fieldName}已自动写入并回读确认 D{registerAddress}={FormatConfigNumber(confirmedValue)}"); SetTestPageInputStatus($"{fieldName}已自动写入并回读确认 D{registerAddress}={FormatConfigNumber(confirmedValue)}");
Log.Information("{FieldName}自动写入并回读成功D{RegisterAddress}={Value}", fieldName, registerAddress, confirmedValue); Log.Information("{FieldName}自动写入并回读成功D{RegisterAddress}={Value}", fieldName, registerAddress, confirmedValue);
if (parameter is TestPageInputParameter.AxialPullForceSetpoint or TestPageInputParameter.AxialJumpForceSetpoint) if (parameter is TestPageInputParameter.AxialPullForceSetpoint or TestPageInputParameter.AxialJumpForceSetpoint)
@@ -2235,24 +2206,17 @@ public sealed class MainWindowViewModel : ObservableObject
} }
} }
private void SetTestPageInputStatus(TestPageInputParameter parameter, string message) private void SetTestPageInputStatus(string message)
{ {
ParameterStatusText = message; ParameterStatusText = message;
if (parameter == TestPageInputParameter.NoLoadSpeedSetting)
{
NoLoadSpeedStatusText = $"状态:{message}";
}
else
{
StatusText = message; StatusText = message;
} }
}
private async Task SaveNoLoadSpeedSettingAsync() private async Task SaveNoLoadSpeedSettingAsync()
{ {
if (!TryReadNonNegative(NoLoadSpeedSettingInput, "空载转速设置", out double setting, out string error)) if (!TryReadNonNegative(NoLoadSpeedSettingInput, "空载转速设置", out double setting, out string error))
{ {
NoLoadSpeedStatusText = $"状态:{error}"; StatusText = error;
Log.Warning("空载转速设置被阻止:{ValidationError}", error); Log.Warning("空载转速设置被阻止:{ValidationError}", error);
return; return;
} }
@@ -2268,20 +2232,18 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
if (_activeNoLoadSpeedRun is not null) if (_activeNoLoadSpeedRun is not null)
{ {
NoLoadSpeedStatusText = "状态:空载转速正在记录,请稍候"; StatusText = "空载转速正在记录,请稍候";
return; return;
} }
if (!await PulsePlcAsync(NoLoadSpeedRecordCoil, "记录空载转速")) if (!await PulsePlcAsync(NoLoadSpeedRecordCoil, "记录空载转速"))
{ {
NoLoadSpeedStatusText = "状态:记录指令发送失败";
return; return;
} }
PrepareSessionForNewRun(); PrepareSessionForNewRun();
_activeNoLoadSpeedRun = CreateTestRun("空载转速测试"); _activeNoLoadSpeedRun = CreateTestRun("空载转速测试");
_noLoadCaptureDeadline = DateTime.Now.Add(NoLoadCaptureDuration); _noLoadCaptureDeadline = DateTime.Now.Add(NoLoadCaptureDuration);
NoLoadSpeedStatusText = $"状态:已触发 M{NoLoadSpeedRecordCoil},正在完整记录 PLC 更新";
UpdateDataCaptureStatus(); UpdateDataCaptureStatus();
} }
@@ -2289,7 +2251,7 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
if (_isSpeedTorqueRunning) if (_isSpeedTorqueRunning)
{ {
UpdateSpeedTorqueDisplay("状态:测试已在运行"); UpdateSpeedTorqueDisplay();
return; return;
} }
@@ -2300,7 +2262,7 @@ public sealed class MainWindowViewModel : ObservableObject
if (!TryGetRealtimeSpeed(out _) || !TryGetRealtimeTorque(out _)) if (!TryGetRealtimeSpeed(out _) || !TryGetRealtimeTorque(out _))
{ {
UpdateSpeedTorqueDisplay("状态:读数无效"); UpdateSpeedTorqueDisplay();
return; return;
} }
@@ -2315,7 +2277,7 @@ public sealed class MainWindowViewModel : ObservableObject
ClearTorqueSamples(); ClearTorqueSamples();
AppendTorqueSample(GetScaledTorque(), _speedTorqueStartedAt.Value); AppendTorqueSample(GetScaledTorque(), _speedTorqueStartedAt.Value);
_maxSpeedTorqueDisplacement = Math.Max(_maxSpeedTorqueDisplacement, Math.Abs(_speedTorqueDisplacement)); _maxSpeedTorqueDisplacement = Math.Max(_maxSpeedTorqueDisplacement, Math.Abs(_speedTorqueDisplacement));
UpdateSpeedTorqueDisplay("状态:测试中"); UpdateSpeedTorqueDisplay();
Log.Information("转速/扭矩测试已启动,起始转速 {Speed},起始扭矩 {Torque},起始位移 {Displacement}", _realtimeSpeed, GetScaledTorque(), _speedTorqueDisplacement); Log.Information("转速/扭矩测试已启动,起始转速 {Speed},起始扭矩 {Torque},起始位移 {Displacement}", _realtimeSpeed, GetScaledTorque(), _speedTorqueDisplacement);
await AutoStopIfSpeedTorqueProtectionReachedAsync(); await AutoStopIfSpeedTorqueProtectionReachedAsync();
} }
@@ -2334,7 +2296,7 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
_isSpeedTorqueResetting = true; _isSpeedTorqueResetting = true;
SpeedTorqueResetButtonText = "复位中"; SpeedTorqueResetButtonText = "复位中";
UpdateSpeedTorqueDisplay("状态:复位中"); UpdateSpeedTorqueDisplay();
try try
{ {
@@ -2349,7 +2311,7 @@ public sealed class MainWindowViewModel : ObservableObject
"转速/扭矩复位", "转速/扭矩复位",
UpdateSpeedTorqueResetState)) UpdateSpeedTorqueResetState))
{ {
UpdateSpeedTorqueDisplay("状态:复位完成未确认"); UpdateSpeedTorqueDisplay();
return; return;
} }
@@ -2367,7 +2329,7 @@ public sealed class MainWindowViewModel : ObservableObject
_speedTorqueStartedAt = null; _speedTorqueStartedAt = null;
_hasShownSpeedTorqueEndWarnings = false; _hasShownSpeedTorqueEndWarnings = false;
ClearTorqueSamples(); ClearTorqueSamples();
UpdateSpeedTorqueDisplay("状态:已复位"); UpdateSpeedTorqueDisplay();
Log.Information("转速/扭矩复位完成,零点 {ZeroPosition}", _speedTorqueZero); Log.Information("转速/扭矩复位完成,零点 {ZeroPosition}", _speedTorqueZero);
} }
finally finally
@@ -2384,7 +2346,7 @@ public sealed class MainWindowViewModel : ObservableObject
return; return;
} }
await MoveAxialDisplacementAsync("状态:前进"); await MoveAxialDisplacementAsync();
} }
private async Task BackwardDisplacementAsync() private async Task BackwardDisplacementAsync()
@@ -2394,14 +2356,14 @@ public sealed class MainWindowViewModel : ObservableObject
return; return;
} }
await MoveAxialDisplacementAsync("状态:后退"); await MoveAxialDisplacementAsync();
} }
private async Task StartDisplacementAsync() private async Task StartDisplacementAsync()
{ {
if (_isDisplacementRunning) if (_isDisplacementRunning)
{ {
UpdateDisplacementDisplay("状态:测试已在运行"); UpdateDisplacementDisplay();
return; return;
} }
@@ -2412,7 +2374,7 @@ public sealed class MainWindowViewModel : ObservableObject
if (!TryGetDialValue(out _) || !TryGetAxialForceValue(out _)) if (!TryGetDialValue(out _) || !TryGetAxialForceValue(out _))
{ {
UpdateDisplacementDisplay("状态:读数无效"); UpdateDisplacementDisplay();
return; return;
} }
@@ -2422,7 +2384,7 @@ public sealed class MainWindowViewModel : ObservableObject
_finalDisplacement = null; _finalDisplacement = null;
_finalAxialForce = null; _finalAxialForce = null;
_maxDisplacement = Math.Abs(_relativeDisplacement); _maxDisplacement = Math.Abs(_relativeDisplacement);
UpdateDisplacementDisplay("状态:测试中"); UpdateDisplacementDisplay();
Log.Information("轴向测试已启动,起始位移 {Displacement},起始轴向力 {AxialForce}", _relativeDisplacement, GetScaledAxialForce()); Log.Information("轴向测试已启动,起始位移 {Displacement},起始轴向力 {AxialForce}", _relativeDisplacement, GetScaledAxialForce());
await AutoStopIfSetpointReachedAsync(); await AutoStopIfSetpointReachedAsync();
} }
@@ -2441,7 +2403,7 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
_isDisplacementResetting = true; _isDisplacementResetting = true;
DisplacementResetButtonText = "复位中"; DisplacementResetButtonText = "复位中";
UpdateDisplacementDisplay("状态:复位中"); UpdateDisplacementDisplay();
try try
{ {
@@ -2456,7 +2418,7 @@ public sealed class MainWindowViewModel : ObservableObject
"轴向复位", "轴向复位",
UpdateAxialResetState)) UpdateAxialResetState))
{ {
UpdateDisplacementDisplay("状态:复位完成未确认"); UpdateDisplacementDisplay();
return; return;
} }
@@ -2464,7 +2426,7 @@ public sealed class MainWindowViewModel : ObservableObject
PersistCurrentPayloadSnapshot("轴向复位前"); PersistCurrentPayloadSnapshot("轴向复位前");
if (!TryGetDialValue(out double currentDial)) if (!TryGetDialValue(out double currentDial))
{ {
UpdateDisplacementDisplay("状态:读数无效"); UpdateDisplacementDisplay();
return; return;
} }
@@ -2475,7 +2437,7 @@ public sealed class MainWindowViewModel : ObservableObject
_finalAxialForce = null; _finalAxialForce = null;
await UpdateAxialForceFromInputAsync(); await UpdateAxialForceFromInputAsync();
_isDisplacementRunning = false; _isDisplacementRunning = false;
UpdateDisplacementDisplay("状态:已复位"); UpdateDisplacementDisplay();
Log.Information("轴向复位完成,千分表零点 {DialZero}", _dialZero); Log.Information("轴向复位完成,千分表零点 {DialZero}", _dialZero);
} }
finally finally
@@ -2547,7 +2509,7 @@ public sealed class MainWindowViewModel : ObservableObject
return false; return false;
} }
await MoveAxialDisplacementAsync($"状态:{actionName.Replace("", string.Empty)}"); await MoveAxialDisplacementAsync();
return true; return true;
} }
@@ -2558,7 +2520,7 @@ public sealed class MainWindowViewModel : ObservableObject
return false; return false;
} }
await MoveSpeedTorqueDisplacementAsync($"状态:{actionName.Replace("/", string.Empty)}"); await MoveSpeedTorqueDisplacementAsync();
return true; return true;
} }
@@ -2578,11 +2540,11 @@ public sealed class MainWindowViewModel : ObservableObject
} }
} }
private async Task MoveSpeedTorqueDisplacementAsync(string status) private async Task MoveSpeedTorqueDisplacementAsync()
{ {
if (_parameterConfig.SpeedTorqueManualDisplacement <= 0) if (_parameterConfig.SpeedTorqueManualDisplacement <= 0)
{ {
UpdateSpeedTorqueDisplay("状态:手动位移为 0"); UpdateSpeedTorqueDisplay();
return; return;
} }
@@ -2592,15 +2554,15 @@ public sealed class MainWindowViewModel : ObservableObject
_finalSpeedTorqueDisplacement = null; _finalSpeedTorqueDisplacement = null;
} }
UpdateSpeedTorqueDisplay(_isSpeedTorqueRunning ? "状态:测试中" : status); UpdateSpeedTorqueDisplay();
await AutoStopIfSpeedTorqueProtectionReachedAsync(); await AutoStopIfSpeedTorqueProtectionReachedAsync();
} }
private async Task MoveAxialDisplacementAsync(string status) private async Task MoveAxialDisplacementAsync()
{ {
if (_parameterConfig.AxialManualDisplacement <= 0) if (_parameterConfig.AxialManualDisplacement <= 0)
{ {
UpdateDisplacementDisplay("状态:手动位移为 0"); UpdateDisplacementDisplay();
return; return;
} }
@@ -2611,7 +2573,7 @@ public sealed class MainWindowViewModel : ObservableObject
_finalAxialForce = null; _finalAxialForce = null;
} }
UpdateDisplacementDisplay(_isDisplacementRunning ? "状态:测试中" : status); UpdateDisplacementDisplay();
await AutoStopIfSetpointReachedAsync(); await AutoStopIfSetpointReachedAsync();
} }
@@ -2623,7 +2585,7 @@ public sealed class MainWindowViewModel : ObservableObject
} }
_axialForce = force; _axialForce = force;
UpdateDisplacementDisplay(_isDisplacementRunning ? "状态:测试中" : _finalDisplacement.HasValue ? "状态:已停止" : "状态:待启动"); UpdateDisplacementDisplay();
await AutoStopIfSetpointReachedAsync(); await AutoStopIfSetpointReachedAsync();
} }
@@ -2677,7 +2639,7 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
if (!_isDisplacementRunning && _finalDisplacement.HasValue) if (!_isDisplacementRunning && _finalDisplacement.HasValue)
{ {
UpdateDisplacementDisplay(status); UpdateDisplacementDisplay();
return; return;
} }
@@ -2686,7 +2648,7 @@ public sealed class MainWindowViewModel : ObservableObject
_finalAxialForce = GetScaledAxialForce(); _finalAxialForce = GetScaledAxialForce();
FinalizeDisplacementRun(status); FinalizeDisplacementRun(status);
PersistCurrentPayloadSnapshot("轴向测试停止"); PersistCurrentPayloadSnapshot("轴向测试停止");
UpdateDisplacementDisplay(status); UpdateDisplacementDisplay();
Log.Information("轴向测试停止:{Status},最终位移 {FinalDisplacement},最终轴向力 {FinalAxialForce}", status, _finalDisplacement, _finalAxialForce); Log.Information("轴向测试停止:{Status},最终位移 {FinalDisplacement},最终轴向力 {FinalAxialForce}", status, _finalDisplacement, _finalAxialForce);
} }
@@ -2715,7 +2677,7 @@ public sealed class MainWindowViewModel : ObservableObject
} }
_realtimeSpeed = speed; _realtimeSpeed = speed;
UpdateSpeedTorqueDisplay(_isSpeedTorqueRunning ? "状态:测试中" : _finalSpeed.HasValue ? "状态:已停止" : "状态:待启动"); UpdateSpeedTorqueDisplay();
} }
private async Task UpdateRealtimeTorqueFromInputAsync() private async Task UpdateRealtimeTorqueFromInputAsync()
@@ -2726,7 +2688,7 @@ public sealed class MainWindowViewModel : ObservableObject
} }
_realtimeTorque = torque; _realtimeTorque = torque;
UpdateSpeedTorqueDisplay(_isSpeedTorqueRunning ? "状态:测试中" : _finalTorque.HasValue ? "状态:已停止" : "状态:待启动"); UpdateSpeedTorqueDisplay();
await AutoStopIfSpeedTorqueProtectionReachedAsync(); await AutoStopIfSpeedTorqueProtectionReachedAsync();
} }
@@ -2772,7 +2734,7 @@ public sealed class MainWindowViewModel : ObservableObject
{ {
if (!TryGetRealtimeSpeed(out double speed) || !TryGetRealtimeTorque(out double torque)) if (!TryGetRealtimeSpeed(out double speed) || !TryGetRealtimeTorque(out double torque))
{ {
UpdateSpeedTorqueDisplay("状态:读数无效"); UpdateSpeedTorqueDisplay();
return; return;
} }
@@ -2784,7 +2746,7 @@ public sealed class MainWindowViewModel : ObservableObject
_finalSpeedTorqueDisplacement = _speedTorqueDisplacement; _finalSpeedTorqueDisplacement = _speedTorqueDisplacement;
FinalizeSpeedTorqueRun(status); FinalizeSpeedTorqueRun(status);
PersistCurrentPayloadSnapshot("转速/扭矩测试停止"); PersistCurrentPayloadSnapshot("转速/扭矩测试停止");
UpdateSpeedTorqueDisplay(status); UpdateSpeedTorqueDisplay();
Log.Information("转速/扭矩测试停止:{Status},最终位移 {FinalDisplacement},最终转速 {FinalSpeed},最终扭矩 {FinalTorque}", status, _finalSpeedTorqueDisplacement, _finalSpeed, _finalTorque); Log.Information("转速/扭矩测试停止:{Status},最终位移 {FinalDisplacement},最终转速 {FinalSpeed},最终扭矩 {FinalTorque}", status, _finalSpeedTorqueDisplacement, _finalSpeed, _finalTorque);
await ShowSpeedTorqueEndWarningsAsync(); await ShowSpeedTorqueEndWarningsAsync();
} }
@@ -2867,60 +2829,20 @@ public sealed class MainWindowViewModel : ObservableObject
private void UpdateAxialResetState(bool enabled, bool done) private void UpdateAxialResetState(bool enabled, bool done)
{ {
_isAxialResetEnabled = enabled;
_isAxialResetDone = done;
DisplacementResetButtonText = _isDisplacementResetting || enabled ? "复位中" : "复位"; DisplacementResetButtonText = _isDisplacementResetting || enabled ? "复位中" : "复位";
} }
private void UpdateSpeedTorqueResetState(bool enabled, bool done) private void UpdateSpeedTorqueResetState(bool enabled, bool done)
{ {
_isSpeedTorqueResetEnabled = enabled;
_isSpeedTorqueResetDone = done;
SpeedTorqueResetButtonText = _isSpeedTorqueResetting || enabled ? "复位中" : "复位"; SpeedTorqueResetButtonText = _isSpeedTorqueResetting || enabled ? "复位中" : "复位";
} }
private string ResolveDisplacementStatus(string fallback)
{
if (_isDisplacementResetting || _isAxialResetEnabled)
{
return "状态:复位中";
}
if (!_isDisplacementRunning && _isAxialResetDone && IsResetOrIdleStatus(fallback))
{
return "状态:已复位";
}
return fallback;
}
private string ResolveSpeedTorqueStatus(string fallback)
{
if (_isSpeedTorqueResetting || _isSpeedTorqueResetEnabled)
{
return "状态:复位中";
}
if (!_isSpeedTorqueRunning && _isSpeedTorqueResetDone && IsResetOrIdleStatus(fallback))
{
return "状态:已复位";
}
return fallback;
}
private static bool IsResetOrIdleStatus(string status)
{
return status.Contains("复位", StringComparison.Ordinal)
|| status.Contains("待启动", StringComparison.Ordinal);
}
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;
} }
private void UpdateDisplacementDisplay(string status) private void UpdateDisplacementDisplay()
{ {
RelativeDisplacementText = $"{FormatDisplacement(_relativeDisplacement)} mm"; RelativeDisplacementText = $"{FormatDisplacement(_relativeDisplacement)} mm";
AxialAxisPositionText = $"{FormatDisplacement(_axialAxisPosition)} mm"; AxialAxisPositionText = $"{FormatDisplacement(_axialAxisPosition)} mm";
@@ -2930,10 +2852,9 @@ public sealed class MainWindowViewModel : ObservableObject
FinalDisplacementText = _finalDisplacement.HasValue ? $"{FormatDisplacement(_finalDisplacement.Value)} mm" : "--"; FinalDisplacementText = _finalDisplacement.HasValue ? $"{FormatDisplacement(_finalDisplacement.Value)} mm" : "--";
AxialForceText = $"{FormatForce(GetScaledAxialForce())} N"; AxialForceText = $"{FormatForce(GetScaledAxialForce())} N";
FinalAxialForceText = _finalAxialForce.HasValue ? $"{FormatForce(_finalAxialForce.Value)} N" : "--"; FinalAxialForceText = _finalAxialForce.HasValue ? $"{FormatForce(_finalAxialForce.Value)} N" : "--";
DisplacementStatusText = status;
} }
private void UpdateSpeedTorqueDisplay(string status) private void UpdateSpeedTorqueDisplay()
{ {
RealtimeSpeedText = $"{FormatSpeed(_realtimeSpeed)} r/min"; RealtimeSpeedText = $"{FormatSpeed(_realtimeSpeed)} r/min";
RealtimeTorqueText = $"{FormatTorque(GetScaledTorque())} {TorqueUnit}"; RealtimeTorqueText = $"{FormatTorque(GetScaledTorque())} {TorqueUnit}";
@@ -2946,7 +2867,6 @@ public sealed class MainWindowViewModel : ObservableObject
SpeedTorquePeakTorqueText = $"{FormatTorque(_speedTorquePeakTorque)} {TorqueUnit}"; SpeedTorquePeakTorqueText = $"{FormatTorque(_speedTorquePeakTorque)} {TorqueUnit}";
SpeedTorqueMaxDisplacementText = $"{FormatDisplacement(_maxSpeedTorqueDisplacement)} mm"; SpeedTorqueMaxDisplacementText = $"{FormatDisplacement(_maxSpeedTorqueDisplacement)} mm";
SpeedTorqueFinalDisplacementText = _finalSpeedTorqueDisplacement.HasValue ? $"{FormatDisplacement(_finalSpeedTorqueDisplacement.Value)} mm" : "--"; SpeedTorqueFinalDisplacementText = _finalSpeedTorqueDisplacement.HasValue ? $"{FormatDisplacement(_finalSpeedTorqueDisplacement.Value)} mm" : "--";
SpeedTorqueStatusText = status;
UpdateTorqueCurveStatus(); UpdateTorqueCurveStatus();
} }
@@ -3260,7 +3180,6 @@ public sealed class MainWindowViewModel : ObservableObject
_completedRuns.Add(_activeNoLoadSpeedRun); _completedRuns.Add(_activeNoLoadSpeedRun);
_activeNoLoadSpeedRun = null; _activeNoLoadSpeedRun = null;
_noLoadCaptureDeadline = null; _noLoadCaptureDeadline = null;
NoLoadSpeedStatusText = "状态:空载转速完整记录已保存";
PersistCurrentPayloadSnapshot("空载转速记录完成"); PersistCurrentPayloadSnapshot("空载转速记录完成");
UpdateDataCaptureStatus(); UpdateDataCaptureStatus();
} }