diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs index 8110d40..2e2c23a 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs @@ -137,8 +137,7 @@ namespace Modbus.Net.Modbus var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress, (ushort) getByteCount, AddressTranslator); var outputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof (ReadDataModbusProtocal)], inputStruct) as - ReadDataModbusOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof (ReadDataModbusProtocal)], inputStruct); return outputStruct?.DataValue; } catch @@ -160,8 +159,7 @@ namespace Modbus.Net.Modbus var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents, AddressTranslator, Endian); var outputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct) as - WriteDataModbusOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct); return outputStruct?.WriteCount == setContents.Length; } catch @@ -181,8 +179,7 @@ namespace Modbus.Net.Modbus { var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress); var outputStruct = - Wrapper.SendReceive(Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct) as - GetSystemTimeModbusOutputStruct; + Wrapper.SendReceive(Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct); return outputStruct?.Time; } catch (Exception) @@ -202,8 +199,7 @@ namespace Modbus.Net.Modbus { var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime); var outputStruct = - Wrapper.SendReceive(Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct) as - SetSystemTimeModbusOutputStruct; + Wrapper.SendReceive(Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct); return outputStruct?.WriteCount > 0; } catch (Exception) diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs index 0cd1d63..18e3fa3 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs @@ -33,8 +33,7 @@ namespace Modbus.Net.OPC var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress, split.ToString()); var readRequestOpcOutputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof(ReadRequestOpcProtocal)], readRequestOpcInputStruct) as - ReadRequestOpcOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof(ReadRequestOpcProtocal)], readRequestOpcInputStruct); return readRequestOpcOutputStruct?.GetValue; } catch (Exception) @@ -51,8 +50,7 @@ namespace Modbus.Net.OPC var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress, split.ToString(), setContents[0]); var writeRequestOpcOutputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocal)], writeRequestOpcInputStruct) - as WriteRequestOpcOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocal)], writeRequestOpcInputStruct); return writeRequestOpcOutputStruct?.WriteResult == true; } catch (Exception e) diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs index fa7e63f..622422f 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs @@ -183,8 +183,8 @@ namespace Modbus.Net.Siemens 0xd3c7, SiemensTypeCode.Byte, startAddress, (ushort) getByteCount, AddressTranslator); var readRequestSiemensOutputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof (ReadRequestSiemensProtocal)], - readRequestSiemensInputStruct) as ReadRequestSiemensOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof (ReadRequestSiemensProtocal)], + readRequestSiemensInputStruct); return readRequestSiemensOutputStruct?.GetValue; } catch (Exception) @@ -207,8 +207,8 @@ namespace Modbus.Net.Siemens 0xd3c8, startAddress, setContents, AddressTranslator); var writeRequestSiemensOutputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof (WriteRequestSiemensProtocal)], - writeRequestSiemensInputStruct) as WriteRequestSiemensOutputStruct; + Wrapper.SendReceiveAsync(Wrapper[typeof (WriteRequestSiemensProtocal)], + writeRequestSiemensInputStruct); return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError; } catch (Exception) diff --git a/Modbus.Net/src/Base.Common/BaseProtocal.cs b/Modbus.Net/src/Base.Common/BaseProtocal.cs index 53816a6..4b473bc 100644 --- a/Modbus.Net/src/Base.Common/BaseProtocal.cs +++ b/Modbus.Net/src/Base.Common/BaseProtocal.cs @@ -109,6 +109,18 @@ namespace Modbus.Net return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); } + /// + /// 发送协议,通过传入需要使用的协议内容和输入结构 + /// + /// 协议的实例 + /// 输入信息的结构化描述 + /// 输出信息的结构化描述 + /// IOutputStruct的具体类型 + public virtual T SendReceive(ProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct + { + return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); + } + /// /// 发送协议,通过传入需要使用的协议内容和输入结构 /// @@ -117,28 +129,40 @@ namespace Modbus.Net /// 输出信息的结构化描述 public virtual async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content) { - var t = 0; - var formatContent = unit.Format(content); - if (formatContent != null) - { - byte[] receiveContent; - //如果为特别处理协议的话,跳过协议扩展收缩 - if (unit is ISpecialProtocalUnit) - { - receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent); - } - else - { - receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent); - } - if (receiveContent != null) - { - return unit.Unformat(receiveContent, ref t); - } - } - return null; + return await SendReceiveAsync(unit, content); } + /// + /// 发送协议,通过传入需要使用的协议内容和输入结构 + /// + /// 协议的实例 + /// 输入信息的结构化描述 + /// 输出信息的结构化描述 + /// IOutputStruct的具体类型 + public virtual async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct + { + var t = 0; + var formatContent = unit.Format(content); + if (formatContent != null) + { + byte[] receiveContent; + //如果为特别处理协议的话,跳过协议扩展收缩 + if (unit is ISpecialProtocalUnit) + { + receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent); + } + else + { + receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent); + } + if (receiveContent != null) + { + return unit.Unformat(receiveContent, ref t); + } + } + return null; + } + /// /// 协议连接开始 /// diff --git a/Modbus.Net/src/Base.Common/ProtocalUnit.cs b/Modbus.Net/src/Base.Common/ProtocalUnit.cs index f73c619..fc9418c 100644 --- a/Modbus.Net/src/Base.Common/ProtocalUnit.cs +++ b/Modbus.Net/src/Base.Common/ProtocalUnit.cs @@ -12,12 +12,23 @@ namespace Modbus.Net /// public Endian Endian { get; set; } = Endian.BigEndianLsb; - /// - /// 从输入结构格式化 - /// s - /// 结构化的输入数据 - /// 格式化后的字节流 - public abstract byte[] Format(IInputStruct message); + /// + /// 从输入结构格式化 + /// s + /// 结构化的输入数据 + /// 格式化后的字节流 + public abstract byte[] Format(IInputStruct message); + + /// + /// 从输入结构格式化 + /// + /// 结构化的输入数据 + /// IInputStruct的具体类型 + /// 格式化后的字节流 + public byte[] Format(T message) where T : IInputStruct + { + return Format(message); + } /// /// 从对象的参数数组格式化 @@ -29,13 +40,25 @@ namespace Modbus.Net return TranslateContent(Endian, message); } - /// - /// 把仪器返回的内容填充到输出结构中 - /// - /// 返回数据的字节流 - /// 转换标记位 - /// 结构化的输出数据 - public abstract IOutputStruct Unformat(byte[] messageBytes, ref int pos); + /// + /// 把仪器返回的内容填充到输出结构中 + /// + /// 返回数据的字节流 + /// 转换标记位 + /// 结构化的输出数据 + public abstract IOutputStruct Unformat(byte[] messageBytes, ref int pos); + + /// + /// 把仪器返回的内容填充到输出结构中 + /// + /// 返回数据的字节流 + /// 转换标记位 + /// IOutputStruct的具体类型 + /// 结构化的输出数据 + public T Unformat(byte[] messageBytes, ref int pos) where T : class, IOutputStruct + { + return Unformat(messageBytes, ref pos) as T; + } /// /// 转换静态方法,把对象数组转换为字节数组。