diff --git a/src/foundation/ThingsGateway.Foundation.Modbus/src/Helper/ModbusHelper.cs b/src/foundation/ThingsGateway.Foundation.Modbus/src/Helper/ModbusHelper.cs index 192e62749..bc55e8fe8 100644 --- a/src/foundation/ThingsGateway.Foundation.Modbus/src/Helper/ModbusHelper.cs +++ b/src/foundation/ThingsGateway.Foundation.Modbus/src/Helper/ModbusHelper.cs @@ -185,7 +185,6 @@ internal class ModbusHelper if (send == null) { var result = new OperResult() { Content = response.RemoveBegin(3), Content2 = FilterResult.Success }; - result.ErrorMessage = FoundationConst.NotActiveQueryError; return result; } if (send.Length == 0) @@ -235,29 +234,6 @@ internal class ModbusHelper return GetModbusData(send, data.RemoveLast(2)); } - /// - /// 获取读取报文 - /// - internal static byte[] GetReadModbusCommand(string address, ushort length, byte station) - { - var mAddress = ModbusAddressHelper.ParseFrom(address, station); - return GetReadModbusCommand(mAddress, length); - } - - /// - /// 获取写入字报文,根据地址识别功能码 - /// - internal static byte[] GetWriteModbusCommand(string address, byte[] value, byte station) - { - var mAddress = ModbusAddressHelper.ParseFrom(address, station); - value = value.ArrayExpandToLengthEven(); - //功能码或实际长度 - if (value.Length > 2 || mAddress.WriteFunction == 16) - return GetWriteModbusCommand(mAddress, value); - else - return GetWriteOneModbusCommand(mAddress, value); - } - #region 报文构建 /// diff --git a/src/foundation/ThingsGateway.Foundation.Modbus/src/Master/ModbusMaster.cs b/src/foundation/ThingsGateway.Foundation.Modbus/src/Master/ModbusMaster.cs index 929226294..479184fde 100644 --- a/src/foundation/ThingsGateway.Foundation.Modbus/src/Master/ModbusMaster.cs +++ b/src/foundation/ThingsGateway.Foundation.Modbus/src/Master/ModbusMaster.cs @@ -11,6 +11,8 @@ using System.ComponentModel; using System.Text; +using ThingsGateway.Foundation.Extension.Generic; + using TouchSocket.Sockets; namespace ThingsGateway.Foundation.Modbus; @@ -18,6 +20,8 @@ namespace ThingsGateway.Foundation.Modbus; /// public class ModbusMaster : ProtocolBase { + private ModbusTypeEnum modbusType; + /// public ModbusMaster(IChannel channel) : base(channel) { @@ -26,8 +30,6 @@ public class ModbusMaster : ProtocolBase WaitHandlePool.MaxSign = ushort.MaxValue; } - private ModbusTypeEnum modbusType; - /// /// Modbus类型 /// @@ -171,9 +173,9 @@ public class ModbusMaster : ProtocolBase { try { - var commandResult = ModbusHelper.GetReadModbusCommand(address, (ushort)length, Station); - - return SendThenReturn(address, commandResult, cancellationToken); + var mAddress = ModbusAddressHelper.ParseFrom(address, Station); + var commandResult = ModbusHelper.GetReadModbusCommand(mAddress, (ushort)length); + return SendThenReturn(mAddress, commandResult, cancellationToken); } catch (Exception ex) { @@ -181,27 +183,14 @@ public class ModbusMaster : ProtocolBase } } - private OperResult SendThenReturn(string address, byte[] commandResult, CancellationToken cancellationToken) - { - if (Channel.ChannelType == ChannelTypeEnum.TcpService) - { - var mAddress = ModbusAddressHelper.ParseFrom(address, Station); - if (((TcpServiceBase)Channel).SocketClients.TryGetSocketClient($"ID={mAddress.SocketId}", out TgSocketClient? client)) - return SendThenReturn(new SendMessage(commandResult), cancellationToken, client); - else - return new OperResult(FoundationConst.DtuNoConnectedWaining); - } - else - return SendThenReturn(new SendMessage(commandResult), cancellationToken); - } - /// public override async Task> ReadAsync(string address, int length, CancellationToken cancellationToken = default) { try { - var commandResult = ModbusHelper.GetReadModbusCommand(address, (ushort)length, Station); - return await SendThenReturnAsync(address, commandResult, cancellationToken); + var mAddress = ModbusAddressHelper.ParseFrom(address, Station); + var commandResult = ModbusHelper.GetReadModbusCommand(mAddress, (ushort)length); + return await SendThenReturnAsync(mAddress, commandResult, cancellationToken); } catch (Exception ex) { @@ -209,27 +198,20 @@ public class ModbusMaster : ProtocolBase } } - private Task> SendThenReturnAsync(string address, byte[] commandResult, CancellationToken cancellationToken) - { - if (Channel.ChannelType == ChannelTypeEnum.TcpService) - { - var mAddress = ModbusAddressHelper.ParseFrom(address, Station); - if (((TcpServiceBase)Channel).SocketClients.TryGetSocketClient($"ID={mAddress.SocketId}", out TgSocketClient? client)) - return SendThenReturnAsync(new SendMessage(commandResult), cancellationToken, client); - else - return Task.FromResult(new OperResult(FoundationConst.DtuNoConnectedWaining)); - } - else - return SendThenReturnAsync(new SendMessage(commandResult), cancellationToken); - } - /// public override OperResult Write(string address, byte[] value, CancellationToken cancellationToken = default) { try { - var commandResult = ModbusHelper.GetWriteModbusCommand(address, value, Station); - return SendThenReturn(address, commandResult, cancellationToken); + var mAddress = ModbusAddressHelper.ParseFrom(address, Station); + value = value.ArrayExpandToLengthEven(); + byte[]? commandResult = null; + //功能码或实际长度 + if (value.Length > 2 || mAddress.WriteFunction == 16) + commandResult = ModbusHelper.GetWriteModbusCommand(mAddress, value); + else + commandResult = ModbusHelper.GetWriteOneModbusCommand(mAddress, value); + return SendThenReturn(mAddress, commandResult, cancellationToken); } catch (Exception ex) { @@ -247,26 +229,26 @@ public class ModbusMaster : ProtocolBase if (value.Length > 1 || mAddress.WriteFunction == 15) { var commandResult = ModbusHelper.GetWriteBoolModbusCommand(mAddress, value, (ushort)value.Length); - return SendThenReturn(address, commandResult, cancellationToken); + return SendThenReturn(mAddress, commandResult, cancellationToken); } else { if (mAddress.BitIndex == null) { var commandResult = ModbusHelper.GetWriteBoolModbusCommand(mAddress, value[0]); - return SendThenReturn(address, commandResult, cancellationToken); + return SendThenReturn(mAddress, commandResult, cancellationToken); } else if (mAddress.BitIndex < 16) { //比如40001.1 var read = ModbusHelper.GetReadModbusCommand(mAddress, 1); - var readData = SendThenReturn(address, read, cancellationToken); + var readData = SendThenReturn(mAddress, read, cancellationToken); if (!readData.IsSuccess) return readData; var writeData = ThingsGatewayBitConverter.ToUInt16(readData.Content, 0); ushort mask = (ushort)(1 << mAddress.BitIndex); ushort result = (ushort)(value[0] ? (writeData | mask) : (writeData & ~mask)); var write = ModbusHelper.GetWriteOneModbusCommand(mAddress, ThingsGatewayBitConverter.GetBytes(result)); - return SendThenReturn(address, write, cancellationToken); + return SendThenReturn(mAddress, write, cancellationToken); } else { @@ -285,8 +267,15 @@ public class ModbusMaster : ProtocolBase { try { - var commandResult = ModbusHelper.GetWriteModbusCommand(address, value, Station); - return await SendThenReturnAsync(address, commandResult, cancellationToken); + var mAddress = ModbusAddressHelper.ParseFrom(address, Station); + value = value.ArrayExpandToLengthEven(); + byte[]? commandResult = null; + //功能码或实际长度 + if (value.Length > 2 || mAddress.WriteFunction == 16) + commandResult = ModbusHelper.GetWriteModbusCommand(mAddress, value); + else + commandResult = ModbusHelper.GetWriteOneModbusCommand(mAddress, value); + return await SendThenReturnAsync(mAddress, commandResult, cancellationToken); } catch (Exception ex) { @@ -304,27 +293,27 @@ public class ModbusMaster : ProtocolBase if (value.Length > 1 || mAddress.WriteFunction == 15) { var commandResult = ModbusHelper.GetWriteBoolModbusCommand(mAddress, value, (ushort)value.Length); - return await SendThenReturnAsync(address, commandResult, cancellationToken); + return await SendThenReturnAsync(mAddress, commandResult, cancellationToken); } else { if (mAddress.BitIndex == null) { var commandResult = ModbusHelper.GetWriteBoolModbusCommand(mAddress, value[0]); - return await SendThenReturnAsync(address, commandResult, cancellationToken); + return await SendThenReturnAsync(mAddress, commandResult, cancellationToken); } else if (mAddress.BitIndex < 16) { //比如40001.1 var read = ModbusHelper.GetReadModbusCommand(mAddress, 1); - var readData = await SendThenReturnAsync(address, read, cancellationToken); + var readData = await SendThenReturnAsync(mAddress, read, cancellationToken); if (!readData.IsSuccess) return readData; var writeData = ThingsGatewayBitConverter.ToUInt16(readData.Content, 0); ushort mask = (ushort)(1 << mAddress.BitIndex); ushort result = (ushort)(value[0] ? (writeData | mask) : (writeData & ~mask)); var write = ModbusHelper.GetWriteOneModbusCommand(mAddress, ThingsGatewayBitConverter.GetBytes(result)); - return await SendThenReturnAsync(address, write, cancellationToken); + return await SendThenReturnAsync(mAddress, write, cancellationToken); } else { @@ -337,6 +326,32 @@ public class ModbusMaster : ProtocolBase return new OperResult(ex); } } + + private OperResult SendThenReturn(ModbusAddress mAddress, byte[] commandResult, CancellationToken cancellationToken) + { + if (Channel.ChannelType == ChannelTypeEnum.TcpService) + { + if (((TcpServiceBase)Channel).SocketClients.TryGetSocketClient($"ID={mAddress.SocketId}", out TgSocketClient? client)) + return SendThenReturn(new SendMessage(commandResult), cancellationToken, client); + else + return new OperResult(FoundationConst.DtuNoConnectedWaining); + } + else + return SendThenReturn(new SendMessage(commandResult), cancellationToken); + } + + private Task> SendThenReturnAsync(ModbusAddress mAddress, byte[] commandResult, CancellationToken cancellationToken) + { + if (Channel.ChannelType == ChannelTypeEnum.TcpService) + { + if (((TcpServiceBase)Channel).SocketClients.TryGetSocketClient($"ID={mAddress.SocketId}", out TgSocketClient? client)) + return SendThenReturnAsync(new SendMessage(commandResult), cancellationToken, client); + else + return Task.FromResult(new OperResult(FoundationConst.DtuNoConnectedWaining)); + } + else + return SendThenReturnAsync(new SendMessage(commandResult), cancellationToken); + } } [PluginOption(Singleton = true)]