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();
}
}
}