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