ppi fix
This commit is contained in:
@@ -73,25 +73,12 @@ namespace Modbus.Net.Siemens
|
||||
/// <returns>是否连接成功</returns>
|
||||
public override async Task<bool> 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<ComConfirmMessageSiemensOutputStruct>();
|
||||
if (outputStruct == null && ProtocolLinker.IsConnected)
|
||||
{
|
||||
ProtocolLinker.Disconnect();
|
||||
}
|
||||
}
|
||||
return outputStruct != null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
/// <param name="com">串口地址</param>
|
||||
/// <param name="slaveAddress">从站号</param>
|
||||
public SiemensPpiProtocolLinker(string com, int slaveAddress)
|
||||
: base(com, slaveAddress)
|
||||
: base(com, slaveAddress, parity:Parity.Even)
|
||||
{
|
||||
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
|
||||
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")),
|
||||
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 1 }, 6),
|
||||
lengthCalc: content =>
|
||||
{
|
||||
if (content[0] == 0x10)
|
||||
return 6;
|
||||
else if (content[0] == 0xE5)
|
||||
return 1;
|
||||
else
|
||||
return DuplicateWithCount.GetDuplcateFunc(new List<int> { 1 }, 6)(content);
|
||||
},
|
||||
checkRightFunc: ContentCheck.FcsCheckRight,
|
||||
waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ?
|
||||
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) :
|
||||
|
||||
@@ -433,24 +433,36 @@ namespace Modbus.Net
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -8,12 +8,18 @@ namespace Modbus.Net.Tests
|
||||
{
|
||||
private BaseMachine<string, string>? _siemensTcpMachine;
|
||||
|
||||
private BaseMachine<string, string>? _siemensPpiMachine;
|
||||
|
||||
private string _machineIp = "10.10.18.251";
|
||||
|
||||
private string _machineCom = "COM11";
|
||||
|
||||
[TestInitialize]
|
||||
public void Init()
|
||||
{
|
||||
_siemensTcpMachine = new SiemensMachine<string, string>("1", SiemensType.Tcp, _machineIp, SiemensMachineModel.S7_1200, null, true, 2, 0);
|
||||
|
||||
_siemensPpiMachine = new SiemensMachine<string, string>("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<string, double>()
|
||||
{
|
||||
@@ -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<string, double>()
|
||||
{
|
||||
@@ -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<string, double>()
|
||||
{
|
||||
{
|
||||
"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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user