From 792be4e1822e108322e48d2a2501fba4764b80c6 Mon Sep 17 00:00:00 2001 From: BennyZhao Date: Fri, 20 May 2022 08:06:04 +0800 Subject: [PATCH] add Modbus Connected --- .../Clients/Modbus/Base/ModbusSerialBase.cs | 11 +++++++--- .../Modbus/Interfaces/IModbusClient.cs | 5 +++++ .../{ModBus => Modbus}/ModBusTcpClient.cs | 11 +++++++--- .../Clients/Modbus/ModbusRtuOverTcpClient.cs | 11 +++++++--- IoTClient/IoTClient/IoTClient.xml | 20 +++++++++++++++++++ 5 files changed, 49 insertions(+), 9 deletions(-) rename IoTClient/Clients/{ModBus => Modbus}/ModBusTcpClient.cs (99%) diff --git a/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs b/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs index 2db3067..eba65d1 100644 --- a/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs +++ b/IoTClient/Clients/Modbus/Base/ModbusSerialBase.cs @@ -14,6 +14,11 @@ namespace IoTClient.Clients.Modbus protected EndianFormat format; private bool plcAddresses; + /// + /// 是否是连接的 + /// + public bool Connected => serialPort?.IsOpen ?? false; + /// /// 警告日志委托 /// @@ -946,7 +951,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetReadCommand(string address, byte stationNumber, byte functionCode, ushort length) { var readAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) readAddress = Convert.ToUInt16(readAddress % 10000 - 1); + if (plcAddresses) readAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[6]; buffer[0] = stationNumber; //站号 @@ -969,7 +974,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCommand(string address, byte[] values, byte stationNumber, byte functionCode) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[7 + values.Length]; buffer[0] = stationNumber; //站号 @@ -994,7 +999,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCoilCommand(string address, bool value, byte stationNumber, byte functionCode) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[6]; buffer[0] = stationNumber;//站号 diff --git a/IoTClient/Clients/Modbus/Interfaces/IModbusClient.cs b/IoTClient/Clients/Modbus/Interfaces/IModbusClient.cs index 08fd78a..df33d24 100644 --- a/IoTClient/Clients/Modbus/Interfaces/IModbusClient.cs +++ b/IoTClient/Clients/Modbus/Interfaces/IModbusClient.cs @@ -14,6 +14,11 @@ namespace IoTClient.Clients.Modbus /// LoggerDelegate WarningLog { get; set; } + /// + /// 是否是连接的 + /// + bool Connected { get; } + /// /// 打开连接 /// diff --git a/IoTClient/Clients/ModBus/ModBusTcpClient.cs b/IoTClient/Clients/Modbus/ModBusTcpClient.cs similarity index 99% rename from IoTClient/Clients/ModBus/ModBusTcpClient.cs rename to IoTClient/Clients/Modbus/ModBusTcpClient.cs index 131ae53..da34442 100644 --- a/IoTClient/Clients/ModBus/ModBusTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModBusTcpClient.cs @@ -20,6 +20,11 @@ namespace IoTClient.Clients.Modbus private EndianFormat format; private bool plcAddresses; + /// + /// 是否是连接的 + /// + public bool Connected => socket?.Connected ?? false; + /// /// /// @@ -1359,7 +1364,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetReadCommand(string address, byte stationNumber, byte functionCode, ushort length, byte[] check = null) { var readAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) readAddress = Convert.ToUInt16(readAddress % 10000 - 1); + if (plcAddresses) readAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[12]; buffer[0] = check?[0] ?? 0x19; @@ -1389,7 +1394,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCommand(string address, byte[] values, byte stationNumber, byte functionCode, byte[] check = null) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[13 + values.Length]; buffer[0] = check?[0] ?? 0x19; @@ -1419,7 +1424,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCoilCommand(string address, bool value, byte stationNumber, byte functionCode, byte[] check = null) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[12]; buffer[0] = check?[0] ?? 0x19; diff --git a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs index f01933e..6e0b381 100644 --- a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs @@ -19,6 +19,11 @@ namespace IoTClient.Clients.Modbus private EndianFormat format; private bool plcAddresses; + /// + /// 是否是连接的 + /// + public bool Connected => socket?.Connected ?? false; + /// /// 构造函数 /// @@ -1126,7 +1131,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetReadCommand(string address, byte stationNumber, byte functionCode, ushort length) { var readAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) readAddress = Convert.ToUInt16(readAddress % 10000 - 1); + if (plcAddresses) readAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[6]; buffer[0] = stationNumber; //站号 @@ -1149,7 +1154,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCommand(string address, byte[] values, byte stationNumber, byte functionCode) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[7 + values.Length]; buffer[0] = stationNumber; //站号 @@ -1174,7 +1179,7 @@ namespace IoTClient.Clients.Modbus public byte[] GetWriteCoilCommand(string address, bool value, byte stationNumber, byte functionCode) { var writeAddress = ushort.Parse(address?.Trim()); - if (plcAddresses) writeAddress = Convert.ToUInt16(writeAddress % 10000 - 1); + if (plcAddresses) writeAddress = (ushort)(Convert.ToUInt16(address?.Trim().Substring(1)) - 1); byte[] buffer = new byte[6]; buffer[0] = stationNumber;//站号 diff --git a/IoTClient/IoTClient/IoTClient.xml b/IoTClient/IoTClient/IoTClient.xml index a26f399..e8e4786 100644 --- a/IoTClient/IoTClient/IoTClient.xml +++ b/IoTClient/IoTClient/IoTClient.xml @@ -4,6 +4,11 @@ IoTClient + + + 是否是连接的 + + 警告日志委托 @@ -366,6 +371,11 @@ 为了可用性,会对异常网络进行重试。此类日志通过委托接口给出去。 + + + 是否是连接的 + + 打开连接 @@ -775,6 +785,11 @@ Tcp的方式发送ModbusRtu协议报文 - 客户端 + + + 是否是连接的 + + 构造函数 @@ -1133,6 +1148,11 @@ ModbusTcp协议客户端 + + + 是否是连接的 + +