From 705743e5f16a9d8e1e67a2cd6a3eefea5eb2198c Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Thu, 12 Jul 2018 20:49:32 +0200 Subject: [PATCH 1/3] Convert bitNumber '-1' to 0 in DataItem --- S7.Net/Types/DataItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/S7.Net/Types/DataItem.cs b/S7.Net/Types/DataItem.cs index c40a604..ca338c8 100644 --- a/S7.Net/Types/DataItem.cs +++ b/S7.Net/Types/DataItem.cs @@ -68,7 +68,7 @@ namespace S7.Net.Types DB = dbNumber, VarType = varType, StartByteAdr = startByte, - BitAdr = (byte) bitNumber + BitAdr = (byte) (bitNumber == -1 ? 0 : bitNumber) }; } From ab486e3d1f1f986d2f72f576ce52d37d0300f0c6 Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Thu, 12 Jul 2018 20:51:20 +0200 Subject: [PATCH 2/3] Only set bitNumber in address for Write when a bit is written --- S7.Net/Protocol/S7WriteMultiple.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/S7.Net/Protocol/S7WriteMultiple.cs b/S7.Net/Protocol/S7WriteMultiple.cs index f5f32bd..c117340 100644 --- a/S7.Net/Protocol/S7WriteMultiple.cs +++ b/S7.Net/Protocol/S7WriteMultiple.cs @@ -30,13 +30,13 @@ namespace S7.Net.Protocol Serialization.SetWordAt(message, paramOffset + Parameter.Offsets.Amount, (ushort) value.Length); Serialization.SetWordAt(message, paramOffset + Parameter.Offsets.DbNumber, (ushort) item.DB); message[paramOffset + Parameter.Offsets.Area] = (byte) item.DataType; - Serialization.SetAddressAt(message, paramOffset + Parameter.Offsets.Address, item.StartByteAdr, item.BitAdr); - - paramOffset += Parameter.Template.Length; data.Add(0x00); if (item.Value is bool b) { + Serialization.SetAddressAt(message, paramOffset + Parameter.Offsets.Address, item.StartByteAdr, + item.BitAdr); + data.Add(0x03); data.AddWord(1); @@ -45,6 +45,8 @@ namespace S7.Net.Protocol } else { + Serialization.SetAddressAt(message, paramOffset + Parameter.Offsets.Address, item.StartByteAdr, 0); + var len = value.Length; data.Add(0x04); data.AddWord((ushort) (len << 3)); @@ -55,8 +57,9 @@ namespace S7.Net.Protocol data.Add(0); } } - } + paramOffset += Parameter.Template.Length; + } message.Add(data.Array); From e44cb1571c6924486d32f292ef994c9947dc750f Mon Sep 17 00:00:00 2001 From: Michael Croes Date: Thu, 12 Jul 2018 20:51:37 +0200 Subject: [PATCH 3/3] Validate BitAdr when writing a bit --- S7.Net/Protocol/S7WriteMultiple.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/S7.Net/Protocol/S7WriteMultiple.cs b/S7.Net/Protocol/S7WriteMultiple.cs index c117340..6773a0f 100644 --- a/S7.Net/Protocol/S7WriteMultiple.cs +++ b/S7.Net/Protocol/S7WriteMultiple.cs @@ -34,6 +34,10 @@ namespace S7.Net.Protocol data.Add(0x00); if (item.Value is bool b) { + if (item.BitAdr > 7) + throw new ArgumentException( + $"Cannot read bit with invalid {nameof(item.BitAdr)} '{item.BitAdr}'.", nameof(dataItems)); + Serialization.SetAddressAt(message, paramOffset + Parameter.Offsets.Address, item.StartByteAdr, item.BitAdr);