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)