mirror of
https://github.com/OpenLogics/MewtocolNet.git
synced 2025-12-06 03:01:24 +00:00
Fix Rbuild layout
This commit is contained in:
@@ -65,7 +65,9 @@ namespace MewtocolNet {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to establish a connection with the device asynchronously
|
/// Tries to establish a connection with the device asynchronously
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Task ConnectAsync();
|
/// <param name="onConnected">A callback for excecuting something right after the plc connected</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task ConnectAsync(Func<Task> onConnected = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Disconnects the device from its current plc connection
|
/// Disconnects the device from its current plc connection
|
||||||
@@ -94,6 +96,12 @@ namespace MewtocolNet {
|
|||||||
/// <returns>The success state of the write operation</returns>
|
/// <returns>The success state of the write operation</returns>
|
||||||
Task<bool> SetOperationModeAsync(bool setRun);
|
Task<bool> SetOperationModeAsync(bool setRun);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restarts the plc program
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The success state of the write operation</returns>
|
||||||
|
Task<bool> RestartProgramAsync();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use this to await the first poll iteration after connecting,
|
/// Use this to await the first poll iteration after connecting,
|
||||||
/// This also completes if the initial connection fails
|
/// This also completes if the initial connection fails
|
||||||
@@ -105,7 +113,7 @@ namespace MewtocolNet {
|
|||||||
/// useful if you want to use a custom update frequency
|
/// useful if you want to use a custom update frequency
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The number of inidvidual mewtocol commands sent</returns>
|
/// <returns>The number of inidvidual mewtocol commands sent</returns>
|
||||||
Task<int> RunPollerCylceManualAsync();
|
Task<int> UpdateAsync();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the connection info string
|
/// Gets the connection info string
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Net;
|
using System;
|
||||||
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace MewtocolNet {
|
namespace MewtocolNet {
|
||||||
@@ -23,11 +24,6 @@ namespace MewtocolNet {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
IPEndPoint HostEndpoint { get; set; }
|
IPEndPoint HostEndpoint { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Tries to establish a connection with the device asynchronously
|
|
||||||
/// </summary>
|
|
||||||
Task ConnectAsync();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Configures the serial interface
|
/// Configures the serial interface
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -48,12 +48,7 @@ namespace MewtocolNet {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to establish a connection with the device asynchronously
|
/// Tries to establish a connection with the device asynchronously
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Task ConnectAsync();
|
Task ConnectAsync(Func<Task> callBack, Action onTryingConfig);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Tries to establish a connection with the device asynchronously
|
|
||||||
/// </summary>
|
|
||||||
Task ConnectAsync(Action onTryingConfig);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ namespace MewtocolNet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public virtual async Task ConnectAsync() {
|
public virtual async Task ConnectAsync(Func<Task> callBack = null) {
|
||||||
|
|
||||||
isConnectingStage = false;
|
isConnectingStage = false;
|
||||||
|
|
||||||
@@ -202,6 +202,14 @@ namespace MewtocolNet {
|
|||||||
|
|
||||||
Logger.Log($">> Intial connection end <<", LogLevel.Verbose, this);
|
Logger.Log($">> Intial connection end <<", LogLevel.Verbose, this);
|
||||||
|
|
||||||
|
if (callBack != null) {
|
||||||
|
|
||||||
|
await Task.Run(callBack);
|
||||||
|
|
||||||
|
Logger.Log($">> OnConnected run complete <<", LogLevel.Verbose, this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@@ -243,7 +251,7 @@ namespace MewtocolNet {
|
|||||||
public virtual string GetConnectionInfo() => throw new NotImplementedException();
|
public virtual string GetConnectionInfo() => throw new NotImplementedException();
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<MewtocolFrameResponse> SendCommandAsync(string _msg, bool withTerminator = true, int timeoutMs = -1, Action<double> onReceiveProgress = null) {
|
public async Task<MewtocolFrameResponse> SendCommandAsync (string _msg, bool withTerminator = true, int timeoutMs = -1, Action<double> onReceiveProgress = null) {
|
||||||
|
|
||||||
if (!IsConnected && !isConnectingStage)
|
if (!IsConnected && !isConnectingStage)
|
||||||
throw new NotSupportedException("The device must be connected to send a message");
|
throw new NotSupportedException("The device must be connected to send a message");
|
||||||
|
|||||||
@@ -73,11 +73,11 @@ namespace MewtocolNet {
|
|||||||
/// useful if you want to use a custom update frequency
|
/// useful if you want to use a custom update frequency
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The number of inidvidual mewtocol commands sent</returns>
|
/// <returns>The number of inidvidual mewtocol commands sent</returns>
|
||||||
public async Task<int> RunPollerCylceManualAsync() {
|
public async Task<int> UpdateAsync() {
|
||||||
|
|
||||||
if (!pollerTaskStopped)
|
if (!pollerTaskStopped)
|
||||||
throw new NotSupportedException($"The poller is already running, " +
|
throw new NotSupportedException($"The poller is already running, " +
|
||||||
$"please make sure there is no polling active before calling {nameof(RunPollerCylceManualAsync)}");
|
$"please make sure there is no polling active before calling {nameof(UpdateAsync)}");
|
||||||
|
|
||||||
tcpMessagesSentThisCycle = 0;
|
tcpMessagesSentThisCycle = 0;
|
||||||
|
|
||||||
@@ -124,8 +124,6 @@ namespace MewtocolNet {
|
|||||||
|
|
||||||
await memoryManager.PollAllAreasAsync();
|
await memoryManager.PollAllAreasAsync();
|
||||||
|
|
||||||
await GetPLCInfoAsync();
|
|
||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
PollerCycleDurationMs = (int)sw.ElapsedMilliseconds;
|
PollerCycleDurationMs = (int)sw.ElapsedMilliseconds;
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,14 @@ namespace MewtocolNet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task<bool> RestartProgramAsync () {
|
||||||
|
|
||||||
|
return await SetOperationModeAsync(false) &&
|
||||||
|
await SetOperationModeAsync(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Byte range writing / reading to registers
|
#region Byte range writing / reading to registers
|
||||||
|
|||||||
@@ -99,10 +99,12 @@ namespace MewtocolNet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task ConnectAsync() => await ConnectAsync(null);
|
public override async Task ConnectAsync(Func<Task> callBack = null) => await ConnectAsyncPriv(callBack);
|
||||||
|
|
||||||
|
public async Task ConnectAsync(Func<Task> callBack = null, Action onTryingConfig = null) => await ConnectAsyncPriv(callBack, onTryingConfig);
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task ConnectAsync(Action onTryingConfig = null) {
|
private async Task ConnectAsyncPriv(Func<Task> callBack, Action onTryingConfig = null) {
|
||||||
|
|
||||||
void OnTryConfig() {
|
void OnTryConfig() {
|
||||||
onTryingConfig();
|
onTryingConfig();
|
||||||
@@ -133,7 +135,7 @@ namespace MewtocolNet {
|
|||||||
if (gotInfo != null) {
|
if (gotInfo != null) {
|
||||||
|
|
||||||
IsConnected = true;
|
IsConnected = true;
|
||||||
await base.ConnectAsync();
|
await base.ConnectAsync(callBack);
|
||||||
OnConnected(gotInfo);
|
OnConnected(gotInfo);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ namespace MewtocolNet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public override async Task ConnectAsync() {
|
public override async Task ConnectAsync(Func<Task> callBack = null) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ namespace MewtocolNet {
|
|||||||
if (plcinf != null) {
|
if (plcinf != null) {
|
||||||
|
|
||||||
IsConnected = true;
|
IsConnected = true;
|
||||||
await base.ConnectAsync();
|
await base.ConnectAsync(callBack);
|
||||||
OnConnected(plcinf);
|
OnConnected(plcinf);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -559,7 +559,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
public class TypedRegister : SBase {
|
public class TypedRegister : SBase {
|
||||||
|
|
||||||
public OptionsRegister SizeHint(int hint) {
|
internal OptionsRegister SizeHint(int hint) {
|
||||||
|
|
||||||
Data.byteSizeHint = (uint)hint;
|
Data.byteSizeHint = (uint)hint;
|
||||||
|
|
||||||
@@ -567,7 +567,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OptionsRegister PollLevel(int level) {
|
internal OptionsRegister PollLevel(int level) {
|
||||||
|
|
||||||
Data.pollLevel = level;
|
Data.pollLevel = level;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using MewtocolNet.RegisterAttributes;
|
|||||||
using MewtocolNet.Registers;
|
using MewtocolNet.Registers;
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using static MewtocolNet.RegisterBuilding.RBuildMult;
|
||||||
|
|
||||||
namespace MewtocolNet.RegisterBuilding {
|
namespace MewtocolNet.RegisterBuilding {
|
||||||
|
|
||||||
@@ -22,15 +23,15 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
/// Examples:
|
/// Examples:
|
||||||
/// <code>Address("DT100") | Address("R10A") | Address("DDT50", "MyRegisterName")</code>
|
/// <code>Address("DT100") | Address("R10A") | Address("DDT50", "MyRegisterName")</code>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="plcAddrName">Address name formatted as FP-Address like in FP-Winpro</param>
|
/// <param name="dtAddr">Address name formatted as FP-Address like in FP-Winpro</param>
|
||||||
/// <param name="name">Custom name for the register to referr to it later</param>
|
/// <param name="name">Custom name for the register to referr to it later</param>
|
||||||
public SAddress Address(string plcAddrName, string name = null) {
|
public AddressStp Address(string dtAddr, string name = null) {
|
||||||
|
|
||||||
var data = ParseAddress(plcAddrName, name);
|
var data = ParseAddress(dtAddr, name);
|
||||||
|
|
||||||
unfinishedList.Add(data);
|
unfinishedList.Add(data);
|
||||||
|
|
||||||
return new SAddress {
|
return new AddressStp {
|
||||||
Data = data,
|
Data = data,
|
||||||
builder = this,
|
builder = this,
|
||||||
};
|
};
|
||||||
@@ -39,23 +40,47 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
//struct constructor
|
//struct constructor
|
||||||
|
|
||||||
public SAddressStruct<T> Address<T>(string plcAddrName, string name = null) where T : struct {
|
public StructStp<T> Struct<T>(string dtAddr, string name = null) where T : struct {
|
||||||
|
|
||||||
var data = ParseAddress(plcAddrName, name);
|
var data = ParseAddress(dtAddr, name);
|
||||||
|
|
||||||
data.dotnetVarType = typeof(T);
|
data.dotnetVarType = typeof(T);
|
||||||
|
|
||||||
unfinishedList.Add(data);
|
unfinishedList.Add(data);
|
||||||
|
|
||||||
return new SAddressStruct<T>(data) {
|
return new StructStp<T>(data) {
|
||||||
builder = this,
|
builder = this,
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SAddressString<T> AddressString<T>(string plcAddrName, int sizeHint, string name = null) where T : class {
|
public StringStp<T> String<T>(string dtAddr, int sizeHint, string name = null) where T : class {
|
||||||
|
|
||||||
var data = ParseAddress(plcAddrName, name);
|
var data = ParseAddress(dtAddr, name);
|
||||||
|
|
||||||
|
data.dotnetVarType = typeof(T);
|
||||||
|
data.byteSizeHint = (uint)sizeHint;
|
||||||
|
|
||||||
|
unfinishedList.Add(data);
|
||||||
|
|
||||||
|
if (typeof(T).IsArray) {
|
||||||
|
|
||||||
|
return new StringStp<T>(data, true) {
|
||||||
|
Data = data,
|
||||||
|
builder = this,
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StringStp<T>(data) {
|
||||||
|
builder = this,
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayStp<T> Array<T>(string dtAddr, string name = null) where T : class {
|
||||||
|
|
||||||
|
var data = ParseAddress(dtAddr, name);
|
||||||
|
|
||||||
data.dotnetVarType = typeof(T);
|
data.dotnetVarType = typeof(T);
|
||||||
|
|
||||||
@@ -63,46 +88,23 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
if (typeof(T).IsArray) {
|
if (typeof(T).IsArray) {
|
||||||
|
|
||||||
return new SAddressString<T>(data, true) {
|
return new ArrayStp<T>(data, true) {
|
||||||
Data = data,
|
Data = data,
|
||||||
builder = this,
|
builder = this,
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SAddressString<T>(data) {
|
return new ArrayStp<T>(data) {
|
||||||
builder = this,
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public SAddressArray<T> AddressArray<T>(string plcAddrName, string name = null) where T : class {
|
|
||||||
|
|
||||||
var data = ParseAddress(plcAddrName, name);
|
|
||||||
|
|
||||||
data.dotnetVarType = typeof(T);
|
|
||||||
|
|
||||||
unfinishedList.Add(data);
|
|
||||||
|
|
||||||
if (typeof(T).IsArray) {
|
|
||||||
|
|
||||||
return new SAddressArray<T>(data, true) {
|
|
||||||
Data = data,
|
|
||||||
builder = this,
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return new SAddressArray<T>(data) {
|
|
||||||
builder = this,
|
builder = this,
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//internal use only, adds a type definition (for use when building from attibute)
|
//internal use only, adds a type definition (for use when building from attibute)
|
||||||
internal SAddress AddressFromAttribute(string plcAddrName, string typeDef, RegisterCollection regCol, PropertyInfo prop, uint? bytesizeHint = null) {
|
internal AddressStp AddressFromAttribute(string dtAddr, string typeDef, RegisterCollection regCol, PropertyInfo prop, uint? bytesizeHint = null) {
|
||||||
|
|
||||||
var built = Address(plcAddrName);
|
var built = Address(dtAddr);
|
||||||
|
|
||||||
built.Data.typeDef = typeDef;
|
built.Data.typeDef = typeDef;
|
||||||
built.Data.buildSource = RegisterBuildSource.Attribute;
|
built.Data.buildSource = RegisterBuildSource.Attribute;
|
||||||
@@ -119,7 +121,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
#region Typing stage
|
#region Typing stage
|
||||||
|
|
||||||
//non generic
|
//non generic
|
||||||
public new class SAddress : RBuildBase.SAddress {
|
public new class AddressStp : RBuildBase.SAddress {
|
||||||
|
|
||||||
public new TypedRegister AsType<T>() => new TypedRegister().Map(base.AsType<T>());
|
public new TypedRegister AsType<T>() => new TypedRegister().Map(base.AsType<T>());
|
||||||
|
|
||||||
@@ -134,9 +136,9 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//structs
|
//structs
|
||||||
public class SAddressStruct<T> : RBuildBase.SAddress where T : struct {
|
public class StructStp<T> : RBuildBase.SAddress where T : struct {
|
||||||
|
|
||||||
internal SAddressStruct(StepData data) {
|
internal StructStp(StepData data) {
|
||||||
|
|
||||||
this.Data = data;
|
this.Data = data;
|
||||||
|
|
||||||
@@ -144,7 +146,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal SAddressStruct(StepData data, bool arrayed) {
|
internal StructStp(StepData data, bool arrayed) {
|
||||||
|
|
||||||
this.Data = data;
|
this.Data = data;
|
||||||
|
|
||||||
@@ -159,12 +161,60 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OutStruct<T> PollLevel(int level) {
|
||||||
|
|
||||||
|
Data.pollLevel = level;
|
||||||
|
|
||||||
|
return new OutStruct<T>().Map(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//arrays
|
||||||
|
public class ArrayStp<T> : RBuildBase.SAddress {
|
||||||
|
|
||||||
|
internal ArrayStp(StepData data) {
|
||||||
|
|
||||||
|
Data = data;
|
||||||
|
|
||||||
|
this.Map(AsType(typeof(T)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal ArrayStp(StepData data, bool arrayed) {
|
||||||
|
|
||||||
|
Data = data;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypedRegisterArray<T> Indices(params int[] indices) {
|
||||||
|
|
||||||
|
if (typeof(T).GetElementType() == typeof(string) && Data.byteSizeHint == null) {
|
||||||
|
|
||||||
|
throw new NotSupportedException($"For string arrays use {nameof(ArrayStp<T>.StrHint)} before setting the indices");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.arrayIndicies = indices;
|
||||||
|
|
||||||
|
return new TypedRegisterArray<T>().Map(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypedRegisterStringArray<T> StrHint(int hint) {
|
||||||
|
|
||||||
|
Data.byteSizeHint = (uint)hint;
|
||||||
|
return new TypedRegisterStringArray<T>().Map(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//strings
|
//strings
|
||||||
public class SAddressString<T> : RBuildBase.SAddress where T : class {
|
public class StringStp<T> : RBuildBase.SAddress where T : class {
|
||||||
|
|
||||||
internal SAddressString(StepData data) {
|
internal StringStp(StepData data) {
|
||||||
|
|
||||||
this.Data = data;
|
this.Data = data;
|
||||||
|
|
||||||
@@ -172,7 +222,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal SAddressString(StepData data, bool arrayed) {
|
internal StringStp(StepData data, bool arrayed) {
|
||||||
|
|
||||||
this.Data = data;
|
this.Data = data;
|
||||||
|
|
||||||
@@ -189,37 +239,6 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//arrays
|
|
||||||
public class SAddressArray<T> : RBuildBase.SAddress {
|
|
||||||
|
|
||||||
internal SAddressArray(StepData data) {
|
|
||||||
|
|
||||||
this.Data = data;
|
|
||||||
|
|
||||||
this.Map(AsType(typeof(T)));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal SAddressArray(StepData data, bool arrayed) {
|
|
||||||
|
|
||||||
this.Data = data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public TypedRegister Indicies(params int[] indicies) => new TypedRegister().Map(base.AsTypeArray<T>(indicies));
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Outputs the generated <see cref="IRegister"/>
|
|
||||||
/// </summary>
|
|
||||||
public void Out(Action<IArrayRegister<T>> registerOut) {
|
|
||||||
|
|
||||||
Data.registerOut = new Action<object>(o => registerOut((IArrayRegister<T>)o));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Typing size hint
|
#region Typing size hint
|
||||||
@@ -236,12 +255,55 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void Out(Action<IRegister> registerOut) {
|
public void Out(Action<IRegister> registerOut) {
|
||||||
|
|
||||||
Data.registerOut = (Action<object>)registerOut;
|
Data.registerOut = new Action<object>(o => registerOut((IRegister)o));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TypedRegisterString<T> : RBuildBase.TypedRegister where T : class {
|
||||||
|
|
||||||
|
public new OptionsRegister SizeHint(int hint) => new OptionsRegister().Map(base.SizeHint(hint));
|
||||||
|
|
||||||
|
///<inheritdoc cref="RBuildBase.OptionsRegister.PollLevel(int)"/>
|
||||||
|
public new OutRegister PollLevel(int level) => new OutRegister().Map(base.PollLevel(level));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Outputs the generated <see cref="IRegister"/>
|
||||||
|
/// </summary>
|
||||||
|
public void Out(Action<IStringRegister<T>> registerOut) {
|
||||||
|
|
||||||
|
Data.registerOut = new Action<object>(o => registerOut((IStringRegister<T>)o));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TypedRegisterArray<T> : RBuildBase.TypedRegister {
|
||||||
|
|
||||||
|
public new OutArray<T> PollLevel(int level) => new OutArray<T>().Map(base.PollLevel(level));
|
||||||
|
|
||||||
|
public void Out(Action<IArrayRegister<T>> registerOut) {
|
||||||
|
|
||||||
|
Data.registerOut = new Action<object>(o => registerOut((IArrayRegister<T>)o));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TypedRegisterStringArray<T> : RBuildBase.TypedRegister {
|
||||||
|
|
||||||
|
public OptionsRegisterArray<T> Indices(params int[] indices) {
|
||||||
|
|
||||||
|
Data.arrayIndicies = indices;
|
||||||
|
return new OptionsRegisterArray<T>().Map(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public new OutArray<T> PollLevel(int level) => new OutArray<T>().Map(base.PollLevel(level));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Options stage
|
#region Options stage
|
||||||
@@ -256,7 +318,20 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void Out(Action<IRegister> registerOut) {
|
public void Out(Action<IRegister> registerOut) {
|
||||||
|
|
||||||
Data.registerOut = (Action<object>)registerOut;
|
Data.registerOut = new Action<object>(o => registerOut((IRegister)o));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsRegisterArray<T> : RBuildBase.OptionsRegister {
|
||||||
|
|
||||||
|
///<inheritdoc cref="RBuildBase.OptionsRegister.PollLevel(int)"/>
|
||||||
|
public new OutArray<T> PollLevel(int level) => new OutArray<T>().Map(base.PollLevel(level));
|
||||||
|
|
||||||
|
public void Out(Action<IArrayRegister<T>> registerOut) {
|
||||||
|
|
||||||
|
Data.registerOut = new Action<object>(o => registerOut((IArrayRegister<T>)o));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,17 +341,35 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
public class OutRegister : SBase {
|
public class OutRegister : SBase {
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Outputs the generated <see cref="IRegister"/>
|
|
||||||
/// </summary>
|
|
||||||
public void Out(Action<IRegister> registerOut) {
|
public void Out(Action<IRegister> registerOut) {
|
||||||
|
|
||||||
Data.registerOut = (Action<object>)registerOut;
|
Data.registerOut = new Action<object>(o => registerOut((IRegister)o));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class OutStruct<T> : SBase where T : struct {
|
||||||
|
|
||||||
|
public void Out(Action<IRegister<T>> registerOut) {
|
||||||
|
|
||||||
|
Data.registerOut = new Action<object>(o => registerOut((IRegister<T>)o));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OutArray<T> : SBase {
|
||||||
|
|
||||||
|
public void Out(Action<IArrayRegister<T>> registerOut) {
|
||||||
|
|
||||||
|
Data.registerOut = new Action<object>(o => registerOut((IArrayRegister<T>)o));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace MewtocolNet.RegisterBuilding {
|
|||||||
|
|
||||||
internal void InvokeBuilt(Register reg) {
|
internal void InvokeBuilt(Register reg) {
|
||||||
|
|
||||||
registerOut.Invoke(reg);
|
registerOut?.Invoke(reg);
|
||||||
|
|
||||||
//var selftype = this.GetType();
|
//var selftype = this.GetType();
|
||||||
|
|
||||||
|
|||||||
@@ -339,6 +339,13 @@ namespace MewtocolNet.UnderlyingRegisters {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//get the plc status each n iterations
|
||||||
|
if (pollIteration % 5 == 0) {
|
||||||
|
|
||||||
|
await mewInterface.GetPLCInfoAsync();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (pollIteration == uint.MaxValue) {
|
if (pollIteration == uint.MaxValue) {
|
||||||
pollIteration = uint.MinValue;
|
pollIteration = uint.MinValue;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user