Fix not supported extended msg header on older plcs

This commit is contained in:
Felix Weiß
2023-08-21 13:44:30 +02:00
parent 5221664071
commit 5ff29e3ffc
6 changed files with 46 additions and 6 deletions

View File

@@ -444,6 +444,30 @@ namespace MewtocolNet
/// <returns></returns>
public EndInitSetup<T> WithHeartbeatTask(Func<Task> heartBeatAsync, bool executeInProg = false) => WithHeartbeatTask(heartBeatAsync, executeInProg);
/// <summary>
/// Disables all heartbeat tasks
/// </summary>
/// <returns></returns>
public EndInitSetup<T> DisableHeartBeat() {
try {
var plc = (MewtocolInterface)(object)this.intf;
plc.disableHeartbeat = true;
return new EndInitSetup<T> {
postInit = this,
};
} catch {
throw;
}
}
/// <summary>
/// Builds and returns the final plc interface
/// </summary>

View File

@@ -79,6 +79,8 @@ namespace MewtocolNet {
private protected Task<MewtocolFrameResponse> regularSendTask;
private protected bool wasInitialStatusReceived;
private protected bool supportsExtendedMessageHeader;
private protected string messageHeader = "%";
private protected MewtocolVersion mewtocolVersion;
#endregion

View File

@@ -24,6 +24,7 @@ namespace MewtocolNet {
internal Task heartbeatTask = Task.CompletedTask;
internal bool disableHeartbeat = false;
internal Func<IPlc, Task> heartbeatCallbackTask;
internal bool execHeartBeatCallbackTaskInProg = false;
@@ -146,6 +147,13 @@ namespace MewtocolNet {
private async Task HeartbeatTickTask () {
if (disableHeartbeat) {
await Task.CompletedTask;
return;
}
if (regularSendTask != null && !regularSendTask.IsCompleted) await regularSendTask;
Logger.LogVerbose("Sending heartbeat", this);

View File

@@ -65,12 +65,21 @@ namespace MewtocolNet {
}
if (isConnectingStage) {
//set the intial obj
PlcInfo = plcInf;
//check if the plc supports the extended command header (<)
var res = await SendCommandInternalAsync($"<{GetStationNumber()}#RDD0000000001");
supportsExtendedMessageHeader = res.Success;
messageHeader = res.Success ? "<" : "%";
} else {
//update the obj with RT dynamic values only
PlcInfo.SelfDiagnosticError = plcInf.SelfDiagnosticError;
PlcInfo.OperationMode = plcInf.OperationMode;
}
return PlcInfo;
@@ -257,7 +266,7 @@ namespace MewtocolNet {
string startStr = start.ToString().PadLeft(5, '0');
string endStr = (start + wordLength - 1).ToString().PadLeft(5, '0');
string requeststring = $"%{GetStationNumber()}#WDD{startStr}{endStr}{byteString}";
string requeststring = $"{messageHeader}{GetStationNumber()}#WDD{startStr}{endStr}{byteString}";
var result = await SendCommandInternalAsync(requeststring);
return result.Success;
@@ -270,6 +279,7 @@ namespace MewtocolNet {
/// </summary>
/// <param name="start">Start adress</param>
/// <param name="byteCount">Number of bytes to get</param>
/// <param name="areaPrefix">The memory area to read</param>
/// <param name="onProgress">Gets invoked when the progress changes, contains the progress as a double from 0 - 1.0</param>
/// <returns>A byte array of the requested DT area</returns>
public async Task<byte[]> ReadAreaByteRangeAsync(int start, int byteCount, RegisterPrefix areaPrefix = RegisterPrefix.DT, Action<double> onProgress = null) {
@@ -316,7 +326,7 @@ namespace MewtocolNet {
int blockSize = wordEnd - wordStart + 1;
string startStr = wordStart.ToString().PadLeft(padLeftLen, '0');
string endStr = wordEnd.ToString().PadLeft(padLeftLen, '0');
string requeststring = $"<{GetStationNumber()}#{areaCodeStr}{startStr}{endStr}";
string requeststring = $"{messageHeader}{GetStationNumber()}#{areaCodeStr}{startStr}{endStr}";
var result = await SendCommandInternalAsync(requeststring, onReceiveProgress: readProg);

View File

@@ -81,8 +81,6 @@ namespace MewtocolNet.Registers {
/// </summary>
uint MemoryAddress { get; }
string MemoryAreaHash { get; }
/// <summary>
/// Gets the value of the register as the plc representation string
/// </summary>

View File

@@ -101,8 +101,6 @@ namespace MewtocolNet.Registers {
public string MemoryAreaInfo => underlyingMemory.ToString();
public string MemoryAreaHash => underlyingMemory.GetHashCode().ToString();
internal Register() { }
internal virtual void OnPlcConnected () {