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

View File

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

View File

@@ -202,23 +202,10 @@
Style="{StaticResource DataLabelStyle}" />
<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:"
Style="{StaticResource DataLabelStyle}" />
<TextBlock Grid.Row="2"
Grid.Column="6"
Grid.Column="1"
Text="{Binding CValueText}"
Style="{StaticResource DataValueStyle}" />
</Grid>