diff --git a/S7.Net.UnitTest/ConnectionRequestTest.cs b/S7.Net.UnitTest/ConnectionRequestTest.cs index f12fa16..acd2ee0 100644 --- a/S7.Net.UnitTest/ConnectionRequestTest.cs +++ b/S7.Net.UnitTest/ConnectionRequestTest.cs @@ -10,51 +10,51 @@ namespace S7.Net.UnitTest public void Test_ConnectionRequest_S7_200() { CollectionAssert.AreEqual(MakeConnectionRequest(16, 0, 16, 0), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7200, 0, 0)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7200, 0, 0))); } [TestMethod] public void Test_ConnectionRequest_S7_300() { CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 0, 0)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7300, 0, 0))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 0, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7300, 0, 1))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7300, 1, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7300, 1, 1))); } [TestMethod] public void Test_ConnectionRequest_S7_400() { CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 0, 0)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7400, 0, 0))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 0, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7400, 0, 1))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S7400, 1, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S7400, 1, 1))); } [TestMethod] public void Test_ConnectionRequest_S7_1200() { CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 0, 0)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71200, 0, 0))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 0, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71200, 0, 1))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71200, 1, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71200, 1, 1))); } [TestMethod] public void Test_ConnectionRequest_S7_1500() { CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 0), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 0, 0)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71500, 0, 0))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 1), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 0, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71500, 0, 1))); CollectionAssert.AreEqual(MakeConnectionRequest(1, 0, 3, 33), - ConnectionRequest.GetCOTPConnectionRequest(CpuType.S71500, 1, 1)); + ConnectionRequest.GetCOTPConnectionRequest(TsapPair.GetDefaultTsapPair(CpuType.S71500, 1, 1))); } private static byte[] MakeConnectionRequest(byte sourceTsap1, byte sourceTsap2, byte destTsap1, byte destTsap2) diff --git a/S7.Net/PLC.cs b/S7.Net/PLC.cs index 6180ad5..5ec5618 100644 --- a/S7.Net/PLC.cs +++ b/S7.Net/PLC.cs @@ -15,6 +15,11 @@ namespace S7.Net /// public partial class Plc : IDisposable { + /// + /// The default port for the S7 protocol. + /// + public const int DefaultPort = 102; + private readonly TaskQueue queue = new TaskQueue(); private const int CONNECTION_TIMED_OUT_ERROR_CODE = 10060; @@ -36,6 +41,11 @@ namespace S7.Net /// public int Port { get; } + /// + /// The TSAP addresses used during the connection request. + /// + public TsapPair TsapPair { get; set; } + /// /// CPU type of the PLC /// @@ -108,25 +118,14 @@ namespace S7.Net /// /// CpuType of the PLC (select from the enum) /// Ip address of the PLC - /// Port address of the PLC, default 102 /// rack of the PLC, usually it's 0, but check in the hardware configuration of Step7 or TIA portal /// slot of the CPU of the PLC, usually it's 2 for S7300-S7400, 0 for S7-1200 and S7-1500. /// If you use an external ethernet card, this must be set accordingly. - public Plc(CpuType cpu, string ip, int port, Int16 rack, Int16 slot) + public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot) + : this(cpu, ip, DefaultPort, rack, slot) { - if (!Enum.IsDefined(typeof(CpuType), cpu)) - throw new ArgumentException($"The value of argument '{nameof(cpu)}' ({cpu}) is invalid for Enum type '{typeof(CpuType).Name}'.", nameof(cpu)); - - if (string.IsNullOrEmpty(ip)) - throw new ArgumentException("IP address must valid.", nameof(ip)); - - CPU = cpu; - IP = ip; - Port = port; - Rack = rack; - Slot = slot; - MaxPDUSize = 240; } + /// /// Creates a PLC object with all the parameters needed for connections. /// For S7-1200 and S7-1500, the default is rack = 0 and slot = 0. @@ -135,23 +134,51 @@ namespace S7.Net /// /// CpuType of the PLC (select from the enum) /// Ip address of the PLC + /// Port number used for the connection, default 102. /// rack of the PLC, usually it's 0, but check in the hardware configuration of Step7 or TIA portal /// slot of the CPU of the PLC, usually it's 2 for S7300-S7400, 0 for S7-1200 and S7-1500. /// If you use an external ethernet card, this must be set accordingly. - public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot) + public Plc(CpuType cpu, string ip, int port, Int16 rack, Int16 slot) + : this(ip, port, TsapPair.GetDefaultTsapPair(cpu, rack, slot)) { if (!Enum.IsDefined(typeof(CpuType), cpu)) - throw new ArgumentException($"The value of argument '{nameof(cpu)}' ({cpu}) is invalid for Enum type '{typeof(CpuType).Name}'.", nameof(cpu)); + throw new ArgumentException( + $"The value of argument '{nameof(cpu)}' ({cpu}) is invalid for Enum type '{typeof(CpuType).Name}'.", + nameof(cpu)); + CPU = cpu; + Rack = rack; + Slot = slot; + } + + /// + /// Creates a PLC object with all the parameters needed for connections. + /// For S7-1200 and S7-1500, the default is rack = 0 and slot = 0. + /// You need slot > 0 if you are connecting to external ethernet card (CP). + /// For S7-300 and S7-400 the default is rack = 0 and slot = 2. + /// + /// Ip address of the PLC + /// The TSAP addresses used for the connection request. + public Plc(string ip, TsapPair tsapPair) : this(ip, DefaultPort, tsapPair) + { + } + + /// + /// Creates a PLC object with all the parameters needed for connections. Use this constructor + /// if you want to manually override the TSAP addresses used during the connection request. + /// + /// Ip address of the PLC + /// Port number used for the connection, default 102. + /// The TSAP addresses used for the connection request. + public Plc(string ip, int port, TsapPair tsapPair) + { if (string.IsNullOrEmpty(ip)) throw new ArgumentException("IP address must valid.", nameof(ip)); - CPU = cpu; IP = ip; - Port = 102; - Rack = rack; - Slot = slot; + Port = port; MaxPDUSize = 240; + TsapPair = tsapPair; } /// diff --git a/S7.Net/PlcAsynchronous.cs b/S7.Net/PlcAsynchronous.cs index c7a5868..030cc3d 100644 --- a/S7.Net/PlcAsynchronous.cs +++ b/S7.Net/PlcAsynchronous.cs @@ -60,7 +60,7 @@ namespace S7.Net private async Task RequestConnection(Stream stream, CancellationToken cancellationToken) { - var requestData = ConnectionRequest.GetCOTPConnectionRequest(CPU, Rack, Slot); + var requestData = ConnectionRequest.GetCOTPConnectionRequest(TsapPair); var response = await NoLockRequestTpduAsync(stream, requestData, cancellationToken).ConfigureAwait(false); if (response.PDUType != COTP.PduType.ConnectionConfirmed) diff --git a/S7.Net/Protocol/ConnectionRequest.cs b/S7.Net/Protocol/ConnectionRequest.cs index 19b441c..9dbd396 100644 --- a/S7.Net/Protocol/ConnectionRequest.cs +++ b/S7.Net/Protocol/ConnectionRequest.cs @@ -1,13 +1,9 @@ -using System; - -namespace S7.Net.Protocol +namespace S7.Net.Protocol { internal static class ConnectionRequest { - public static byte[] GetCOTPConnectionRequest(CpuType cpu, Int16 rack, Int16 slot) + public static byte[] GetCOTPConnectionRequest(TsapPair tsapPair) { - var tsapPair = TsapPair.GetDefaultTsapPair(cpu, rack, slot); - byte[] bSend1 = { 3, 0, 0, 22, //TPKT 17, //COTP Header Length