using DeviceCommand.Base; public class Others : ModbusTcp { private readonly byte _slaveId; /// /// 通道1PV /// private const ushort CH1_PV = 100; /// /// 通道2PV /// private const ushort CH2_PV = 102; /// /// 通道3PV /// private const ushort CH3_PV = 104; /// /// 通道4PV /// private const ushort CH4_PV = 106; public Others( byte slaveId, string ip, int port = 508, int sendTimeoutMs = 3000, int receiveTimeoutMs = 3000) : base() { _slaveId = slaveId; ConfigureDevice(ip, port, sendTimeoutMs, receiveTimeoutMs); } /// /// 读取通道1PV /// public async Task ReadCH1Async(CancellationToken ct = default) { return await ReadRealAsync(CH1_PV, ct); } /// /// 读取通道2PV /// public async Task ReadCH2Async(CancellationToken ct = default) { return await ReadRealAsync(CH2_PV, ct); } /// /// 读取通道3PV /// public async Task ReadCH3Async(CancellationToken ct = default) { return await ReadRealAsync(CH3_PV, ct); } /// /// 读取通道4PV /// public async Task ReadCH4Async(CancellationToken ct = default) { return await ReadRealAsync(CH4_PV, ct); } /// /// 一次读取4个通道PV /// public async Task<(float ch1, float ch2, float ch3, float ch4)> ReadAllAsync(CancellationToken ct = default) { ushort[] raw = await ReadHoldingRegistersAsync(_slaveId, 100, 8, ct); return ( ToFloat(raw[0], raw[1]), ToFloat(raw[2], raw[3]), ToFloat(raw[4], raw[5]), ToFloat(raw[6], raw[7]) ); } private async Task ReadRealAsync(ushort address, CancellationToken ct) { ushort[] raw = await ReadHoldingRegistersAsync(_slaveId, address, 2, ct); return ToFloat(raw[0], raw[1]); } private static float ToFloat(ushort high, ushort low) { byte[] bytes = { (byte)(high >> 8), (byte)high, (byte)(low >> 8), (byte)low }; if (BitConverter.IsLittleEndian) Array.Reverse(bytes); return BitConverter.ToSingle(bytes, 0); } }