mirror of
https://github.com/S7NetPlus/s7netplus.git
synced 2026-02-17 14:28:25 +08:00
@@ -359,20 +359,51 @@ namespace S7.Net.UnitTest
|
||||
public async Task Test_Async_ReadMultipleBytes()
|
||||
{
|
||||
Assert.IsTrue(plc.IsConnected, "Before executing this test, the plc must be connected. Check constructor.");
|
||||
bool val = true;
|
||||
await plc.WriteAsync("DB2.DBX0.5", val);
|
||||
bool result = (bool)await plc.ReadAsync("DB2.DBX0.5");
|
||||
Assert.AreEqual(val, result);
|
||||
|
||||
ushort val = 16384;
|
||||
await plc.WriteAsync("DB2.DBW16384", val);
|
||||
ushort result = (ushort)await plc.ReadAsync("DB2.DBW16384");
|
||||
Assert.AreEqual(val, result, "A ushort goes from 0 to 64512");
|
||||
ushort val1 = 16384;
|
||||
await plc.WriteAsync("DB2.DBW16384", val1);
|
||||
ushort result1 = (ushort)await plc.ReadAsync("DB2.DBW16384");
|
||||
Assert.AreEqual(val1, result1, "A ushort goes from 0 to 64512");
|
||||
|
||||
ushort val2 = 129;
|
||||
await plc.WriteAsync("DB2.DBW16", val2);
|
||||
ushort result2 = (ushort)await plc.ReadAsync("DB2.DBW16");
|
||||
Assert.AreEqual(val2, result2, "A ushort goes from 0 to 64512");
|
||||
bool val2 = true;
|
||||
await plc.WriteAsync("DB2.DBX8192.7", val2);
|
||||
bool result2 = (bool)await plc.ReadAsync("DB2.DBX8192.7");
|
||||
Assert.AreEqual(val2, result2);
|
||||
|
||||
ushort val3 = 129;
|
||||
await plc.WriteAsync("DB2.DBW16", val3);
|
||||
ushort result3 = (ushort)await plc.ReadAsync("DB2.DBW16");
|
||||
Assert.AreEqual(val3, result3, "A ushort goes from 0 to 64512");
|
||||
|
||||
byte[] val4 = new byte[] { 0x12, 0x34 };
|
||||
await plc.WriteAsync("DB2.DBB2048", val4[0]);
|
||||
await plc.WriteAsync("DB2.DBB2049", val4[1]);
|
||||
byte result4b0 = (byte)await plc.ReadAsync("DB2.DBB2048");
|
||||
byte result4b1 = (byte)await plc.ReadAsync("DB2.DBB2049");
|
||||
Assert.AreEqual(val4[0], result4b0);
|
||||
Assert.AreEqual(val4[1], result4b1);
|
||||
|
||||
bool val6 = true;
|
||||
await plc.WriteAsync("DB2.DBX16384.6", val6);
|
||||
bool result6 = (bool)await plc.ReadAsync("DB2.DBX16384.6");
|
||||
Assert.AreEqual(val6, result6);
|
||||
|
||||
var dataItems = new List<DataItem>()
|
||||
{
|
||||
new DataItem
|
||||
{
|
||||
Count = 1,
|
||||
DataType = DataType.DataBlock,
|
||||
DB = 2,
|
||||
StartByteAdr = 0,
|
||||
BitAdr = 5,
|
||||
VarType = VarType.Bit
|
||||
}
|
||||
,new DataItem
|
||||
{
|
||||
Count = 1,
|
||||
DataType = DataType.DataBlock,
|
||||
@@ -381,19 +412,61 @@ 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
|
||||
}
|
||||
},
|
||||
// single byte
|
||||
new DataItem
|
||||
{
|
||||
Count = 1,
|
||||
DataType = DataType.DataBlock,
|
||||
DB = 2,
|
||||
StartByteAdr = 2048,
|
||||
VarType = VarType.Byte
|
||||
},
|
||||
// multiple bytes
|
||||
new DataItem
|
||||
{
|
||||
Count = 2,
|
||||
DataType = DataType.DataBlock,
|
||||
DB = 2,
|
||||
StartByteAdr = 2048,
|
||||
VarType = VarType.Byte
|
||||
},
|
||||
new DataItem
|
||||
{
|
||||
Count = 1,
|
||||
DataType = DataType.DataBlock,
|
||||
DB = 2,
|
||||
StartByteAdr = 16384,
|
||||
BitAdr = 6,
|
||||
VarType = VarType.Bit
|
||||
},
|
||||
};
|
||||
|
||||
dataItems = await plc.ReadMultipleVarsAsync(dataItems);
|
||||
var dataItemsRes = await plc.ReadMultipleVarsAsync(dataItems);
|
||||
|
||||
Assert.AreEqual(dataItems[0].Value, val);
|
||||
Assert.AreEqual(dataItems[1].Value, val2);
|
||||
Assert.AreEqual(val, dataItemsRes[0].Value);
|
||||
Assert.AreEqual(val1, dataItemsRes[1].Value);
|
||||
Assert.AreEqual(val2, dataItemsRes[2].Value);
|
||||
Assert.AreEqual(val3, dataItemsRes[3].Value);
|
||||
Assert.AreEqual(val4[0], dataItemsRes[4].Value);
|
||||
Assert.AreEqual(val4[0], ((byte[])dataItemsRes[5].Value)[0]); //dataItem[5].Value should be byte[2]
|
||||
Assert.AreEqual(val4[1], ((byte[])dataItemsRes[5].Value)[1]);
|
||||
Assert.AreEqual(val6, dataItemsRes[6].Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -908,8 +908,10 @@ namespace S7.Net.UnitTest
|
||||
{
|
||||
Assert.IsTrue(plc.IsConnected, "Before executing this test, the plc must be connected. Check constructor.");
|
||||
|
||||
var tc = new TestSmallClass();
|
||||
tc.Bool1 = true;
|
||||
var tc = new TestSmallClass
|
||||
{
|
||||
Bool1 = true
|
||||
};
|
||||
|
||||
plc.WriteClass(tc, DB2);
|
||||
var tc2 = plc.ReadClass<TestSmallClass>(DB2);
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace S7.Net
|
||||
public async Task<object> ReadAsync(string variable)
|
||||
{
|
||||
var adr = new PLCAddress(variable);
|
||||
return await ReadAsync(adr.dataType, adr.DBNumber, adr.Address, adr.varType, 1, (byte)adr.BitNumber);
|
||||
return await ReadAsync(adr.dataType, adr.DBNumber, adr.Address, adr.varType, 1, (byte)adr.BitNumber);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -213,12 +213,11 @@ namespace S7.Net
|
||||
throw new Exception("Too many vars requested");
|
||||
if (cntBytes > 222)
|
||||
throw new Exception("Too many bytes requested"); // TODO: proper TDU check + split in multiple requests
|
||||
|
||||
try
|
||||
{
|
||||
// first create the header
|
||||
int packageSize = 19 + (dataItems.Count * 12);
|
||||
Types.ByteArray package = new ByteArray(packageSize);
|
||||
ByteArray package = new ByteArray(packageSize);
|
||||
package.Add(ReadHeaderPackage(dataItems.Count));
|
||||
// package.Add(0x02); // datenart
|
||||
foreach (var dataItem in dataItems)
|
||||
@@ -226,28 +225,13 @@ namespace S7.Net
|
||||
package.Add(CreateReadDataRequestPackage(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count)));
|
||||
}
|
||||
|
||||
await socket.SendAsync(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
socket.Send(package.Array, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = await COTP.TSDU.ReadAsync(socket); //TODO use Async
|
||||
var s7data = await COTP.TSDU.ReadAsync(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString());
|
||||
|
||||
int offset = 18;
|
||||
foreach (var dataItem in dataItems)
|
||||
{
|
||||
int byteCnt = VarTypeToByteLength(dataItem.VarType, dataItem.Count);
|
||||
byte[] bytes = new byte[byteCnt];
|
||||
|
||||
for (int i = 0; i < byteCnt; i++)
|
||||
{
|
||||
bytes[i] = s7data[i + offset];
|
||||
}
|
||||
|
||||
offset += byteCnt + 4;
|
||||
|
||||
dataItem.Value = ParseBytes(dataItem.VarType, bytes, dataItem.Count);
|
||||
}
|
||||
return dataItems;
|
||||
ParseDataIntoDataItems(s7data, dataItems);
|
||||
}
|
||||
catch (SocketException socketException)
|
||||
{
|
||||
@@ -259,7 +243,7 @@ namespace S7.Net
|
||||
LastErrorCode = ErrorCode.WriteData;
|
||||
LastErrorString = exc.Message;
|
||||
}
|
||||
return null;
|
||||
return dataItems;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -416,7 +400,7 @@ namespace S7.Net
|
||||
// package.Add(0x02); // datenart
|
||||
package.Add(CreateReadDataRequestPackage(dataType, db, startByteAdr, count));
|
||||
|
||||
await socket.SendAsync(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
await socket.SendAsync(package.Array, 0, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = await COTP.TSDU.ReadAsync(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
@@ -468,7 +452,7 @@ namespace S7.Net
|
||||
// now join the header and the data
|
||||
package.Add(value);
|
||||
|
||||
await socket.SendAsync(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
await socket.SendAsync(package.Array, 0, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = await COTP.TSDU.ReadAsync(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
@@ -518,7 +502,7 @@ namespace S7.Net
|
||||
// now join the header and the data
|
||||
package.Add(value);
|
||||
|
||||
await socket.SendAsync(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
await socket.SendAsync(package.Array, 0, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = await COTP.TSDU.ReadAsync(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
|
||||
@@ -481,5 +481,34 @@ namespace S7.Net
|
||||
7, 80 //Try 1920 PDU Size. Same as libnodave.
|
||||
};
|
||||
}
|
||||
|
||||
private void ParseDataIntoDataItems(byte[] s7data, List<DataItem> dataItems)
|
||||
{
|
||||
int offset = 14;
|
||||
foreach (var dataItem in dataItems)
|
||||
{
|
||||
// check for Return Code = Success
|
||||
if (s7data[offset] != 0xff)
|
||||
throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString());
|
||||
|
||||
// to Data bytes
|
||||
offset += 4;
|
||||
|
||||
int byteCnt = VarTypeToByteLength(dataItem.VarType, dataItem.Count);
|
||||
dataItem.Value = ParseBytes(
|
||||
dataItem.VarType,
|
||||
s7data.Skip(offset).Take(byteCnt).ToArray(),
|
||||
dataItem.Count,
|
||||
dataItem.BitAdr
|
||||
);
|
||||
|
||||
// next Item
|
||||
offset += byteCnt;
|
||||
|
||||
// Fill byte in response when bytecount is odd
|
||||
if (dataItem.Count % 2 != 0 && (dataItem.VarType == VarType.Byte || dataItem.VarType == VarType.Bit))
|
||||
offset++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,7 +373,8 @@ namespace S7.Net
|
||||
private byte[] ReadBytesWithSingleRequest(DataType dataType, int db, int startByteAdr, int count)
|
||||
{
|
||||
byte[] bytes = new byte[count];
|
||||
try {
|
||||
try
|
||||
{
|
||||
// first create the header
|
||||
int packageSize = 31;
|
||||
ByteArray package = new ByteArray(packageSize);
|
||||
@@ -381,7 +382,7 @@ namespace S7.Net
|
||||
// package.Add(0x02); // datenart
|
||||
package.Add(CreateReadDataRequestPackage(dataType, db, startByteAdr, count));
|
||||
|
||||
socket.Send(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
socket.Send(package.Array, 0, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = COTP.TSDU.Read(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
@@ -435,7 +436,7 @@ namespace S7.Net
|
||||
// now join the header and the data
|
||||
package.Add(value);
|
||||
|
||||
socket.Send(package.array, package.array.Length, SocketFlags.None);
|
||||
socket.Send(package.Array, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = COTP.TSDU.Read(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
@@ -484,7 +485,7 @@ namespace S7.Net
|
||||
// now join the header and the data
|
||||
package.Add(value);
|
||||
|
||||
socket.Send(package.array, package.array.Length, SocketFlags.None);
|
||||
socket.Send(package.Array, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = COTP.TSDU.Read(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
@@ -519,7 +520,6 @@ namespace S7.Net
|
||||
throw new Exception("Too many vars requested");
|
||||
if (cntBytes > 222)
|
||||
throw new Exception("Too many bytes requested"); // TODO: proper TDU check + split in multiple requests
|
||||
|
||||
try
|
||||
{
|
||||
// first create the header
|
||||
@@ -532,27 +532,13 @@ namespace S7.Net
|
||||
package.Add(CreateReadDataRequestPackage(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, VarTypeToByteLength(dataItem.VarType, dataItem.Count)));
|
||||
}
|
||||
|
||||
socket.Send(package.array, 0, package.array.Length, SocketFlags.None);
|
||||
socket.Send(package.Array, package.Array.Length, SocketFlags.None);
|
||||
|
||||
var s7data = COTP.TSDU.Read(socket);
|
||||
if (s7data == null || s7data[14] != 0xff)
|
||||
throw new Exception(ErrorCode.WrongNumberReceivedBytes.ToString());
|
||||
|
||||
int offset = 18;
|
||||
foreach (var dataItem in dataItems)
|
||||
{
|
||||
int byteCnt = VarTypeToByteLength(dataItem.VarType, dataItem.Count);
|
||||
byte[] bytes = new byte[byteCnt];
|
||||
|
||||
for (int i = 0; i < byteCnt; i++)
|
||||
{
|
||||
bytes[i] = s7data[i + offset];
|
||||
}
|
||||
|
||||
offset += byteCnt + 4;
|
||||
|
||||
dataItem.Value = ParseBytes(dataItem.VarType, bytes, dataItem.Count);
|
||||
}
|
||||
ParseDataIntoDataItems(s7data, dataItems);
|
||||
}
|
||||
catch (SocketException socketException)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace S7.Net.Types
|
||||
{
|
||||
List<byte> list = new List<byte>();
|
||||
|
||||
public byte[] array
|
||||
public byte[] Array
|
||||
{
|
||||
get { return list.ToArray(); }
|
||||
}
|
||||
@@ -38,7 +38,7 @@ namespace S7.Net.Types
|
||||
|
||||
public void Add(ByteArray byteArray)
|
||||
{
|
||||
list.AddRange(byteArray.array);
|
||||
list.AddRange(byteArray.Array);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (UInt16 val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (Int32 val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (UInt32 val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (double val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (UInt16 val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace S7.Net.Types
|
||||
ByteArray arr = new ByteArray();
|
||||
foreach (UInt16 val in value)
|
||||
arr.Add(ToByteArray(val));
|
||||
return arr.array;
|
||||
return arr.Array;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user