From 769739edcf6318df1725845e2243a73d864fb129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E8=82=87=E6=A3=AE?= Date: Fri, 28 Feb 2025 17:45:48 +0800 Subject: [PATCH] =?UTF-8?q?ModbusTCP=20=E6=89=B9=E9=87=8F=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E5=8F=AF=E4=BB=A5=E6=8C=89=E4=BD=8D=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=EF=BC=88=E4=BE=8B=E5=A6=82=20=E2=80=9C10.0....10.15=E2=80=9D?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/Modbus/Base/ModbusSerialBase.cs | 2 +- .../Clients/Modbus/ModbusRtuOverTcpClient.cs | 2 +- IoTClient/Clients/Modbus/ModbusTcpClient.cs | 69 +++++++++++++++++-- .../Clients/Modbus/Models/ModBusOutput.cs | 2 +- 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs b/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs index 43e4012..0e8fbaf 100644 --- a/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs +++ b/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs @@ -726,7 +726,7 @@ namespace IoTClient.Clients.Modbus { result.Value.Add(new ModbusOutput() { - Address = item.Key, + Address = item.Key.ToString(), FunctionCode = functionCode, StationNumber = stationNumber, Value = item.Value diff --git a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs index 1d0a109..31dd34e 100644 --- a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs @@ -827,7 +827,7 @@ namespace IoTClient.Clients.Modbus { result.Value.Add(new ModbusOutput() { - Address = item.Key, + Address = item.Key.ToString(), FunctionCode = functionCode, StationNumber = stationNumber, Value = item.Value diff --git a/IoTClient/Clients/Modbus/ModbusTcpClient.cs b/IoTClient/Clients/Modbus/ModbusTcpClient.cs index 1fb4c38..97a3129 100644 --- a/IoTClient/Clients/Modbus/ModbusTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModbusTcpClient.cs @@ -1071,12 +1071,11 @@ namespace IoTClient.Clients.Modbus return result; } - private Result> BatchRead(Dictionary addressList, byte stationNumber, byte functionCode) + private Result> BatchRead(Dictionary addressList, byte stationNumber, byte functionCode) { - var result = new Result>(); - result.Value = new Dictionary(); - - var addresses = addressList.Select(t => new KeyValuePair(int.Parse(t.Key), t.Value)).ToList(); + var result = new Result>(); + result.Value = new Dictionary(); + var addresses = addressList.Select(m => new { Key = m.Key.Contains('.') ? m.Key.Split('.')[0] : m.Key, Value = m.Key.Contains('.') ? DataTypeEnum.Int16 : m.Value }).GroupBy(m => (m.Key, m.Value)).Select(t => new KeyValuePair(int.Parse(t.Key.Key), t.Key.Value)).ToList(); var minAddress = addresses.Select(t => t.Key).Min(); var maxAddress = addresses.Select(t => t.Key).Max(); @@ -1167,14 +1166,70 @@ namespace IoTClient.Clients.Modbus throw new Exception("Err BatchRead 未定义类型 -3"); } - result.Value.Add(item.Key, tempVaue); + result.Value.Add(item.Key.ToString(), tempVaue); } minAddress = minAddress + readLength; if (addresses.Any(t => t.Key >= minAddress)) minAddress = addresses.Where(t => t.Key >= minAddress).OrderBy(t => t.Key).FirstOrDefault().Key; else - return result.EndTime(); + { + var xx = result.Value; + var newResult = new Result>(); + newResult.Value = new Dictionary(); + foreach (var c in addressList) + { + if (c.Key.Contains('.')) + { + int bit = int.Parse(c.Key.Split('.')[1]); + int address = int.Parse(c.Key.Split('.')[0]); + Int16 value = (Int16)result.Value[address.ToString()]; + var binaryArray = DataConvert.IntToBinaryArray(value, 16); + var realvalue = int.Parse(binaryArray[15 - bit].ToString()); + switch (c.Value) + { + case DataTypeEnum.Bool: + newResult.Value.Add(c.Key, Convert.ToBoolean(realvalue)); + break; + case DataTypeEnum.Byte: + throw new Exception("Err BatchRead 未定义类型 -2"); + case DataTypeEnum.Int16: + newResult.Value.Add(c.Key, Convert.ToInt16(realvalue)); + break; + case DataTypeEnum.UInt16: + newResult.Value.Add(c.Key, Convert.ToUInt16(realvalue)); + break; + case DataTypeEnum.Int32: + newResult.Value.Add(c.Key, Convert.ToInt32(realvalue)); + break; + case DataTypeEnum.UInt32: + newResult.Value.Add(c.Key, Convert.ToUInt32(realvalue)); + break; + case DataTypeEnum.Int64: + newResult.Value.Add(c.Key, Convert.ToInt64(realvalue)); + break; + case DataTypeEnum.UInt64: + newResult.Value.Add(c.Key, Convert.ToUInt64(realvalue)); + break; + case DataTypeEnum.Float: + newResult.Value.Add(c.Key, Convert.ToSingle(realvalue)); + break; + case DataTypeEnum.Double: + newResult.Value.Add(c.Key, Convert.ToDouble(realvalue)); + break; + default: + throw new Exception("Err BatchRead 未定义类型 -3"); + } + + } + else + { + newResult.Value.Add(c.Key, result.Value[c.Key]); + } + } + return newResult.EndTime(); + } + return result.EndTime(); } return result.EndTime(); } diff --git a/IoTClient/Clients/Modbus/Models/ModBusOutput.cs b/IoTClient/Clients/Modbus/Models/ModBusOutput.cs index c72b159..e333b28 100644 --- a/IoTClient/Clients/Modbus/Models/ModBusOutput.cs +++ b/IoTClient/Clients/Modbus/Models/ModBusOutput.cs @@ -9,7 +9,7 @@ namespace IoTClient.Models /// /// 地址 /// - public int Address { get; set; } + public string Address { get; set; } /// /// 站号 ///