diff --git a/S7.Net.UnitTest/ConnectionRequestTest.cs b/S7.Net.UnitTest/ConnectionRequestTest.cs new file mode 100644 index 0000000..4615c3a --- /dev/null +++ b/S7.Net.UnitTest/ConnectionRequestTest.cs @@ -0,0 +1,82 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using S7.Net.Protocol; + +namespace S7.Net.UnitTest +{ + [TestClass] + public class ConnectionRequestTest + { + [TestMethod] + public void Test_ConnectionRequest_S7_200() + { + CollectionAssert.AreEqual(MakeConnectionRequest(16, 0, 16, 0), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7200, 0, 0)); + } + + [TestMethod] + public void Test_ConnectionRequest_S7_300() + { + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 0, 0)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 0, 1)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 1, 1)); + } + + [TestMethod] + public void Test_ConnectionRequest_S7_400() + { + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 0, 0)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 0, 1)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 1, 1)); + } + + [TestMethod] + public void Test_ConnectionRequest_S7_1200() + { + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 0, 0)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 0, 1)); + CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 1, 1)); + } + + [TestMethod] + public void Test_ConnectionRequest_S7_1500() + { + CollectionAssert.AreEqual(MakeConnectionRequest(0x10, 0x2, 3, 0), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 0, 0)); + CollectionAssert.AreEqual(MakeConnectionRequest(0x10, 0x2, 3, 1), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 0, 1)); + CollectionAssert.AreEqual(MakeConnectionRequest(0x10, 0x2, 3, 33), + ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 1, 1)); + } + + private static byte[] MakeConnectionRequest(byte sourceTsap1, byte sourceTsap2, byte destTsap1, byte destTsap2) + { + return new byte[] + { + 3, 0, 0, 22, //TPKT + 17, //COTP Header Length + 224, //Connect Request + 0, 0, //Destination Reference + 0, 46, //Source Reference + 0, //Flags + 193, //Parameter Code (src-tasp) + 2, //Parameter Length + sourceTsap1, sourceTsap2, //Source TASP + 194, //Parameter Code (dst-tasp) + 2, //Parameter Length + destTsap1, destTsap2, //Destination TASP + 192, //Parameter Code (tpdu-size) + 1, //Parameter Length + 9 //TPDU Size (2^9 = 512) + }; + } + } +} diff --git a/S7.Net.UnitTest/S7.Net.UnitTest.csproj b/S7.Net.UnitTest/S7.Net.UnitTest.csproj index 75329b1..bfaa48e 100644 --- a/S7.Net.UnitTest/S7.Net.UnitTest.csproj +++ b/S7.Net.UnitTest/S7.Net.UnitTest.csproj @@ -6,7 +6,7 @@ {303CCED6-9ABC-4899-A509-743341AAA804} Library Properties - S7.UnitTest + S7.Net.UnitTest S7Net.UnitTest v4.5.2 512 @@ -60,6 +60,7 @@ + @@ -119,4 +120,4 @@ --> - + \ No newline at end of file diff --git a/S7.Net.UnitTest/S7NetTestsSync.cs b/S7.Net.UnitTest/S7NetTestsSync.cs index 6daa9f7..4056042 100644 --- a/S7.Net.UnitTest/S7NetTestsSync.cs +++ b/S7.Net.UnitTest/S7NetTestsSync.cs @@ -31,7 +31,7 @@ using S7.UnitTest.Helpers; * */ -//This file contains tests for the obsolete synchronous methods +//This file contains tests for the synchronous methods #pragma warning disable CS0618 namespace S7.Net.UnitTest { @@ -877,7 +877,7 @@ namespace S7.Net.UnitTest for (int x = 0; x < count; x++) { - Assert.AreEqual(x % 256, res[x]); + Assert.AreEqual(x % 256, res[x], $"Mismatch at offset {x}, expected {x % 256}, actual {res[x]}."); } } diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs index cb004e2..4bf5753 100644 --- a/S7.Net/PLCHelpers.cs +++ b/S7.Net/PLCHelpers.cs @@ -357,87 +357,10 @@ namespace S7.Net } } - private byte[] GetCOPTConnectionRequest(CpuType CPU) - { - byte[] bSend1 = { - 3, 0, 0, 22, //TPKT - 17, //COTP Header Length - 224, //Connect Request - 0, 0, //Destination Reference - 0, 46, //Source Reference - 0, //Flags - 193, //Parameter Code (src-tasp) - 2, //Parameter Length - 1, 0, //Source TASP - 194, //Parameter Code (dst-tasp) - 2, //Parameter Length - 3, 0, //Destination TASP - 192, //Parameter Code (tpdu-size) - 1, //Parameter Length - 9 //TPDU Size (2^9 = 512) - }; - - switch (CPU) - { - case CpuType.S7200: - //S7200: Chr(193) & Chr(2) & Chr(16) & Chr(0) 'Eigener Tsap - bSend1[11] = 193; - bSend1[12] = 2; - bSend1[13] = 16; - bSend1[14] = 0; - //S7200: Chr(194) & Chr(2) & Chr(16) & Chr(0) 'Fremder Tsap - bSend1[15] = 194; - bSend1[16] = 2; - bSend1[17] = 16; - bSend1[18] = 0; - break; - case CpuType.S71200: - case CpuType.S7300: - //S7300: Chr(193) & Chr(2) & Chr(1) & Chr(0) 'Eigener Tsap - bSend1[11] = 193; - bSend1[12] = 2; - bSend1[13] = 1; - bSend1[14] = 0; - //S7300: Chr(194) & Chr(2) & Chr(3) & Chr(2) 'Fremder Tsap - bSend1[15] = 194; - bSend1[16] = 2; - bSend1[17] = 3; - bSend1[18] = (byte)(Rack * 2 * 16 + Slot); - break; - case CpuType.S7400: - //S7400: Chr(193) & Chr(2) & Chr(1) & Chr(0) 'Eigener Tsap - bSend1[11] = 193; - bSend1[12] = 2; - bSend1[13] = 1; - bSend1[14] = 0; - //S7400: Chr(194) & Chr(2) & Chr(3) & Chr(3) 'Fremder Tsap - bSend1[15] = 194; - bSend1[16] = 2; - bSend1[17] = 3; - bSend1[18] = (byte)(Rack * 2 * 16 + Slot); - break; - case CpuType.S71500: - // Eigener Tsap - bSend1[11] = 193; - bSend1[12] = 2; - bSend1[13] = 0x10; - bSend1[14] = 0x2; - // Fredmer Tsap - bSend1[15] = 194; - bSend1[16] = 2; - bSend1[17] = 0x3; - bSend1[18] = (byte)(Rack * 2 * 16 + Slot); - break; - default: - throw new Exception("Wrong CPU Type Secified"); - } - return bSend1; - } - private byte[] GetS7ConnectionSetup() { return new byte[] { 3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 0, 255, 255, 0, 8, 0, 0, 240, 0, 0, 3, 0, 3, - 7, 80 //Try 1920 PDU Size. Same as libnodave. + 7, 128 //Try 1920 PDU Size. Same as libnodave. }; } diff --git a/S7.Net/PlcAsynchronous.cs b/S7.Net/PlcAsynchronous.cs index d6c639e..0cd32b0 100644 --- a/S7.Net/PlcAsynchronous.cs +++ b/S7.Net/PlcAsynchronous.cs @@ -24,7 +24,7 @@ namespace S7.Net { await ConnectAsync(); - await stream.WriteAsync(GetCOPTConnectionRequest(CPU), 0, 22); + await stream.WriteAsync(ConnectionRequest.GetCOTPConnectionRequest(CPU, Rack, Slot), 0, 22); var response = await COTP.TPDU.ReadAsync(stream); if (response.PDUType != 0xd0) //Connect Confirm { diff --git a/S7.Net/PlcSynchronous.cs b/S7.Net/PlcSynchronous.cs index ccd4279..ec092ed 100644 --- a/S7.Net/PlcSynchronous.cs +++ b/S7.Net/PlcSynchronous.cs @@ -8,7 +8,7 @@ using System.Net.Sockets; using System.Threading.Tasks; using S7.Net.Protocol; -//Implement obsolete synchronous methods here +//Implement synchronous methods here namespace S7.Net { public partial class Plc @@ -26,7 +26,7 @@ namespace S7.Net } try { - stream.Write(GetCOPTConnectionRequest(CPU), 0, 22); + stream.Write(ConnectionRequest.GetCOTPConnectionRequest(CPU, Rack, Slot), 0, 22); var response = COTP.TPDU.Read(stream); if (response.PDUType != 0xd0) //Connect Confirm { @@ -519,7 +519,6 @@ namespace S7.Net /// DataItems must not be more than 20 (protocol restriction) and bytes must not be more than 200 + 22 of header (protocol restriction). /// /// List of dataitems that contains the list of variables that must be read. Maximum 20 dataitems are accepted. - [Obsolete("Use ReadMultipleVarsAsync. Note: different function signature")] public void ReadMultipleVars(List dataItems) { int cntBytes = dataItems.Sum(dataItem => VarTypeToByteLength(dataItem.VarType, dataItem.Count)); diff --git a/S7.Net/Protocol/ConnectionRequest.cs b/S7.Net/Protocol/ConnectionRequest.cs new file mode 100644 index 0000000..f2403b2 --- /dev/null +++ b/S7.Net/Protocol/ConnectionRequest.cs @@ -0,0 +1,61 @@ +using System; + +namespace S7.Net.Protocol +{ + internal static class ConnectionRequest + { + public static byte[] GetCOTPConnectionRequest(CpuType cpu, Int16 rack, Int16 slot) + { + byte[] bSend1 = { + 3, 0, 0, 22, //TPKT + 17, //COTP Header Length + 224, //Connect Request + 0, 0, //Destination Reference + 0, 46, //Source Reference + 0, //Flags + 193, //Parameter Code (src-tasp) + 2, //Parameter Length + 1, 0, //Source TASP + 194, //Parameter Code (dst-tasp) + 2, //Parameter Length + 3, 0, //Destination TASP + 192, //Parameter Code (tpdu-size) + 1, //Parameter Length + 9 //TPDU Size (2^9 = 512) + }; + + switch (cpu) + { + case CpuType.S7200: + //S7200: Chr(193) & Chr(2) & Chr(16) & Chr(0) 'Eigener Tsap + bSend1[13] = 0x10; + bSend1[14] = 0x00; + //S7200: Chr(194) & Chr(2) & Chr(16) & Chr(0) 'Fremder Tsap + bSend1[17] = 0x10; + bSend1[18] = 0x00; + break; + case CpuType.S71200: + case CpuType.S7300: + case CpuType.S7400: + //S7300: Chr(193) & Chr(2) & Chr(1) & Chr(0) 'Eigener Tsap + bSend1[13] = 0x01; + bSend1[14] = 0x00; + //S7300: Chr(194) & Chr(2) & Chr(3) & Chr(2) 'Fremder Tsap + bSend1[17] = 0x03; + bSend1[18] = (byte) ((rack << 5) | (int) slot); + break; + case CpuType.S71500: + // Eigener Tsap + bSend1[13] = 0x10; + bSend1[14] = 0x02; + // Fredmer Tsap + bSend1[17] = 0x03; + bSend1[18] = (byte) ((rack << 5) | (int) slot); + break; + default: + throw new Exception("Wrong CPU Type Secified"); + } + return bSend1; + } + } +}