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 @@ private Result> BatchRead(List addresses) { 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 @@ private Result> BatchRead(List addresses) { 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 @@ public Result> BatchRead(List addresses, uint re 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 @@ private Result> BatchRead(Dictionary 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 @@ public class ModbusOutput /// /// 地址 /// - public int Address { get; set; } + public string Address { get; set; } /// /// 站号 ///