diff --git a/src/Version.props b/src/Version.props index 393b0cba0..a43555047 100644 --- a/src/Version.props +++ b/src/Version.props @@ -1,6 +1,6 @@ - 6.0.2.15 + 6.0.2.16 diff --git a/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Dlt645_2007Master.cs b/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Dlt645_2007Master.cs index ed89c9794..4693da210 100644 --- a/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Dlt645_2007Master.cs +++ b/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Dlt645_2007Master.cs @@ -41,6 +41,11 @@ public class Dlt645_2007Master : ProtocolBase, IDtu /// public string Station { get; set; } + /// + /// 默认Dtu注册包,utf-8字符串 + /// + public string DtuId { get; set; } = "TEST"; + /// /// 客户端连接滑动过期时间(TCP服务通道时) /// @@ -115,7 +120,7 @@ public class Dlt645_2007Master : ProtocolBase, IDtu { try { - var dAddress = Dlt645_2007Address.ParseFrom(address); + var dAddress = Dlt645_2007Address.ParseFrom(address, Station, DtuId); var commandResult = Dlt645Helper.GetDlt645_2007Command(dAddress, (byte)ControlCode.Read, Station); return await SendThenReturnAsync(dAddress.SocketId, commandResult, cancellationToken).ConfigureAwait(false); } @@ -139,7 +144,7 @@ public class Dlt645_2007Master : ProtocolBase, IDtu var data = DataTransUtil.SpliceArray(Password.ByHexStringToBytes(), OperCode.ByHexStringToBytes()); string[] strArray = value.SplitStringBySemicolon(); - var dAddress = Dlt645_2007Address.ParseFrom(address); + var dAddress = Dlt645_2007Address.ParseFrom(address, Station, DtuId); var commandResult = Dlt645Helper.GetDlt645_2007Command(dAddress, (byte)ControlCode.Write, Station, data, strArray); return await SendThenReturnAsync(dAddress.SocketId, commandResult, cancellationToken).ConfigureAwait(false); } diff --git a/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Util/Dlt645_2007Address.cs b/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Util/Dlt645_2007Address.cs index f53bb5544..71804b250 100644 --- a/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Util/Dlt645_2007Address.cs +++ b/src/adapter/ThingsGateway.Foundation.Dlt645/Dlt645/Util/Dlt645_2007Address.cs @@ -16,6 +16,8 @@ using ThingsGateway.Foundation.Extension.String; using TouchSocket.Core; +using static System.Collections.Specialized.BitVector32; + namespace ThingsGateway.Foundation.Dlt645; /// @@ -76,7 +78,7 @@ public class Dlt645_2007Address /// /// 解析地址 /// - public static Dlt645_2007Address ParseFrom(string address, bool isCache = true) + public static Dlt645_2007Address ParseFrom(string address, string defaultStation = null, string dtuid = null, bool isCache = true) { var cacheKey = $"{nameof(ParseFrom)}_{typeof(Dlt645_2007Address).FullName}_{typeof(Dlt645_2007Address).TypeHandle.Value}_{address}"; if (isCache) @@ -84,6 +86,15 @@ public class Dlt645_2007Address return dAddress.Map(); Dlt645_2007Address dlt645_2007Address = new(); + if (defaultStation != null) + { + if (defaultStation.IsNullOrEmpty()) defaultStation = string.Empty; + if (defaultStation.Length < 12) + defaultStation = defaultStation.PadLeft(12, '0'); + dlt645_2007Address.Station = defaultStation.ByHexStringToBytes().Reverse().ToArray(); + } + if (dtuid != null) + dlt645_2007Address.SocketId = dtuid; byte[] array; array = Array.Empty(); if (address.IndexOf(';') < 0) diff --git a/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/en-US.json b/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/en-US.json index e1bb9acdf..f8bf9f60d 100644 --- a/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/en-US.json +++ b/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/en-US.json @@ -1,18 +1,19 @@ { "ThingsGateway.Foundation.Dlt645.Dlt645_2007Master": { - "FEHead": "Front-end identifier in message header", - "OperCode": "Operator code", - "Password": "Write password", - "Station": "Communication address", - "CheckClearTime": "Connection sliding expiration time", - "HeartbeatHexString": "Heartbeat detection", + "FEHead": "FEHead", + "OperCode": "OperCode", + "Password": "Password", + "Station": "Station", + "DtuId": "DtuId", + "CheckClearTime": "CheckClearTime", + "HeartbeatHexString": "HeartbeatHexString", - "CacheTimeout": "Packet Assembly Cache Time", - "SendDelayTime": "Send Delay Time", - "EndianType": "Parsing Rules", - "Timeout": "Read/Write Timeout", - "ConnectTimeout": "Connection Timeout", - "IsStringReverseByteWord": "String Byte/Word Reversal" + "CacheTimeout": "CacheTimeout", + "SendDelayTime": "SendDelayTime", + "EndianType": "EndianType", + "Timeout": "Timeout", + "ConnectTimeout": "ConnectTimeout", + "IsStringReverseByteWord": "IsStringReverseByteWord" }, "ThingsGateway.Foundation.Dlt645.DltResource": { diff --git a/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/zh-CN.json b/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/zh-CN.json index c4692ed48..dbc76bc35 100644 --- a/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/zh-CN.json +++ b/src/adapter/ThingsGateway.Foundation.Dlt645/Locales/zh-CN.json @@ -4,6 +4,7 @@ "OperCode": "操作员代码", "Password": "写入密码", "Station": "通讯地址", + "DtuId": "Dtu注册包", "CheckClearTime": "连接滑动过期时间", "HeartbeatHexString": "心跳检测", diff --git a/src/adapter/ThingsGateway.Foundation.Modbus/Helper/ModbusAddress.cs b/src/adapter/ThingsGateway.Foundation.Modbus/Helper/ModbusAddress.cs index 22c4b426d..3fa6c71eb 100644 --- a/src/adapter/ThingsGateway.Foundation.Modbus/Helper/ModbusAddress.cs +++ b/src/adapter/ThingsGateway.Foundation.Modbus/Helper/ModbusAddress.cs @@ -119,10 +119,10 @@ public class ModbusAddress /// /// 解析地址 /// - public static ModbusAddress? ParseFrom(string address, byte? station = null, bool isCache = true) + public static ModbusAddress? ParseFrom(string address, byte? station = null, string dtuid = null, bool isCache = true) { if (address.IsNullOrWhiteSpace()) { return null; } - var cacheKey = $"{nameof(ParseFrom)}_{typeof(ModbusAddress).FullName}_{typeof(ModbusAddress).TypeHandle.Value}_{station}_{address}"; + var cacheKey = $"{nameof(ParseFrom)}_{typeof(ModbusAddress).FullName}_{typeof(ModbusAddress).TypeHandle.Value}_{station}_{dtuid}_{address}"; if (isCache) if (MemoryCache.Instance.TryGetValue(cacheKey, out ModbusAddress mAddress)) return mAddress.Map(); @@ -130,6 +130,8 @@ public class ModbusAddress var modbusAddress = new ModbusAddress(); if (station != null) modbusAddress.Station = station.Value; + if (dtuid != null) + modbusAddress.SocketId = dtuid; if (address.IndexOf(';') < 0) { Address(address); diff --git a/src/adapter/ThingsGateway.Foundation.Modbus/Helper/PackHelper.cs b/src/adapter/ThingsGateway.Foundation.Modbus/Helper/PackHelper.cs index e3d148c25..8efc928d2 100644 --- a/src/adapter/ThingsGateway.Foundation.Modbus/Helper/PackHelper.cs +++ b/src/adapter/ThingsGateway.Foundation.Modbus/Helper/PackHelper.cs @@ -22,8 +22,10 @@ public class PackHelper /// /// 最大打包长度 /// 默认间隔时间 + /// 默认站点 + /// 默认dtuid /// - public static List LoadSourceRead(IProtocol device, IEnumerable deviceVariables, int maxPack, int defaultIntervalTime) where T : IVariableSource, new() + public static List LoadSourceRead(IProtocol device, IEnumerable deviceVariables, int maxPack, int defaultIntervalTime, byte? station = null, string dtuid = null) where T : IVariableSource, new() { // 检查参数是否为空 if (deviceVariables == null) @@ -80,7 +82,7 @@ public class PackHelper // 解析地址,并设置字节长度 var address = it.RegisterAddress; - var result = ModbusAddress.ParseFrom(address, isCache: false); + var result = ModbusAddress.ParseFrom(address, station, dtuid, isCache: false); result.ByteLength = lastLen; return result; })); diff --git a/src/adapter/ThingsGateway.Foundation.Modbus/Locales/en-US.json b/src/adapter/ThingsGateway.Foundation.Modbus/Locales/en-US.json index df796612d..a2c18e019 100644 --- a/src/adapter/ThingsGateway.Foundation.Modbus/Locales/en-US.json +++ b/src/adapter/ThingsGateway.Foundation.Modbus/Locales/en-US.json @@ -1,31 +1,32 @@ { "ThingsGateway.Foundation.Modbus.ModbusMaster": { - "ModbusType": "Modbus Type", - "Station": "Default Station Number", - "CheckClearTime": "Connection Sliding Expiration Time", - "HeartbeatHexString": "Heartbeat Detection (Uppercase Hexadecimal String)", + "ModbusType": "ModbusType", + "Station": "Station", + "DtuId": "DtuId", + "CheckClearTime": "CheckClearTime", + "HeartbeatHexString": "HeartbeatHexString", - "CacheTimeout": "Packet Assembly Cache Time", - "SendDelayTime": "Send Delay Time", - "EndianType": "Parsing Rules", - "Timeout": "Read/Write Timeout", - "ConnectTimeout": "Connection Timeout", - "IsStringReverseByteWord": "String Byte/Word Reversal" + "CacheTimeout": "CacheTimeout", + "SendDelayTime": "SendDelayTime", + "EndianType": "EndianType", + "Timeout": "Timeout", + "ConnectTimeout": "ConnectTimeout", + "IsStringReverseByteWord": "IsStringReverseByteWord" }, "ThingsGateway.Foundation.Modbus.ModbusSlave": { - "ModbusType": "Modbus Type", - "Station": "Default Station Number", - "CheckClearTime": "Connection Sliding Expiration Time", - "MulStation": "Multiple Stations", - "IsWriteMemory": "Immediate Memory Write", - "MaxClientCount": "Maximum Connection Count", + "ModbusType": "ModbusType", + "Station": "Station", + "CheckClearTime": "CheckClearTime", + "MulStation": "MulStation", + "IsWriteMemory": "IsWriteMemory", + "MaxClientCount": "MaxClientCount", - "CacheTimeout": "Packet Assembly Cache Time", - "SendDelayTime": "Send Delay Time", - "EndianType": "Parsing Rules", - "Timeout": "Read/Write Timeout", - "ConnectTimeout": "Connection Timeout", - "IsStringReverseByteWord": "String Byte/Word Reversal" + "CacheTimeout": "CacheTimeout", + "SendDelayTime": "SendDelayTime", + "EndianType": "EndianType", + "Timeout": "Timeout", + "ConnectTimeout": "ConnectTimeout", + "IsStringReverseByteWord": "IsStringReverseByteWord" }, "ThingsGateway.Foundation.Modbus.ModbusResource": { @@ -45,4 +46,4 @@ "ValueOverlimit": "{0} cannot exceed {1}", "CrcError": "CRC check failed" } -} \ No newline at end of file +} diff --git a/src/adapter/ThingsGateway.Foundation.Modbus/Locales/zh-CN.json b/src/adapter/ThingsGateway.Foundation.Modbus/Locales/zh-CN.json index 3902dec85..65b23bec3 100644 --- a/src/adapter/ThingsGateway.Foundation.Modbus/Locales/zh-CN.json +++ b/src/adapter/ThingsGateway.Foundation.Modbus/Locales/zh-CN.json @@ -1,7 +1,8 @@ { "ThingsGateway.Foundation.Modbus.ModbusMaster": { "ModbusType": "Modbus类型", - "Station": "默认站号", + "Station": "站号", + "DtuId": "Dtu注册包", "CheckClearTime": "连接滑动过期时间", "HeartbeatHexString": "心跳检测(大写16进制字符串)", @@ -44,4 +45,4 @@ "ValueOverlimit": "{0} 不能超过 {1}", "CrcError": "Crc校验失败" } -} \ No newline at end of file +} diff --git a/src/adapter/ThingsGateway.Foundation.Modbus/Master/ModbusMaster.cs b/src/adapter/ThingsGateway.Foundation.Modbus/Master/ModbusMaster.cs index 294e387f7..9f1508136 100644 --- a/src/adapter/ThingsGateway.Foundation.Modbus/Master/ModbusMaster.cs +++ b/src/adapter/ThingsGateway.Foundation.Modbus/Master/ModbusMaster.cs @@ -67,6 +67,11 @@ public partial class ModbusMaster : ProtocolBase, IDtu /// public byte Station { get; set; } = 1; + /// + /// 默认Dtu注册包,utf-8字符串 + /// + public string DtuId { get; set; } = "TEST"; + /// /// 客户端连接滑动过期时间(TCP服务通道时) /// @@ -144,7 +149,7 @@ public partial class ModbusMaster : ProtocolBase, IDtu /// public override List LoadSourceRead(IEnumerable deviceVariables, int maxPack, int defaultIntervalTime) { - return PackHelper.LoadSourceRead(this, deviceVariables, maxPack, defaultIntervalTime); + return PackHelper.LoadSourceRead(this, deviceVariables, maxPack, defaultIntervalTime, Station, DtuId); } /// @@ -152,7 +157,7 @@ public partial class ModbusMaster : ProtocolBase, IDtu { try { - var mAddress = ModbusAddress.ParseFrom(address, Station); + var mAddress = ModbusAddress.ParseFrom(address, Station, DtuId); var commandResult = ModbusHelper.GetReadModbusCommand(mAddress, (ushort)length); return await SendThenReturnAsync(mAddress.SocketId, commandResult, cancellationToken).ConfigureAwait(false); } @@ -167,7 +172,7 @@ public partial class ModbusMaster : ProtocolBase, IDtu { try { - var mAddress = ModbusAddress.ParseFrom(address, Station); + var mAddress = ModbusAddress.ParseFrom(address, Station, DtuId); value = value.ArrayExpandToLengthEven(); byte[]? commandResult = null; //功能码或实际长度 @@ -188,7 +193,7 @@ public partial class ModbusMaster : ProtocolBase, IDtu { try { - var mAddress = ModbusAddress.ParseFrom(address, Station); + var mAddress = ModbusAddress.ParseFrom(address, Station, DtuId); //功能码或实际长度 if (value.Length > 1 || mAddress.WriteFunction == 15) { diff --git a/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007Master.cs b/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007Master.cs index 55319f487..d6d2922ef 100644 --- a/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007Master.cs +++ b/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007Master.cs @@ -40,6 +40,7 @@ public class Dlt645_2007Master : CollectBase _plc = new(channel) { EndianType = _driverPropertys.EndianType, + DtuId = _driverPropertys.DtuId, SendDelayTime = _driverPropertys.SendDelayTime, CacheTimeout = _driverPropertys.CacheTimeout, ConnectTimeout = _driverPropertys.ConnectTimeout, diff --git a/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007MasterProperty.cs b/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007MasterProperty.cs index 67d1b7825..ed466c461 100644 --- a/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007MasterProperty.cs +++ b/src/adapter/ThingsGateway.Plugin.Dlt645/Dlt645_2007/Dlt645_2007MasterProperty.cs @@ -67,6 +67,12 @@ public class Dlt645_2007MasterProperty : CollectPropertyBase [DynamicProperty] public string Station { get; set; } + /// + /// 默认DtuId + /// + [DynamicProperty] + public string? DtuId { get; set; } + /// /// 密码 /// diff --git a/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/en-US.json b/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/en-US.json index a50cf8392..c4bc6a84f 100644 --- a/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/en-US.json +++ b/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/en-US.json @@ -4,6 +4,7 @@ "OperCode": "OperCode", "Password": "Password", "Station": "DefaultStation", + "DtuId": "DefaultDtuId", "HeartbeatHexString": "HeartbeatHexString", "EndianType": "EndianType", diff --git a/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/zh-CN.json b/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/zh-CN.json index b7cdf97fe..d51ecca19 100644 --- a/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/zh-CN.json +++ b/src/adapter/ThingsGateway.Plugin.Dlt645/Locales/zh-CN.json @@ -4,6 +4,7 @@ "OperCode": "操作员代码", "Password": "写入密码", "Station": "通讯地址", + "DtuId": "默认DtuId", "HeartbeatHexString": "心跳验证(HexString)", "EndianType": "解析规则", diff --git a/src/adapter/ThingsGateway.Plugin.Dlt645/Pages/Dlt645_2007Master.razor b/src/adapter/ThingsGateway.Plugin.Dlt645/Pages/Dlt645_2007Master.razor index c6bf0d63a..8a2965c45 100644 --- a/src/adapter/ThingsGateway.Plugin.Dlt645/Pages/Dlt645_2007Master.razor +++ b/src/adapter/ThingsGateway.Plugin.Dlt645/Pages/Dlt645_2007Master.razor @@ -23,6 +23,7 @@ + diff --git a/src/adapter/ThingsGateway.Plugin.Modbus/Locales/en-US.json b/src/adapter/ThingsGateway.Plugin.Modbus/Locales/en-US.json index 143572ad9..f0a9b612a 100644 --- a/src/adapter/ThingsGateway.Plugin.Modbus/Locales/en-US.json +++ b/src/adapter/ThingsGateway.Plugin.Modbus/Locales/en-US.json @@ -3,6 +3,7 @@ "ModbusType": "ProtocolType", "HeartbeatHexString": "HeartbeatHexString", "Station": "DefaultStation", + "DtuId": "DefaultDtuId", "EndianType": "EndianType", "IsStringReverseByteWord": "StringReverseByteWord", "CheckClearTime": "CheckClearTime", @@ -46,4 +47,4 @@ "DataType": "DataType", "VariableRpcEnable": "VariableRpcEnable" } -} \ No newline at end of file +} diff --git a/src/adapter/ThingsGateway.Plugin.Modbus/Locales/zh-CN.json b/src/adapter/ThingsGateway.Plugin.Modbus/Locales/zh-CN.json index d3f16e254..5738bdd20 100644 --- a/src/adapter/ThingsGateway.Plugin.Modbus/Locales/zh-CN.json +++ b/src/adapter/ThingsGateway.Plugin.Modbus/Locales/zh-CN.json @@ -3,6 +3,7 @@ "ModbusType": "协议类型", "HeartbeatHexString": "心跳验证(HexString)", "Station": "默认站号", + "DtuId": "默认DtuId", "EndianType": "解析规则", "IsStringReverseByteWord": "字符串反转", "CheckClearTime": "客户端连接滑动过期时间", @@ -47,4 +48,4 @@ "DataType": "数据类型", "VariableRpcEnable": "允许写入" } -} \ No newline at end of file +} diff --git a/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMaster.cs b/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMaster.cs index 07e0b17ef..bc4e18f11 100644 --- a/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMaster.cs +++ b/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMaster.cs @@ -50,6 +50,7 @@ public class ModbusMaster : CollectBase _plc = new(channel) { EndianType = _driverPropertys.EndianType, + DtuId = _driverPropertys.DtuId, IsStringReverseByteWord = _driverPropertys.IsStringReverseByteWord, SendDelayTime = _driverPropertys.SendDelayTime, CacheTimeout = _driverPropertys.CacheTimeout, diff --git a/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMasterProperty.cs b/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMasterProperty.cs index 4335f94d0..4f8767d1d 100644 --- a/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMasterProperty.cs +++ b/src/adapter/ThingsGateway.Plugin.Modbus/ModbusMaster/ModbusMasterProperty.cs @@ -35,6 +35,12 @@ public class ModbusMasterProperty : CollectPropertyBase [DynamicProperty] public byte Station { get; set; } = 1; + /// + /// 默认DtuId + /// + [DynamicProperty] + public string? DtuId { get; set; } + /// /// 默认解析顺序 /// diff --git a/src/adapter/ThingsGateway.Plugin.Modbus/Pages/ModbusMaster.razor b/src/adapter/ThingsGateway.Plugin.Modbus/Pages/ModbusMaster.razor index 8960d1bb6..1d50c5d5e 100644 --- a/src/adapter/ThingsGateway.Plugin.Modbus/Pages/ModbusMaster.razor +++ b/src/adapter/ThingsGateway.Plugin.Modbus/Pages/ModbusMaster.razor @@ -21,6 +21,7 @@ +