diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocol.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocol.cs index 0c3e62b..2ddf9d5 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocol.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocol.cs @@ -73,25 +73,12 @@ namespace Modbus.Net.Siemens /// 是否连接成功 public override async Task ConnectAsync() { - IOutputStruct outputStruct; using (await _lock.LockAsync()) { if (ProtocolLinker.IsConnected) return true; if (!await ProtocolLinker.ConnectAsync()) return false; - var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress); - outputStruct = - (await (await - ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocol)], - inputStruct)).SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocol)], answer => - answer != null - ? new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress) - : null)).Unwrap(); - if (outputStruct == null && ProtocolLinker.IsConnected) - { - ProtocolLinker.Disconnect(); - } } - return outputStruct != null; + return true; } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs index 77b3657..d0f44f9 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; - +using System.IO.Ports; namespace Modbus.Net.Siemens { @@ -16,11 +16,19 @@ namespace Modbus.Net.Siemens /// 串口地址 /// 从站号 public SiemensPpiProtocolLinker(string com, int slaveAddress) - : base(com, slaveAddress) + : base(com, slaveAddress, parity:Parity.Even) { ((IConnectorWithController)BaseConnector).AddController(new FifoController( int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), - lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 1 }, 6), + lengthCalc: content => + { + if (content[0] == 0x10) + return 6; + else if (content[0] == 0xE5) + return 1; + else + return DuplicateWithCount.GetDuplcateFunc(new List { 1 }, 6)(content); + }, checkRightFunc: ContentCheck.FcsCheckRight, waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : diff --git a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs index 86fd31f..0a1b1c6 100644 --- a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs +++ b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs @@ -433,24 +433,36 @@ namespace Modbus.Net /// protected void CheckOpen() { - if (!SerialPort.IsOpen) + if (SerialPort == null) { try { - SerialPort.Open(); + Connect(); } - catch (Exception err) + catch (Exception err1) { - logger.LogError(err, "Com client {ConnectionToken} open error", _com); + logger.LogError(err1, "Com client {ConnectionToken} open error", _com); Dispose(); + } + if (!SerialPort.IsOpen) + { try { - SerialPort.Open(); + Connect(); } catch (Exception err2) { logger.LogError(err2, "Com client {ConnectionToken} open error", _com); Dispose(); + try + { + Connect(); + } + catch (Exception err3) + { + logger.LogError(err3, "Com client {ConnectionToken} open error", _com); + Dispose(); + } } } } diff --git a/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs b/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs index 3c5a6a7..895db77 100644 --- a/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs +++ b/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs @@ -58,7 +58,9 @@ namespace Modbus.Net public static bool? FcsCheckRight(byte[] content) { var fcsCheck = 0; - for (var i = 4; i < content.Length - 2; i++) + var start = content[0] == 0x10 ? 1 : 4; + if (content[0] == 0xE5) return true; + for (var i = start; i < content.Length - 2; i++) fcsCheck += content[i]; fcsCheck = fcsCheck % 256; if (fcsCheck != content[content.Length - 2]) return false; diff --git a/Samples/MachineJob/appsettings.json b/Samples/MachineJob/appsettings.json index aa4b476..62dd01d 100644 --- a/Samples/MachineJob/appsettings.json +++ b/Samples/MachineJob/appsettings.json @@ -36,7 +36,7 @@ "h:slaveAddress": 1, "i:masterAddress": 2, "j:src": 1, - "k:dst": 0 + "k:dst": 0 }, { "a:id": "ModbusMachine2", @@ -48,6 +48,19 @@ "g:slaveAddress": 3, "h:masterAddress": 2, "i:endian": "BigEndianLsb" + }, + { + "a:id": "SiemensMachine2", + "b:protocol": "Siemens", + "c:type": "Ppi", + "d:connectionString": "COM11", + "e:model": "S7_200", + "f:addressMap": "AddressMapSiemens", + "g:keepConnect": true, + "h:slaveAddress": 2, + "i:masterAddress": 0, + "j:src": 1, + "k:dst": 0 } ], "addressMap": { diff --git a/Tests/Modbus.Net.Tests/SiemensTest.cs b/Tests/Modbus.Net.Tests/SiemensTest.cs index 4f4e6e3..adf60ce 100644 --- a/Tests/Modbus.Net.Tests/SiemensTest.cs +++ b/Tests/Modbus.Net.Tests/SiemensTest.cs @@ -8,12 +8,18 @@ namespace Modbus.Net.Tests { private BaseMachine? _siemensTcpMachine; + private BaseMachine? _siemensPpiMachine; + private string _machineIp = "10.10.18.251"; + private string _machineCom = "COM11"; + [TestInitialize] public void Init() { _siemensTcpMachine = new SiemensMachine("1", SiemensType.Tcp, _machineIp, SiemensMachineModel.S7_1200, null, true, 2, 0); + + _siemensPpiMachine = new SiemensMachine("2", SiemensType.Ppi, _machineCom, SiemensMachineModel.S7_200, null, true, 2, 0, 1, 0); } [TestMethod] @@ -43,9 +49,14 @@ namespace Modbus.Net.Tests _siemensTcpMachine!.GetAddresses = addresses; await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + _siemensPpiMachine!.GetAddresses = addresses; + await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans.Datas["Q 0.0"].DeviceValue, dic1["Q 0.0"]); + Assert.AreEqual(ans2.Datas["Q 0.0"].DeviceValue, dic1["Q 0.0"]); } [TestMethod] @@ -65,8 +76,13 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine!.GetAddresses = addresses; + _siemensPpiMachine!.GetAddresses = addresses; + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans.Datas["I 0.0"].DeviceValue, 0); + Assert.AreEqual(ans2.Datas["I 0.0"].DeviceValue, 0); } [TestMethod] @@ -88,6 +104,7 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine!.GetAddresses = addresses; + _siemensPpiMachine!.GetAddresses = addresses; var dic1 = new Dictionary() { @@ -97,8 +114,13 @@ namespace Modbus.Net.Tests }; await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0"]); + Assert.AreEqual(ans2.Datas["M 0.0"].DeviceValue, dic1["M 0"]); } [TestMethod] @@ -120,6 +142,7 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine!.GetAddresses = addresses; + _siemensPpiMachine!.GetAddresses = addresses; var dic1 = new Dictionary() { @@ -129,9 +152,13 @@ namespace Modbus.Net.Tests }; await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address); + Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0.0"]); + Assert.AreEqual(ans2.Datas["M 0.0"].DeviceValue, dic1["M 0.0"]); } [TestMethod] @@ -144,7 +171,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "0", - Area = "DB2", + Area = "DB1", Address = 0, SubAddress = 0, CommunicationTag = "A1", @@ -155,15 +182,21 @@ namespace Modbus.Net.Tests var dic1 = new Dictionary() { { - "DB2 0.0", r.Next(0, UInt16.MaxValue) + "DB1 0.0", r.Next(0, UInt16.MaxValue) } }; _siemensTcpMachine!.GetAddresses = addresses; + _siemensPpiMachine!.GetAddresses = addresses; + await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); + await _siemensPpiMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans.Datas["DB2 0.0"].DeviceValue, dic1["DB2 0.0"]); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.Address); + + Assert.AreEqual(ans.Datas["DB1 0.0"].DeviceValue, dic1["DB1 0.0"]); + Assert.AreEqual(ans2.Datas["DB1 0.0"].DeviceValue, dic1["DB1 0.0"]); } [TestMethod] @@ -176,7 +209,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "0", - Area = "DB2", + Area = "DB1", Address = 2, SubAddress = 0, CommunicationTag = "A1", @@ -185,7 +218,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "1", - Area = "DB2", + Area = "DB1", Address = 4, SubAddress = 0, CommunicationTag = "A2", @@ -194,7 +227,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "2", - Area = "DB2", + Area = "DB1", Address = 6, SubAddress = 0, CommunicationTag = "A3", @@ -203,7 +236,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "3", - Area = "DB2", + Area = "DB1", Address = 8, SubAddress = 0, CommunicationTag = "A4", @@ -212,7 +245,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "4", - Area = "DB2", + Area = "DB1", Address = 10, SubAddress = 0, CommunicationTag = "A5", @@ -221,7 +254,7 @@ namespace Modbus.Net.Tests new AddressUnit { Id = "5", - Area = "DB2", + Area = "DB1", Address = 14, SubAddress = 0, CommunicationTag = "A6", @@ -252,20 +285,35 @@ namespace Modbus.Net.Tests }; _siemensTcpMachine!.GetAddresses = addresses; + _siemensPpiMachine!.GetAddresses = addresses; + await _siemensTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + await _siemensPpiMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); + var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.CommunicationTag); + var ans2 = await _siemensPpiMachine.GetDatasAsync(MachineDataType.CommunicationTag); + Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); + + Assert.AreEqual(ans2.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2.Datas["A6"].DeviceValue, dic1["A6"]); } [TestCleanup] public void MachineClean() { _siemensTcpMachine!.Disconnect(); + + _siemensPpiMachine!.Disconnect(); } } }