From 0d1bc472c8f7c718cced1717d8dc3b8621888d34 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 27 Apr 2018 16:00:41 +0200 Subject: [PATCH] Added BitAdr to DataItem and fixed bug in ReadMultipleVars on VarType.Bit --- S7.Net.UnitTest/S7NetTests.cs | 64 +++++++++++++++++++++++++++++------ S7.Net/PLC.cs | 18 ++++++++-- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/S7.Net.UnitTest/S7NetTests.cs b/S7.Net.UnitTest/S7NetTests.cs index 8cb75df..107a90f 100644 --- a/S7.Net.UnitTest/S7NetTests.cs +++ b/S7.Net.UnitTest/S7NetTests.cs @@ -386,19 +386,42 @@ namespace S7.Net.UnitTest { Assert.IsTrue(plc.IsConnected, "Before executing this test, the plc must be connected. Check constructor."); - ushort val = 16384; - plc.Write("DB2.DBW16384", val); - ushort result = (ushort)plc.Read("DB2.DBW16384"); - Assert.AreEqual(val, result, "A ushort goes from 0 to 64512"); + bool val = true; + plc.Write("DB2.DBX0.5", val); + bool result = (bool)plc.Read("DB2.DBX0.5"); + Assert.AreEqual(val, result); - ushort val2 = 129; - plc.Write("DB2.DBW16", val2); - ushort result2 = (ushort)plc.Read("DB2.DBW16"); - Assert.AreEqual(val2, result2, "A ushort goes from 0 to 64512"); + ushort val1 = 16384; + plc.Write("DB2.DBW16384", val1); + ushort result1 = (ushort)plc.Read("DB2.DBW16384"); + Assert.AreEqual(val1, result1, "A ushort goes from 0 to 64512"); + + bool val2 = true; + plc.Write("DB2.DBX8192.7", val2); + bool result2 = (bool)plc.Read("DB2.DBX8192.7"); + Assert.AreEqual(val2, result2); + + ushort val3 = 129; + plc.Write("DB2.DBW16", val3); + ushort result3 = (ushort)plc.Read("DB2.DBW16"); + Assert.AreEqual(val3, result3, "A ushort goes from 0 to 64512"); + + bool val4 = true; + plc.Write("DB2.DBX16384.6", val4); + bool result4 = (bool)plc.Read("DB2.DBX16384.6"); + Assert.AreEqual(val4, result4); var dataItems = new List() { new DataItem + { + Count = 1, + DataType = DataType.DataBlock, + DB = 2, + StartByteAdr = 0, + BitAdr = 5, + VarType = VarType.Bit + },new DataItem { Count = 1, DataType = DataType.DataBlock, @@ -407,19 +430,40 @@ namespace S7.Net.UnitTest VarType = VarType.Word }, new DataItem + { + Count = 1, + DataType = DataType.DataBlock, + DB = 2, + StartByteAdr = 8192, + BitAdr = 7, + VarType = VarType.Bit + }, + new DataItem { Count = 1, DataType = DataType.DataBlock, DB = 2, StartByteAdr = 16, VarType = VarType.Word - } + }, + new DataItem + { + Count = 1, + DataType = DataType.DataBlock, + DB = 2, + StartByteAdr = 16384, + BitAdr = 6, + VarType = VarType.Bit + }, }; plc.ReadMultipleVars(dataItems); Assert.AreEqual(dataItems[0].Value, val); - Assert.AreEqual(dataItems[1].Value, val2); + Assert.AreEqual(dataItems[1].Value, val1); + Assert.AreEqual(dataItems[2].Value, val2); + Assert.AreEqual(dataItems[3].Value, val3); + Assert.AreEqual(dataItems[4].Value, val4); } /// diff --git a/S7.Net/PLC.cs b/S7.Net/PLC.cs index 67ad57a..de498cd 100644 --- a/S7.Net/PLC.cs +++ b/S7.Net/PLC.cs @@ -301,9 +301,16 @@ namespace S7.Net if (bReceive[21] != 0xff) throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); - int offset = 25; + int offset = 21; foreach (var dataItem in dataItems) { + // check for Return Code = Success + if (bReceive[offset] != 0xff) + throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString()); + + // to Data bytes + offset += 4; + int byteCnt = VarTypeToByteLength(dataItem.VarType, dataItem.Count); byte[] bytes = new byte[byteCnt]; @@ -312,9 +319,14 @@ namespace S7.Net bytes[i] = bReceive[i + offset]; } - offset += byteCnt + 4; + // next Item + offset += byteCnt; - dataItem.Value = ParseBytes(dataItem.VarType, bytes, dataItem.Count); + // Fill byte in response + if (dataItem.VarType == VarType.Bit) + offset++; + + dataItem.Value = ParseBytes(dataItem.VarType, bytes, dataItem.Count, dataItem.BitAdr); } } catch (SocketException socketException)