From 90035eb8dfcd7377135340c3415e77bd79d929b2 Mon Sep 17 00:00:00 2001 From: xyy <544939200@qq.com> Date: Fri, 10 Apr 2026 10:49:10 +0800 Subject: [PATCH] --- Helpers/PlcConfiguration.cs | 12 +++++++++-- Service/ModbusTcpPlcService.cs | 25 ++++++++++++++++++---- ViewModels/PoreDistributionViewModel.cs | 28 ++++++++++++++++++------- appsettings.json | 9 ++++++++ 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/Helpers/PlcConfiguration.cs b/Helpers/PlcConfiguration.cs index 8b2821c..f71f2c6 100644 --- a/Helpers/PlcConfiguration.cs +++ b/Helpers/PlcConfiguration.cs @@ -16,6 +16,14 @@ namespace MembranePoreTester.Communication public ushort PressureRegister { get; set; } // 不再使用,保留兼容 public ushort WetFlowRegister { get; set; } // 湿膜流量寄存器起始地址 public ushort DryFlowRegister { get; set; } // 干膜流量寄存器起始地址 + + + public ushort WetFlowRegister2 { get; set; } // 湿膜流量寄存器起始地址 + public ushort DryFlowRegister2 { get; set; } // 干膜流量寄存器起始地址 + + + public ushort WetFlowRegister3 { get; set; } // 湿膜流量寄存器起始地址 + public ushort DryFlowRegister3 { get; set; } // 干膜流量寄存器起始地址 public double PressureFactor { get; set; } = 1.0; // 压力系数(单位换算) @@ -152,10 +160,10 @@ namespace MembranePoreTester.Communication Task ReadPressureAsync(int stationId); /// 读取湿膜流量(浮点数) - Task ReadWetFlowAsync(); + Task ReadWetFlowAsync(int stationId); /// 读取干膜流量(浮点数) - Task ReadDryFlowAsync(); + Task ReadDryFlowAsync(int stationId); /// 写入线圈(如 M 元件) Task WriteCoilAsync(ushort coilAddress, bool value); diff --git a/Service/ModbusTcpPlcService.cs b/Service/ModbusTcpPlcService.cs index fefd33b..dee66af 100644 --- a/Service/ModbusTcpPlcService.cs +++ b/Service/ModbusTcpPlcService.cs @@ -39,11 +39,28 @@ namespace MembranePoreTester.Communication public async Task ReadPressureAsync() => await ReadFloatAsync(_config.PressureRegister); - public async Task ReadWetFlowAsync() => - await ReadFloatAsync(_config.WetFlowRegister); + public async Task ReadWetFlowAsync(int stationId) + { + ushort startAddress = stationId switch + { + 1 => _config.WetFlowRegister, + 2 => _config.WetFlowRegister2, + 3 => _config.WetFlowRegister3, + }; + return await ReadFloatAsync(startAddress); + } - public async Task ReadDryFlowAsync() => - await ReadFloatAsync(_config.DryFlowRegister); + public async Task ReadDryFlowAsync(int stationId) + { + ushort startAddress = stationId switch + { + 1 => _config.DryFlowRegister, + 2 => _config.DryFlowRegister2, + 3 => _config.DryFlowRegister3, + _ => throw new ArgumentException("Invalid station") + }; + return await ReadFloatAsync(startAddress); + } public async Task WriteCoilAsync(ushort coilAddress, bool value) diff --git a/ViewModels/PoreDistributionViewModel.cs b/ViewModels/PoreDistributionViewModel.cs index 372076e..1fd3b47 100644 --- a/ViewModels/PoreDistributionViewModel.cs +++ b/ViewModels/PoreDistributionViewModel.cs @@ -12,6 +12,7 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; +using System.Net; using System.Windows; using System.Windows.Input; @@ -105,12 +106,12 @@ namespace MembranePoreTester.ViewModels double flow = 0; if (TestMode.Contains("湿膜")) { - float rawFlow = await _plcService.ReadWetFlowAsync(); + float rawFlow = await _plcService.ReadWetFlowAsync(StationId); flow = Math.Round(ConvertFlowByMode(rawFlow), 3); } else { - float rawFlow = await _plcService.ReadDryFlowAsync(); + float rawFlow = await _plcService.ReadDryFlowAsync(StationId); flow = Math.Round(ConvertFlowByMode(rawFlow), 3); } @@ -340,13 +341,24 @@ namespace MembranePoreTester.ViewModels try { float speedRate = 0; + ushort address = 0; switch (StationId) { case 1: - speedRate = await _plcService.ReadFloatAsync(_plcConfig.HPCoeff11); // 使用正确的地址 + address = _plcConfig.HPCoeff11; + speedRate = await _plcService.ReadFloatAsync(address); + SpeedRate1 = speedRate.ToString("F3"); + break; + case 2: + address = _plcConfig.HPCoeff12; + speedRate = await _plcService.ReadFloatAsync(address); + SpeedRate1 = speedRate.ToString("F3"); + break; + case 3: + address = _plcConfig.HPCoeff13; + speedRate = await _plcService.ReadFloatAsync(address); SpeedRate1 = speedRate.ToString("F3"); break; - // case 2,3 可类似添加 } // 如果需要刷新 Record 中的绑定(可选) OnPropertyChanged(nameof(SpeedRate1)); @@ -408,12 +420,12 @@ namespace MembranePoreTester.ViewModels SelectedDataPoint.Pressure = pressure; if (TestMode == "湿膜") { - float rawWet = await _plcService.ReadWetFlowAsync(); + float rawWet = await _plcService.ReadWetFlowAsync(StationId); SelectedDataPoint.WetFlow = ConvertFlowByMode(rawWet); } else { - float rawDry = await _plcService.ReadDryFlowAsync(); + float rawDry = await _plcService.ReadDryFlowAsync(StationId); SelectedDataPoint.DryFlow = ConvertFlowByMode(rawDry); } } @@ -423,12 +435,12 @@ namespace MembranePoreTester.ViewModels var newPoint = new Models.DataPoint { Pressure = pressure }; if (TestMode == "湿膜") { - float rawWet = await _plcService.ReadWetFlowAsync(); + float rawWet = await _plcService.ReadWetFlowAsync(StationId); newPoint.WetFlow = ConvertFlowByMode(rawWet); } else { - float rawDry = await _plcService.ReadDryFlowAsync(); + float rawDry = await _plcService.ReadDryFlowAsync(StationId); newPoint.DryFlow = ConvertFlowByMode(rawDry); } Record.DataPoints.Add(newPoint); diff --git a/appsettings.json b/appsettings.json index 9c6b2e7..5d82c1f 100644 --- a/appsettings.json +++ b/appsettings.json @@ -42,6 +42,15 @@ // 流量寄存器地址(每个工位共用,但需配合流量模式切换) "WetFlowRegister": 12, // 湿膜流量寄存器起始地址(D2~D3) "DryFlowRegister": 12, // 干膜流量寄存器起始地址(D4~D5) + + "WetFlowRegister2": 14, // 湿膜流量寄存器起始地址(D2~D3) + "DryFlowRegister2": 14, // 干膜流量寄存器起始地址(D4~D5) + + "WetFlowRegister3": 16, // 湿膜流量寄存器起始地址(D2~D3) + "DryFlowRegister3": 16, // 干膜流量寄存器起始地址(D4~D5) + + + "WetFlowFactor": 1.0, // 湿膜流量系数 "DryFlowFactor": 1.0, // 干膜流量系数