Added possiblity to connect over a certain host endpoint

- fixed missing docs and
- fixed accessing modifiers
This commit is contained in:
Felix Weiß
2022-07-19 09:28:18 +02:00
parent 3c450eea97
commit 0e1f5cd12b
13 changed files with 166 additions and 52 deletions

View File

@@ -1,14 +1,28 @@
using System; using System;
namespace MewtocolNet.Registers { namespace MewtocolNet.Registers {
/// <summary>
/// Contains information about the plc and its cpu
/// </summary>
public partial class CpuInfo { public partial class CpuInfo {
/// <summary>
/// The cpu type of the plc
/// </summary>
public CpuType Cputype { get; set; } public CpuType Cputype { get; set; }
/// <summary>
/// Program capacity in 1K steps
/// </summary>
public int ProgramCapacity { get; set; } public int ProgramCapacity { get; set; }
/// <summary>
/// Version of the cpu
/// </summary>
public string CpuVersion { get; set; } public string CpuVersion { get; set; }
internal static CpuInfo BuildFromHexString (string _cpuType, string _cpuVersion, string _progCapacity) {
public static CpuInfo BuildFromHexString (string _cpuType, string _cpuVersion, string _progCapacity) {
CpuInfo retInf = new CpuInfo(); CpuInfo retInf = new CpuInfo();
@@ -47,8 +61,7 @@ namespace MewtocolNet.Registers {
return retInf; return retInf;
} }
} }
} }

View File

@@ -52,6 +52,11 @@ namespace MewtocolNet {
set { connectTimeout = value; } set { connectTimeout = value; }
} }
/// <summary>
/// The host ip endpoint, leave it null to use an automatic interface
/// </summary>
public IPEndPoint HostEndpoint { get; set; }
private bool isConnected; private bool isConnected;
/// <summary> /// <summary>
/// The current connection state of the interface /// The current connection state of the interface
@@ -271,11 +276,19 @@ namespace MewtocolNet {
try { try {
if(HostEndpoint != null) {
client = new TcpClient(HostEndpoint) {
ReceiveBufferSize = RecBufferSize,
NoDelay = false,
ExclusiveAddressUse = true,
};
} else {
client = new TcpClient() { client = new TcpClient() {
ReceiveBufferSize = RecBufferSize, ReceiveBufferSize = RecBufferSize,
NoDelay = false, NoDelay = false,
ExclusiveAddressUse = true, ExclusiveAddressUse = true,
}; };
}
var result = client.BeginConnect(targetIP, port, null, null); var result = client.BeginConnect(targetIP, port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(ConnectTimeout)); var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(ConnectTimeout));

View File

@@ -190,6 +190,7 @@ namespace MewtocolNet {
/// Writes to the given bool register on the PLC /// Writes to the given bool register on the PLC
/// </summary> /// </summary>
/// <param name="_toWrite">The register to write to</param> /// <param name="_toWrite">The register to write to</param>
/// <param name="value">The value to write</param>
/// <returns>The success state of the write operation</returns> /// <returns>The success state of the write operation</returns>
public async Task<bool> WriteBoolRegister (BRegister _toWrite, bool value) { public async Task<bool> WriteBoolRegister (BRegister _toWrite, bool value) {
@@ -294,7 +295,7 @@ namespace MewtocolNet {
/// </summary> /// </summary>
/// <typeparam name="T">Type of number (short, ushort, int, uint, float)</typeparam> /// <typeparam name="T">Type of number (short, ushort, int, uint, float)</typeparam>
/// <param name="_toWrite">The register to write</param> /// <param name="_toWrite">The register to write</param>
/// <param name="_stationNumber">Station number to access</param> /// <param name="_value">The value to write</param>
/// <returns>The success state of the write operation</returns> /// <returns>The success state of the write operation</returns>
public async Task<bool> WriteNumRegister<T> (NRegister<T> _toWrite, T _value) { public async Task<bool> WriteNumRegister<T> (NRegister<T> _toWrite, T _value) {

View File

@@ -6,13 +6,38 @@ namespace MewtocolNet.Registers {
/// All modes /// All modes
/// </summary> /// </summary>
public class PLCMode { public class PLCMode {
/// <summary>
/// PLC is running
/// </summary>
public bool RunMode { get; set; } public bool RunMode { get; set; }
/// <summary>
/// PLC is in test
/// </summary>
public bool TestRunMode { get; set; } public bool TestRunMode { get; set; }
/// <summary>
/// BreakExcecuting
/// </summary>
public bool BreakExcecuting { get; set; } public bool BreakExcecuting { get; set; }
/// <summary>
/// BreakValid
/// </summary>
public bool BreakValid { get; set; } public bool BreakValid { get; set; }
/// <summary>
/// PLC output is enabled
/// </summary>
public bool OutputEnabled { get; set; } public bool OutputEnabled { get; set; }
/// <summary>
/// PLC runs step per step
/// </summary>
public bool StepRunMode { get; set; } public bool StepRunMode { get; set; }
/// <summary>
/// Message executing
/// </summary>
public bool MessageExecuting { get; set; } public bool MessageExecuting { get; set; }
/// <summary>
/// PLC is in remote mode
/// </summary>
public bool RemoteMode { get; set; } public bool RemoteMode { get; set; }
/// <summary> /// <summary>

View File

@@ -6,22 +6,39 @@ using System.Threading.Tasks;
namespace MewtocolNet.RegisterAttributes { namespace MewtocolNet.RegisterAttributes {
/// <summary>
/// The size of the bitwise register
/// </summary>
public enum BitCount { public enum BitCount {
/// <summary>
/// 16 bit
/// </summary>
B16, B16,
/// <summary>
/// 32 bit
/// </summary>
B32 B32
} }
/// <summary>
/// Defines the behavior of a register property
/// </summary>
[AttributeUsage(AttributeTargets.Property)] [AttributeUsage(AttributeTargets.Property)]
public class RegisterAttribute : Attribute { public class RegisterAttribute : Attribute {
public int MemoryArea; internal int MemoryArea;
public int StringLength; internal int StringLength;
public RegisterType RegisterType; internal RegisterType RegisterType;
public SpecialAddress SpecialAddress = SpecialAddress.None; internal SpecialAddress SpecialAddress = SpecialAddress.None;
public BitCount BitCount; internal BitCount BitCount;
public int AssignedBitIndex = -1; internal int AssignedBitIndex = -1;
/// <summary>
/// Attribute for string type or numeric registers
/// </summary>
/// <param name="memoryArea">The area in the plcs memory</param>
/// <param name="stringLength">The max string length in the plc</param>
public RegisterAttribute (int memoryArea, int stringLength = 1) { public RegisterAttribute (int memoryArea, int stringLength = 1) {
MemoryArea = memoryArea; MemoryArea = memoryArea;
@@ -29,6 +46,11 @@ namespace MewtocolNet.RegisterAttributes {
} }
/// <summary>
/// Attribute for boolean registers
/// </summary>
/// <param name="memoryArea">The area in the plcs memory</param>
/// <param name="type">The type of boolean register</param>
public RegisterAttribute (int memoryArea, RegisterType type) { public RegisterAttribute (int memoryArea, RegisterType type) {
if (type.ToString().StartsWith("DT")) if (type.ToString().StartsWith("DT"))
@@ -40,6 +62,11 @@ namespace MewtocolNet.RegisterAttributes {
} }
/// <summary>
/// Attribute for boolean registers
/// </summary>
/// <param name="spAdress">The special area in the plcs memory</param>
/// <param name="type">The type of boolean register</param>
public RegisterAttribute (RegisterType type, SpecialAddress spAdress) { public RegisterAttribute (RegisterType type, SpecialAddress spAdress) {
if (type.ToString().StartsWith("DT")) if (type.ToString().StartsWith("DT"))
@@ -50,7 +77,11 @@ namespace MewtocolNet.RegisterAttributes {
} }
/// <summary>
/// Attribute to read numeric registers as bitwise
/// </summary>
/// <param name="memoryArea">The area in the plcs memory</param>
/// <param name="bitcount">The number of bits to parse</param>
public RegisterAttribute (int memoryArea, BitCount bitcount) { public RegisterAttribute (int memoryArea, BitCount bitcount) {
MemoryArea = memoryArea; MemoryArea = memoryArea;
@@ -59,6 +90,12 @@ namespace MewtocolNet.RegisterAttributes {
} }
/// <summary>
/// Attribute to read numeric registers as bitwise
/// </summary>
/// <param name="memoryArea">The area in the plcs memory</param>
/// <param name="bitcount">The number of bits to parse</param>
/// <param name="assignBit">The index of the bit that gets linked to the bool</param>
public RegisterAttribute (int memoryArea, uint assignBit, BitCount bitcount) { public RegisterAttribute (int memoryArea, uint assignBit, BitCount bitcount) {
if(assignBit > 15 && bitcount == BitCount.B16) { if(assignBit > 15 && bitcount == BitCount.B16) {

View File

@@ -34,8 +34,17 @@ namespace MewtocolNet.RegisterAttributes {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }
/// <summary>
/// Gets called when the register collection base was linked to its parent mewtocol interface
/// </summary>
/// <param name="plc">The parent interface</param>
public virtual void OnInterfaceLinked (MewtocolInterface plc) { } public virtual void OnInterfaceLinked (MewtocolInterface plc) { }
/// <summary>
/// Gets called when the register collection base was linked to its parent mewtocol interface
/// and the plc connection is established
/// </summary>
/// <param name="plc">The parent interface</param>
public virtual void OnInterfaceLinkedAndOnline (MewtocolInterface plc) { } public virtual void OnInterfaceLinkedAndOnline (MewtocolInterface plc) { }
} }

View File

@@ -12,8 +12,7 @@ namespace MewtocolNet.Registers {
internal RegisterType RegType { get; private set; } internal RegisterType RegType { get; private set; }
internal SpecialAddress SpecialAddress { get; private set; } internal SpecialAddress SpecialAddress { get; private set; }
public bool NeedValue; internal bool LastValue;
public bool LastValue;
/// <summary> /// <summary>
/// The value of the register /// The value of the register
@@ -54,6 +53,9 @@ namespace MewtocolNet.Registers {
} }
/// <summary>
/// Builds the register area name
/// </summary>
public override string BuildMewtocolIdent () { public override string BuildMewtocolIdent () {
//build area code from register type //build area code from register type
@@ -73,9 +75,7 @@ namespace MewtocolNet.Registers {
TriggerChangedEvnt(this); TriggerChangedEvnt(this);
TriggerNotifyChange(); TriggerNotifyChange();
} }
public override string ToString() {
return $"Adress: {MemoryAdress} Val: {Value}";
}
} }
} }

View File

@@ -1,13 +1,20 @@
namespace MewtocolNet.Registers { namespace MewtocolNet.Registers {
/// <summary>
/// Result for a boolean register
/// </summary>
public class BRegisterResult { public class BRegisterResult {
/// <summary>
/// The command result
/// </summary>
public CommandResult Result { get; set; } public CommandResult Result { get; set; }
/// <summary>
/// The used register
/// </summary>
public BRegister Register { get; set; } public BRegister Register { get; set; }
public override string ToString() {
string errmsg = Result.Success ? "" : $", Error [{Result.ErrorDescription}]";
return $"Result [{Result.Success}], Register [{Register.ToString()}]{errmsg}";
} }
}
} }

View File

@@ -7,8 +7,7 @@ namespace MewtocolNet.Registers {
/// <typeparam name="T">The type of the numeric value</typeparam> /// <typeparam name="T">The type of the numeric value</typeparam>
public class NRegister<T> : Register { public class NRegister<T> : Register {
public T NeedValue; internal T LastValue;
public T LastValue;
/// <summary> /// <summary>
/// The value of the register /// The value of the register
@@ -78,10 +77,6 @@ namespace MewtocolNet.Registers {
TriggerNotifyChange(); TriggerNotifyChange();
} }
public override string ToString() {
return $"Adress: {MemoryAdress} Val: {Value}";
}
} }

View File

@@ -6,13 +6,16 @@ namespace MewtocolNet.Registers {
/// </summary> /// </summary>
/// <typeparam name="T">The type of the numeric value</typeparam> /// <typeparam name="T">The type of the numeric value</typeparam>
public class NRegisterResult<T> { public class NRegisterResult<T> {
public CommandResult Result { get; set; }
public NRegister<T> Register { get; set; }
public override string ToString() { /// <summary>
string errmsg = Result.Success ? "" : $", Error [{Result.ErrorDescription}]"; /// Command result
return $"Result [{Result.Success}], Register [{Register.ToString()}]{errmsg}"; /// </summary>
} public CommandResult Result { get; set; }
/// <summary>
/// The used register
/// </summary>
public NRegister<T> Register { get; set; }
/// <summary> /// <summary>
/// Trys to get the value of there is one /// Trys to get the value of there is one

View File

@@ -75,6 +75,9 @@ namespace MewtocolNet.Registers {
}; };
} }
/// <summary>
/// Builds the register area name
/// </summary>
public virtual string BuildMewtocolIdent() { public virtual string BuildMewtocolIdent() {
StringBuilder asciistring = new StringBuilder("D"); StringBuilder asciistring = new StringBuilder("D");
@@ -178,6 +181,9 @@ namespace MewtocolNet.Registers {
} }
/// <summary>
/// Gets the register dataarea string DT for 16bit and DDT for 32 bit types
/// </summary>
public string GetRegisterString () { public string GetRegisterString () {
if (this is NRegister<short> shortReg) { if (this is NRegister<short> shortReg) {

View File

@@ -9,9 +9,12 @@ namespace MewtocolNet.Registers {
private string lastVal = ""; private string lastVal = "";
/// <summary>
/// The current value of the register
/// </summary>
public string Value => lastVal; public string Value => lastVal;
public short ReservedSize { get; set; } internal short ReservedSize { get; set; }
/// <summary> /// <summary>
/// Defines a register containing a string /// Defines a register containing a string
@@ -32,10 +35,9 @@ namespace MewtocolNet.Registers {
memoryLength = (int)Math.Round(wordsize + 1); memoryLength = (int)Math.Round(wordsize + 1);
} }
public override string ToString() { /// <summary>
return $"Adress: {MemoryAdress} Val: {Value}"; /// Builds the register identifier for the mewotocol protocol
} /// </summary>
public override string BuildMewtocolIdent() { public override string BuildMewtocolIdent() {
StringBuilder asciistring = new StringBuilder("D"); StringBuilder asciistring = new StringBuilder("D");
@@ -65,7 +67,6 @@ namespace MewtocolNet.Registers {
TriggerNotifyChange(); TriggerNotifyChange();
} }
} }
} }

View File

@@ -1,15 +1,19 @@
namespace MewtocolNet.Registers { namespace MewtocolNet.Registers {
/// <summary>
/// The results of a string register operation
/// </summary>
public class SRegisterResult { public class SRegisterResult {
/// <summary>
/// The command result
/// </summary>
public CommandResult Result { get; set; } public CommandResult Result { get; set; }
/// <summary>
/// The register definition used
/// </summary>
public SRegister Register { get; set; } public SRegister Register { get; set; }
public override string ToString() {
string errmsg = Result.Success ? "" : $", Error [{Result.ErrorDescription}]";
return $"Result [{Result.Success}], Register [{Register.ToString()}]{errmsg}";
} }
}
} }