From 688d4e2a28fcfd26355c951987472c01024f1ecd Mon Sep 17 00:00:00 2001 From: Serge Camille Date: Mon, 17 Aug 2020 21:46:20 +0200 Subject: [PATCH] Change implementation header package creation for reading bytes. Use MemoryStream as well. --- S7.Net/PLCHelpers.cs | 43 +++++++++++++++++---------------------- S7.Net/PlcAsynchronous.cs | 20 ++++++++++-------- S7.Net/PlcSynchronous.cs | 18 ++++++++-------- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs index 2286264..9325f8a 100644 --- a/S7.Net/PLCHelpers.cs +++ b/S7.Net/PLCHelpers.cs @@ -1,4 +1,5 @@ -using S7.Net.Types; +using S7.Net.Helper; +using S7.Net.Types; using System; using System.Collections.Generic; using System.Linq; @@ -13,21 +14,18 @@ namespace S7.Net /// /// /// - private ByteArray ReadHeaderPackage(int amount = 1) + private void BuildHeaderPackage(System.IO.MemoryStream stream, int amount = 1) { //header size = 19 bytes - var package = new Types.ByteArray(19); - package.Add(new byte[] { 0x03, 0x00 }); + stream.WriteByteArray(new byte[] { 0x03, 0x00 }); //complete package size - package.Add(Types.Int.ToByteArray((short)(19 + (12 * amount)))); - package.Add(new byte[] { 0x02, 0xf0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00 }); + stream.WriteByteArray(Types.Int.ToByteArray((short)(19 + (12 * amount)))); + stream.WriteByteArray(new byte[] { 0x02, 0xf0, 0x80, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00 }); //data part size - package.Add(Types.Word.ToByteArray((ushort)(2 + (amount * 12)))); - package.Add(new byte[] { 0x00, 0x00, 0x04 }); + stream.WriteByteArray(Types.Word.ToByteArray((ushort)(2 + (amount * 12)))); + stream.WriteByteArray(new byte[] { 0x00, 0x00, 0x04 }); //amount of requests - package.Add((byte)amount); - - return package; + stream.WriteByte((byte)amount); } /// @@ -39,39 +37,36 @@ namespace S7.Net /// Start address of the byte /// Number of bytes to be read /// - private ByteArray CreateReadDataRequestPackage(DataType dataType, int db, int startByteAdr, int count = 1) + private void BuildReadDataRequestPackage(System.IO.MemoryStream stream, DataType dataType, int db, int startByteAdr, int count = 1) { //single data req = 12 - var package = new Types.ByteArray(12); - package.Add(new byte[] { 0x12, 0x0a, 0x10 }); + stream.WriteByteArray(new byte[] { 0x12, 0x0a, 0x10 }); switch (dataType) { case DataType.Timer: case DataType.Counter: - package.Add((byte)dataType); + stream.WriteByte((byte)dataType); break; default: - package.Add(0x02); + stream.WriteByte(0x02); break; } - package.Add(Word.ToByteArray((ushort)(count))); - package.Add(Word.ToByteArray((ushort)(db))); - package.Add((byte)dataType); + stream.WriteByteArray(Word.ToByteArray((ushort)(count))); + stream.WriteByteArray(Word.ToByteArray((ushort)(db))); + stream.WriteByte((byte)dataType); var overflow = (int)(startByteAdr * 8 / 0xffffU); // handles words with address bigger than 8191 - package.Add((byte)overflow); + stream.WriteByte((byte)overflow); switch (dataType) { case DataType.Timer: case DataType.Counter: - package.Add(Types.Word.ToByteArray((ushort)(startByteAdr))); + stream.WriteByteArray(Types.Word.ToByteArray((ushort)(startByteAdr))); break; default: - package.Add(Types.Word.ToByteArray((ushort)((startByteAdr) * 8))); + stream.WriteByteArray(Types.Word.ToByteArray((ushort)((startByteAdr) * 8))); break; } - - return package; } /// diff --git a/S7.Net/PlcAsynchronous.cs b/S7.Net/PlcAsynchronous.cs index 61727ae..35265c8 100644 --- a/S7.Net/PlcAsynchronous.cs +++ b/S7.Net/PlcAsynchronous.cs @@ -222,15 +222,16 @@ namespace S7.Net { // first create the header int packageSize = 19 + (dataItems.Count * 12); - ByteArray package = new ByteArray(packageSize); - package.Add(ReadHeaderPackage(dataItems.Count)); + var package = new System.IO.MemoryStream(packageSize); + BuildHeaderPackage(package, dataItems.Count); // package.Add(0x02); // datenart foreach (var dataItem in dataItems) { - package.Add(CreateReadDataRequestPackage(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count))); + BuildReadDataRequestPackage(package, dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count)); } - await stream.WriteAsync(package.Array, 0, package.Array.Length); + var dataToSend = package.ToArray(); + await stream.WriteAsync(dataToSend, 0, dataToSend.Length); var s7data = await COTP.TSDU.ReadAsync(stream); //TODO use Async if (s7data == null || s7data[14] != 0xff) @@ -390,13 +391,14 @@ namespace S7.Net byte[] bytes = new byte[count]; // first create the header - int packageSize = 31; - ByteArray package = new ByteArray(packageSize); - package.Add(ReadHeaderPackage()); + int packageSize = 31; + var package = new System.IO.MemoryStream(packageSize); + BuildHeaderPackage(package); // package.Add(0x02); // datenart - package.Add(CreateReadDataRequestPackage(dataType, db, startByteAdr, count)); + BuildReadDataRequestPackage(package, dataType, db, startByteAdr, count); - await stream.WriteAsync(package.Array, 0, package.Array.Length); + var dataToSend = package.ToArray(); + await stream.WriteAsync(dataToSend, 0, dataToSend.Length); var s7data = await COTP.TSDU.ReadAsync(stream); AssertReadResponse(s7data, count); diff --git a/S7.Net/PlcSynchronous.cs b/S7.Net/PlcSynchronous.cs index 367c572..f73bd6f 100644 --- a/S7.Net/PlcSynchronous.cs +++ b/S7.Net/PlcSynchronous.cs @@ -349,12 +349,13 @@ namespace S7.Net { // first create the header int packageSize = 31; - ByteArray package = new ByteArray(packageSize); - package.Add(ReadHeaderPackage()); + var package = new System.IO.MemoryStream(packageSize); + BuildHeaderPackage(package); // package.Add(0x02); // datenart - package.Add(CreateReadDataRequestPackage(dataType, db, startByteAdr, count)); + BuildReadDataRequestPackage(package, dataType, db, startByteAdr, count); - stream.Write(package.Array, 0, package.Array.Length); + var dataToSend = package.ToArray(); + stream.Write(dataToSend, 0, dataToSend.Length); var s7data = COTP.TSDU.Read(stream); AssertReadResponse(s7data, count); @@ -516,15 +517,16 @@ namespace S7.Net { // first create the header int packageSize = 19 + (dataItems.Count * 12); - ByteArray package = new ByteArray(packageSize); - package.Add(ReadHeaderPackage(dataItems.Count)); + var package = new System.IO.MemoryStream(packageSize); + BuildHeaderPackage(package, dataItems.Count); // package.Add(0x02); // datenart foreach (var dataItem in dataItems) { - package.Add(CreateReadDataRequestPackage(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count))); + BuildReadDataRequestPackage(package, dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count)); } - stream.Write(package.Array, 0, package.Array.Length); + var dataToSend = package.ToArray(); + stream.Write(dataToSend, 0, dataToSend.Length); var s7data = COTP.TSDU.Read(stream); //TODO use Async if (s7data == null || s7data[14] != 0xff)