diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs index 92c3697..06d3f29 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs @@ -12,6 +12,7 @@ namespace Modbus.Net.Siemens /// /// 构造函数 /// + /// 设备id号 /// 连接类型 /// 连接地址 /// 设备类型 @@ -19,11 +20,13 @@ namespace Modbus.Net.Siemens /// 是否保持连接 /// 从站号 /// 主站号 + /// 本机模块位,0到7,仅200使用,其它型号不要填写 + /// PLC模块位,0到7,仅200使用,其它型号不要填写 public SiemensMachine(TKey id, SiemensType connectionType, string connectionString, SiemensMachineModel model, - IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress) + IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress, byte src = 1, byte dst = 0) : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { - BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); + BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress, src, dst); AddressFormater = new AddressFormaterSiemens(); AddressCombiner = new AddressCombinerContinus(AddressTranslator, 100); AddressCombinerSet = new AddressCombinerContinus(AddressTranslator, 100); @@ -32,15 +35,18 @@ namespace Modbus.Net.Siemens /// /// 构造函数 /// + /// 设备id号 /// 连接类型 /// 连接地址 /// 设备类型 /// 读写的地址 /// 从站号 /// 主站号 + /// 本机模块位,0到7,仅200使用,其它型号不要填写 + /// PLC模块位,0到7,仅200使用,其它型号不要填写 public SiemensMachine(TKey id, SiemensType connectionType, string connectionString, SiemensMachineModel model, - IEnumerable> getAddresses, byte slaveAddress, byte masterAddress) - : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) + IEnumerable> getAddresses, byte slaveAddress, byte masterAddress, byte src = 1, byte dst = 0) + : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress, src, dst) { } } @@ -53,6 +59,7 @@ namespace Modbus.Net.Siemens /// /// 构造函数 /// + /// 设备id号 /// 连接类型 /// 连接地址 /// 设备类型 @@ -60,11 +67,13 @@ namespace Modbus.Net.Siemens /// 是否保持连接 /// 从站号 /// 主站号 + /// 本机模块位,0到7,仅200使用,其它型号不要填写 + /// PLC模块位,0到7,仅200使用,其它型号不要填写 public SiemensMachine(string id, SiemensType connectionType, string connectionString, SiemensMachineModel model, - IEnumerable getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress) + IEnumerable getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress, byte src = 1, byte dst = 0) : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { - BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); + BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress, src, dst); AddressFormater = new AddressFormaterSiemens(); AddressCombiner = new AddressCombinerContinus(AddressTranslator, 100); AddressCombinerSet = new AddressCombinerContinus(AddressTranslator, 100); @@ -73,15 +82,18 @@ namespace Modbus.Net.Siemens /// /// 构造函数 /// + /// 设备id号 /// 连接类型 /// 连接地址 /// 设备类型 /// 读写的地址 /// 从站号 /// 主站号 + /// 本机模块位,0到7,仅200使用,其它型号不要填写 + /// PLC模块位,0到7,仅200使用,其它型号不要填写 public SiemensMachine(string id, SiemensType connectionType, string connectionString, SiemensMachineModel model, - IEnumerable getAddresses, byte slaveAddress, byte masterAddress) - : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) + IEnumerable getAddresses, byte slaveAddress, byte masterAddress, byte src = 1, byte dst = 0) + : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress, src, dst) { } } diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs index b3762fa..b6a75a4 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs @@ -66,6 +66,8 @@ namespace Modbus.Net.Siemens private readonly byte _tdpuSize; private readonly ushort _tsapDst; + private ushort _sendCount; + private SiemensType _siemensType; /// @@ -76,8 +78,10 @@ namespace Modbus.Net.Siemens /// 设备类型 /// 从站地址 /// 主站地址 + /// 本机模块位,0到7,仅200使用,其它型号不要填写 + /// PLC模块位,0到7,仅200使用,其它型号不要填写 public SiemensUtility(SiemensType connectionType, string connectionString, SiemensMachineModel model, - byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) + byte slaveAddress, byte masterAddress, byte src = 1, byte dst = 0) : base(slaveAddress, masterAddress) { ConnectionString = connectionString; switch (model) @@ -85,8 +89,8 @@ namespace Modbus.Net.Siemens case SiemensMachineModel.S7_200: { _tdpuSize = 0x09; - _taspSrc = 0x1001; - _tsapDst = 0x1000; + _taspSrc = (ushort)(0x1000 + src); + _tsapDst = (ushort)(0x1000 + dst); _maxCalling = 0x0001; _maxCalled = 0x0001; _maxPdu = 0x03c0; @@ -131,6 +135,7 @@ namespace Modbus.Net.Siemens } ConnectionType = connectionType; AddressTranslator = new AddressTranslatorSiemens(); + _sendCount = 0; } /// @@ -231,8 +236,9 @@ namespace Modbus.Net.Siemens { try { + _sendCount = (ushort)(_sendCount % 65535 + 1); var readRequestSiemensInputStruct = new ReadRequestSiemensInputStruct(SlaveAddress, MasterAddress, - 0xd3c7, SiemensTypeCode.Byte, startAddress, (ushort) getByteCount, AddressTranslator); + _sendCount, SiemensTypeCode.Byte, startAddress, (ushort) getByteCount, AddressTranslator); var readRequestSiemensOutputStruct = await Wrapper.SendReceiveAsync( @@ -257,8 +263,9 @@ namespace Modbus.Net.Siemens { try { + _sendCount = (ushort)(_sendCount % 65535 + 1); var writeRequestSiemensInputStruct = new WriteRequestSiemensInputStruct(SlaveAddress, MasterAddress, - 0xd3c8, startAddress, setContents, AddressTranslator); + _sendCount, startAddress, setContents, AddressTranslator); var writeRequestSiemensOutputStruct = await Wrapper.SendReceiveAsync(