更新
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user