This commit is contained in:
GukSang.Jin
2026-05-22 15:04:08 +08:00
parent c76c3525c8
commit ff49f9f8e2
3 changed files with 28 additions and 45 deletions

View File

@@ -15,7 +15,6 @@ public sealed class CValueCalibrationViewModel : PageViewModel
private const ushort PressureDifferenceRegister = 284; private const ushort PressureDifferenceRegister = 284;
private const ushort CalibrationOxygenRegister = 286; private const ushort CalibrationOxygenRegister = 286;
private const ushort CValueRegister = 308; private const ushort CValueRegister = 308;
private const ushort MethaneFlowRegister = 34;
private const double OxygenMinimum = 0; private const double OxygenMinimum = 0;
private const double OxygenMaximum = 30; private const double OxygenMaximum = 30;
private const double TemperatureMinimum = 200; private const double TemperatureMinimum = 200;
@@ -24,8 +23,6 @@ public sealed class CValueCalibrationViewModel : PageViewModel
private const double PressureDifferenceMaximum = 5000; private const double PressureDifferenceMaximum = 5000;
private const double CValueMinimum = 0; private const double CValueMinimum = 0;
private const double CValueMaximum = 1000; private const double CValueMaximum = 1000;
private const double MethaneFlowMinimum = 0;
private const double MethaneFlowMaximum = 20;
private const ushort CirculatingWaterCoil = 49; private const ushort CirculatingWaterCoil = 49;
private const ushort SamplingPumpCoil = 50; private const ushort SamplingPumpCoil = 50;
private const ushort IgniterCoil = 53; private const ushort IgniterCoil = 53;
@@ -57,7 +54,6 @@ public sealed class CValueCalibrationViewModel : PageViewModel
private string _pressureDifferenceText = ""; private string _pressureDifferenceText = "";
private string _calibrationOxygenText = ""; private string _calibrationOxygenText = "";
private string _cValueText = ""; private string _cValueText = "";
private string _methaneFlowText = "";
private string _lastAction = "待机"; private string _lastAction = "待机";
public CValueCalibrationViewModel( public CValueCalibrationViewModel(
@@ -142,12 +138,6 @@ public sealed class CValueCalibrationViewModel : PageViewModel
private set => SetProperty(ref _cValueText, value); private set => SetProperty(ref _cValueText, value);
} }
public string MethaneFlowText
{
get => _methaneFlowText;
private set => SetProperty(ref _methaneFlowText, value);
}
public string LastAction public string LastAction
{ {
get => _lastAction; get => _lastAction;
@@ -204,12 +194,6 @@ public sealed class CValueCalibrationViewModel : PageViewModel
CValueMinimum, CValueMinimum,
CValueMaximum, CValueMaximum,
"0.00"); "0.00");
MethaneFlowText = ReadRangedFloatText(
"MethaneFlow",
MethaneFlowRegister,
MethaneFlowMinimum,
MethaneFlowMaximum,
"0.00");
RefreshActionStates(); RefreshActionStates();
} }

View File

@@ -9,10 +9,13 @@ namespace ConeCalorimeter.ViewModels;
public sealed class ConeRadiationSettingsViewModel : PageViewModel public sealed class ConeRadiationSettingsViewModel : PageViewModel
{ {
private const ushort CurrentHeatFluxRegister = 410; private const ushort CurrentHeatFluxRegister = 32;
private const ushort TargetTemperatureRegister = 400; private const ushort TargetTemperatureRegister = 400;
private const ushort HeatTransferRegister = 418; private const ushort HeatTransferRegister = 418;
private const double TargetTemperatureScale = 10; private const double TargetTemperatureScale = 10;
private const double CurrentTemperatureMinimum = 10;
private const double CurrentTemperatureMaximum = 1200;
private const double CurrentTemperatureMaximumDropPerRefresh = 80;
private const double CurrentHeatFluxMinimum = 0; private const double CurrentHeatFluxMinimum = 0;
private const double CurrentHeatFluxMaximum = 1000; private const double CurrentHeatFluxMaximum = 1000;
private const double HeatTransferInputMinimum = 0; private const double HeatTransferInputMinimum = 0;
@@ -40,6 +43,7 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
private bool _circulatingWaterActive; private bool _circulatingWaterActive;
private bool _heatingActive; private bool _heatingActive;
private bool _isEditingConeParameters; private bool _isEditingConeParameters;
private double? _lastStableCurrentTemperature;
private DateTime _parameterRefreshBlockedUntil = DateTime.MinValue; private DateTime _parameterRefreshBlockedUntil = DateTime.MinValue;
public ConeRadiationSettingsViewModel( public ConeRadiationSettingsViewModel(
@@ -187,7 +191,8 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
CurrentHeatFluxMinimum, CurrentHeatFluxMinimum,
CurrentHeatFluxMaximum, CurrentHeatFluxMaximum,
"0.00", "0.00",
out var currentHeatFluxText)) out var currentHeatFluxText,
out _))
{ {
CurrentHeatFluxText = currentHeatFluxText; CurrentHeatFluxText = currentHeatFluxText;
} }
@@ -201,7 +206,8 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
HeatTransferReadMinimum, HeatTransferReadMinimum,
HeatTransferMaximum, HeatTransferMaximum,
"0.##", "0.##",
out var heatTransferText)) out var heatTransferText,
out _))
{ {
HeatTransferText = heatTransferText; HeatTransferText = heatTransferText;
} }
@@ -217,20 +223,12 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
private void UpdateCurrentReadings(RealtimeSnapshot snapshot) private void UpdateCurrentReadings(RealtimeSnapshot snapshot)
{ {
if (double.IsFinite(snapshot.ConeTemperature)) if (IsStableCurrentTemperature(snapshot.ConeTemperature))
{ {
_lastStableCurrentTemperature = snapshot.ConeTemperature;
CurrentTemperatureText = NormalizeDisplayValue(snapshot.ConeTemperature) CurrentTemperatureText = NormalizeDisplayValue(snapshot.ConeTemperature)
.ToString("0.0", CultureInfo.InvariantCulture); .ToString("0.0", CultureInfo.InvariantCulture);
} }
if (double.IsFinite(snapshot.Irradiance))
{
if (string.IsNullOrWhiteSpace(CurrentHeatFluxText))
{
CurrentHeatFluxText = NormalizeDisplayValue(snapshot.Irradiance)
.ToString("0.00", CultureInfo.InvariantCulture);
}
}
} }
private bool TryReadRangedFloatText( private bool TryReadRangedFloatText(
@@ -239,26 +237,40 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel
double minimum, double minimum,
double maximum, double maximum,
string format, string format,
out string text) out string text,
out double value)
{ {
text = string.Empty; text = string.Empty;
value = double.NaN;
if (!_tcpDeviceConnectionService.TryReadFloatValues(registerAddress, out var result)) if (!_tcpDeviceConnectionService.TryReadFloatValues(registerAddress, out var result))
{ {
return false; return false;
} }
if (!ModbusFloatSelector.TrySelectRangedFloat(result, minimum, maximum, out var byteOrder, out var value, out var matchCount)) if (!ModbusFloatSelector.TrySelectRangedFloat(result, minimum, maximum, out var byteOrder, out var selectedValue, out var matchCount))
{ {
LogFloatDiagnostic(label, registerAddress, result, null, matchCount); LogFloatDiagnostic(label, registerAddress, result, null, matchCount);
return false; return false;
} }
value = selectedValue;
LogFloatDiagnostic(label, registerAddress, result, byteOrder, matchCount); LogFloatDiagnostic(label, registerAddress, result, byteOrder, matchCount);
text = NormalizeDisplayValue(value).ToString(format, CultureInfo.InvariantCulture); text = NormalizeDisplayValue(value).ToString(format, CultureInfo.InvariantCulture);
return true; return true;
} }
private bool IsStableCurrentTemperature(double value)
{
if (!ModbusFloatSelector.IsInRange(value, CurrentTemperatureMinimum, CurrentTemperatureMaximum))
{
return false;
}
return !_lastStableCurrentTemperature.HasValue
|| value >= _lastStableCurrentTemperature.Value - CurrentTemperatureMaximumDropPerRefresh;
}
private string ReadScaledInt16Text(ushort registerAddress, double scale, string format) private string ReadScaledInt16Text(ushort registerAddress, double scale, string format)
{ {
return _tcpDeviceConnectionService.TryReadInt16(registerAddress, out var rawValue) return _tcpDeviceConnectionService.TryReadInt16(registerAddress, out var rawValue)

View File

@@ -202,23 +202,10 @@
Style="{StaticResource DataLabelStyle}" /> Style="{StaticResource DataLabelStyle}" />
<TextBlock Grid.Row="2" <TextBlock Grid.Row="2"
Text="甲烷流量:"
Style="{StaticResource DataLabelStyle}" />
<TextBlock Grid.Row="2"
Grid.Column="1"
Text="{Binding MethaneFlowText}"
Style="{StaticResource DataValueStyle}" />
<TextBlock Grid.Row="2"
Grid.Column="2"
Text="L/Min"
Style="{StaticResource DataLabelStyle}" />
<TextBlock Grid.Row="2"
Grid.Column="5"
Text="C:" Text="C:"
Style="{StaticResource DataLabelStyle}" /> Style="{StaticResource DataLabelStyle}" />
<TextBlock Grid.Row="2" <TextBlock Grid.Row="2"
Grid.Column="6" Grid.Column="1"
Text="{Binding CValueText}" Text="{Binding CValueText}"
Style="{StaticResource DataValueStyle}" /> Style="{StaticResource DataValueStyle}" />
</Grid> </Grid>