From 991d2a0b675507603e8260b86f5386d4f8e1e4ed Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Fri, 22 May 2026 11:35:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B020260522?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConeRadiationSettingsViewModel.cs | 26 +++++++++++++------ ConeCalorimeter/ViewModels/MainViewModel.cs | 2 +- .../ViewModels/TestPageViewModel.cs | 9 +++++-- ConeCalorimeter/Views/TestPageView.xaml | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ConeCalorimeter/ViewModels/ConeRadiationSettingsViewModel.cs b/ConeCalorimeter/ViewModels/ConeRadiationSettingsViewModel.cs index 55ffee2..d1ab127 100644 --- a/ConeCalorimeter/ViewModels/ConeRadiationSettingsViewModel.cs +++ b/ConeCalorimeter/ViewModels/ConeRadiationSettingsViewModel.cs @@ -9,9 +9,10 @@ namespace ConeCalorimeter.ViewModels; public sealed class ConeRadiationSettingsViewModel : PageViewModel { - private const ushort CurrentHeatFluxRegister = 32; + private const ushort CurrentHeatFluxRegister = 410; private const ushort TargetTemperatureRegister = 400; private const ushort HeatTransferRegister = 418; + private const double TargetTemperatureScale = 10; private const double CurrentHeatFluxMinimum = 0; private const double CurrentHeatFluxMaximum = 1000; private const double HeatTransferInputMinimum = 0; @@ -193,7 +194,7 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel if (CanRefreshConeParameters()) { - TargetTemperatureText = ReadInt16Text(TargetTemperatureRegister); + TargetTemperatureText = ReadScaledInt16Text(TargetTemperatureRegister, TargetTemperatureScale, "0.#"); if (TryReadRangedFloatText( "ConeHeatTransfer", HeatTransferRegister, @@ -258,25 +259,34 @@ public sealed class ConeRadiationSettingsViewModel : PageViewModel return true; } - private string ReadInt16Text(ushort registerAddress) + private string ReadScaledInt16Text(ushort registerAddress, double scale, string format) { - return _tcpDeviceConnectionService.TryReadInt16(registerAddress, out var value) - ? value.ToString(CultureInfo.InvariantCulture) + return _tcpDeviceConnectionService.TryReadInt16(registerAddress, out var rawValue) + ? (rawValue / scale).ToString(format, CultureInfo.InvariantCulture) : string.Empty; } private bool WriteTargetTemperature() { - if (!short.TryParse(TargetTemperatureText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value)) + if (!double.TryParse(TargetTemperatureText, NumberStyles.Float, CultureInfo.InvariantCulture, out var value) + || !double.IsFinite(value)) { LastAction = "辐射温度输入无效"; Debug.WriteLine($"Invalid cone radiation target temperature: {TargetTemperatureText}"); return false; } - if (_tcpDeviceConnectionService.TryWriteInt16(TargetTemperatureRegister, value)) + var scaledValue = Math.Round(value * TargetTemperatureScale, MidpointRounding.AwayFromZero); + if (scaledValue is < short.MinValue or > short.MaxValue) { - TargetTemperatureText = value.ToString(CultureInfo.InvariantCulture); + LastAction = "辐射温度输入超出范围"; + Debug.WriteLine($"Cone radiation target temperature out of range: {TargetTemperatureText}"); + return false; + } + + if (_tcpDeviceConnectionService.TryWriteInt16(TargetTemperatureRegister, (short)scaledValue)) + { + TargetTemperatureText = value.ToString("0.#", CultureInfo.InvariantCulture); return true; } diff --git a/ConeCalorimeter/ViewModels/MainViewModel.cs b/ConeCalorimeter/ViewModels/MainViewModel.cs index e95277c..71f19f0 100644 --- a/ConeCalorimeter/ViewModels/MainViewModel.cs +++ b/ConeCalorimeter/ViewModels/MainViewModel.cs @@ -142,7 +142,7 @@ public sealed class MainViewModel : ObservableObject + "3.温度恒定后,打开隔热板;\n" + " 打开风机;\n\n" + "4.风速恒定后,点击测试;\n\n" - + "5.试样点燃后,点击【点火关】;\n\n" + + "5.点火时点击【点火开】,试样点燃后点击【点火关】;\n\n" + "6.试样完全燃烧后,点击【停止】; 实验结束"); } diff --git a/ConeCalorimeter/ViewModels/TestPageViewModel.cs b/ConeCalorimeter/ViewModels/TestPageViewModel.cs index 0d88a3c..c52bdfe 100644 --- a/ConeCalorimeter/ViewModels/TestPageViewModel.cs +++ b/ConeCalorimeter/ViewModels/TestPageViewModel.cs @@ -15,8 +15,8 @@ namespace ConeCalorimeter.ViewModels; public sealed class TestPageViewModel : PageViewModel { private const string ResetAction = "复位"; - private const ushort ResetCoil = 80; - private const ushort ResetCompleteCoil = 82; + private const ushort ResetCoil = 88; + private const ushort ResetCompleteCoil = 89; private readonly IExperimentDataService _experimentDataService; private readonly ITcpDeviceConnectionService _tcpDeviceConnectionService; @@ -81,6 +81,7 @@ public sealed class TestPageViewModel : PageViewModel new DeviceActionViewModel("测试结束", ExecuteDeviceActionCommand), new DeviceActionViewModel("风机开", ExecuteDeviceActionCommand), new DeviceActionViewModel("风机关", ExecuteDeviceActionCommand), + new DeviceActionViewModel("点火开", ExecuteDeviceActionCommand), new DeviceActionViewModel("点火关", ExecuteDeviceActionCommand), _resetAction ]; @@ -387,8 +388,12 @@ public sealed class TestPageViewModel : PageViewModel case "测试结束": coilAddress = 67; return true; + case "点火开": + coilAddress = 53; + return true; case "点火关": coilAddress = 53; + value = false; return true; case "风机开": coilAddress = 54; diff --git a/ConeCalorimeter/Views/TestPageView.xaml b/ConeCalorimeter/Views/TestPageView.xaml index f67a2f7..5c40155 100644 --- a/ConeCalorimeter/Views/TestPageView.xaml +++ b/ConeCalorimeter/Views/TestPageView.xaml @@ -206,7 +206,7 @@ - +