From 4c44694f05fa8483d4a672adb60be95e3096a61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 18 May 2026 09:33:07 +0200 Subject: [PATCH 01/19] MBP-389: Fix infinite loop in monitoring --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index a638366d..6d880763 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -475,6 +475,10 @@ bSlaveLinkError := FALSE; aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := ', Slave Id #: '; aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', Slave Id #: '; +IF nActualEcSlaves = 0 THEN + RETURN; +END_IF + FOR i:=0 TO nActualEcSlaves-1 DO IF stSlaveState[i].linkState <> EC_LINK_STATE_OK THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := From f0702874ddfd83a64e3ebc81a51a8da692ecb117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 18 May 2026 09:36:10 +0200 Subject: [PATCH 02/19] MBP-389: Add error message when no EC slaves found --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 3 +++ 1 file changed, 3 insertions(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 6d880763..3b215df9 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -476,6 +476,9 @@ aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := ', Slave Id #: '; aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', Slave Id #: '; IF nActualEcSlaves = 0 THEN + IF fbEtherCATAlarmDelayTON.Q THEN + ADSLOGSTR(ADSLOG_MSGTYPE_ERROR,'FB_ESSMonitoringBase Error: %s','0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); + END_IF RETURN; END_IF From ed5f62afeaac60774093d2450b4c20563cff287f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 18 May 2026 09:42:09 +0200 Subject: [PATCH 03/19] MBP-389: Fix white space --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 3b215df9..5e7a7f94 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -476,10 +476,10 @@ aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := ', Slave Id #: '; aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', Slave Id #: '; IF nActualEcSlaves = 0 THEN - IF fbEtherCATAlarmDelayTON.Q THEN - ADSLOGSTR(ADSLOG_MSGTYPE_ERROR,'FB_ESSMonitoringBase Error: %s','0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); - END_IF - RETURN; + IF fbEtherCATAlarmDelayTON.Q THEN + ADSLOGSTR(ADSLOG_MSGTYPE_ERROR,'FB_ESSMonitoringBase Error: %s','0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); + END_IF + RETURN; END_IF FOR i:=0 TO nActualEcSlaves-1 DO From af2b6fe3e2056395f081ffb9020261059c79688d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Tue, 7 Jul 2026 12:49:51 +0200 Subject: [PATCH 04/19] MBP-389: Add slave link error message Updates and enabled error message of slave link error, when no EtherCAT slave were found. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 2 ++ 1 file changed, 2 insertions(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 5e7a7f94..99bdb5b2 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -479,6 +479,8 @@ IF nActualEcSlaves = 0 THEN IF fbEtherCATAlarmDelayTON.Q THEN ADSLOGSTR(ADSLOG_MSGTYPE_ERROR,'FB_ESSMonitoringBase Error: %s','0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); END_IF + bSlaveLinkError := TRUE; + aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', 0 EtherCAT Slaves found'; RETURN; END_IF From 23a8906f3067b6c660b0d61f0b115d94c015f0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Tue, 7 Jul 2026 12:52:29 +0200 Subject: [PATCH 05/19] MBP-389: Fix cycle time spikes during monitoring Reduces the amount of data being copied drung EtherCAT monitoring, which caused cycle time spikes. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 99bdb5b2..fa1bf748 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -425,10 +425,6 @@ fbGetEcConfSlaves( pArrEcConfSlaveInfo := ADR(_aSlaveConfig), cbBufLen := SIZEOF(_aSlaveConfig), bExecute := TON_UpdateGetEcConfSlaves.Q); -IF NOT fbGetEcConfSlaves.bBusy AND NOT fbGetEcConfSlaves.bError THEN - aSlaveConfig := _aSlaveConfig; -END_IF - nEcMasterFramesLost := fbGetEcMasterFrames.nLostFrames; @@ -484,6 +480,11 @@ IF nActualEcSlaves = 0 THEN RETURN; END_IF +//Copy slave config info from temporary container +IF NOT fbGetEcConfSlaves.bBusy AND NOT fbGetEcConfSlaves.bError THEN + MEMMOVE(destAddr:=ADR(aSlaveConfig), srcAddr:=ADR(_aSlaveConfig), n:=nActualEcSlaves*SIZEOF(ST_EcSlaveConfigData)); +END_IF + FOR i:=0 TO nActualEcSlaves-1 DO IF stSlaveState[i].linkState <> EC_LINK_STATE_OK THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := From 4bb5ba068718bab7352d5a190d7a5d9952cc24f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Thu, 23 Jul 2026 14:07:46 +0200 Subject: [PATCH 06/19] MBP-389: Add clear to config based on slave count Adds clear to aSlaveConfig if the current slave count is less than, the count in the previous cycle to not have invalid data stored inside aSlaveConfig from previous copy. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 3 +++ 1 file changed, 3 insertions(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index fa1bf748..acf69942 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -450,6 +450,9 @@ fbGetEcSlaveStates( pStateBuf:=ADR(stSlaveState), cbBufLen:=SIZEOF(stSlaveState), bExecute:=fbUpdateEcSlaveStateTON.q); +IF fbGetEcSlaveStates.nSlaves < nActualEcSlaves THEN + MEMSET(destAddr := ADR(aSlaveConfig), fillByte := 0, n := SIZEOF(aSlaveConfig)); +END_IF nActualEcSlaves:=fbGetEcSlaveStates.nSlaves; fbEtherCATAlarmDelayTON(IN:=bStartEtherCATdelayTON, PT:=T#3S); From 7a5498281880b69bd1f81a7c090627a0a5ecfe06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Tue, 25 Aug 2026 16:10:35 +0200 Subject: [PATCH 07/19] MBP-389: Use read/write buffers Uses read/write buffers to remove the use of MEMCOPY/MEMMOVE/MEMSET, which increased cycle time. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index acf69942..a20b4418 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -403,8 +403,11 @@ VAR_INST nActualEcSlaves: UINT := 0; TON_UpdateGetEcConfSlaves: TON; fbGetEcConfSlaves: FB_EcGetConfSlaves; - _aSlaveConfig: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; // Temporary container - aSlaveConfig: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; + aSlaveConfigBuffer1: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 1 for EtherCAT Slave Config Data + aSlaveConfigBuffer2: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 2 for EtherCAT Slave Config Data + pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access + pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access + //Frame statistics fbUpdateEcMasterFrame: TON; @@ -419,11 +422,22 @@ END_VAR EC_LINK_STATE_OK THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=UINT_TO_STRING(i+1)); IF NOT bSlaveLinkError THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := - CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=CONCAT('-', LEFT(aSlaveConfig[i+1].sName, FIND(aSlaveConfig[i+1].sName,' (')-1))); + CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=CONCAT('-', LEFT(pReadSlaveConfigBuffer^[i+1].sName, FIND(pReadSlaveConfigBuffer^[i+1].sName,' (')-1))); END_IF aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=', '); @@ -508,7 +514,7 @@ FOR i:=0 TO nActualEcSlaves-1 DO CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:= UINT_TO_STRING(i+1)); IF NOT bSlaveStateNotOP THEN aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := - CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=CONCAT('-', LEFT(aSlaveConfig[i+1].sName, FIND(aSlaveConfig[i+1].sName,' (')-1))); + CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=CONCAT('-', LEFT(pReadSlaveConfigBuffer^[i+1].sName, FIND(pReadSlaveConfigBuffer^[i+1].sName,' (')-1))); END_IF aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=', '); From 82eeef8ea92bfd10718e4d8c189c55db75b98e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Wed, 26 Aug 2026 08:33:29 +0200 Subject: [PATCH 08/19] MBP-389: Fix slave config data update timer Fixes the timer of get slave config data to work as a delay after a finished read out instead of triggering execute every 100 ms, eventough the read function block was still busy. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 1 + 1 file changed, 1 insertion(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index a20b4418..44846ea2 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -422,6 +422,7 @@ END_VAR Date: Wed, 26 Aug 2026 08:38:28 +0200 Subject: [PATCH 09/19] MBP-389: Calculate init delay based on slave count --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 44846ea2..5d267bab 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -467,7 +467,7 @@ fbGetEcSlaveStates( bExecute:=fbUpdateEcSlaveStateTON.q); nActualEcSlaves:=fbGetEcSlaveStates.nSlaves; -fbEtherCATAlarmDelayTON(IN:=bStartEtherCATdelayTON, PT:=T#3S); +fbEtherCATAlarmDelayTON(IN:=bStartEtherCATdelayTON, PT:=MAX(nActualEcSlaves * T#30MS, T#3S)); IF fbEtherCATAlarmDelayTON.Q THEN bStartEtherCATdelayTON := FALSE; bEtherCATInitialized := TRUE; From b48186f85a7f59ee66f3aac7f09a40a1596b877a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Wed, 26 Aug 2026 08:40:05 +0200 Subject: [PATCH 10/19] MBP-389: Update formatting to new coding standard --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 23 ++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 5d267bab..c79838a9 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -405,8 +405,8 @@ VAR_INST fbGetEcConfSlaves: FB_EcGetConfSlaves; aSlaveConfigBuffer1: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 1 for EtherCAT Slave Config Data aSlaveConfigBuffer2: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 2 for EtherCAT Slave Config Data - pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access - pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access + pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access + pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access //Frame statistics @@ -426,13 +426,13 @@ TON_UpdateGetEcConfSlaves(IN:=NOT (fbGetEcConfSlaves.bBusy OR fbGetEcConfSlaves. //Swap buffer if read out is finished IF TON_UpdateGetEcConfSlaves.Q THEN - IF pWriteSlaveConfigBuffer = ADR(aSlaveConfigBuffer1) THEN - pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer2); - pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer1); - ELSE - pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer1); - pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer2); - END_IF + IF pWriteSlaveConfigBuffer = ADR(aSlaveConfigBuffer1) THEN + pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer2); + pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer1); + ELSE + pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer1); + pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer2); + END_IF END_IF fbGetEcConfSlaves( @@ -488,7 +488,10 @@ aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', Slave Id #: '; IF nActualEcSlaves = 0 THEN IF fbEtherCATAlarmDelayTON.Q THEN - ADSLOGSTR(ADSLOG_MSGTYPE_ERROR,'FB_ESSMonitoringBase Error: %s','0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); + ADSLOGSTR( + msgCtrlMask := ADSLOG_MSGTYPE_ERROR, + msgFmtStr := 'FB_ESSMonitoringBase Error: %s', + strArg := '0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring'); END_IF bSlaveLinkError := TRUE; aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', 0 EtherCAT Slaves found'; From 00b7d02034d8f4e25b33ae3f3fb34fc753067abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Fri, 11 Sep 2026 14:53:11 +0200 Subject: [PATCH 11/19] MBP-389: Use first read done bool instead of timer Changes early return logic, checks when FB_EcGetConfSlaves is done with the first readout, instead of relying on a timer. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 38 ++++++++-------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index c79838a9..4393cd2a 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -408,24 +408,28 @@ VAR_INST pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access - //Frame statistics fbUpdateEcMasterFrame: TON; fbGetEcMasterFrames: FB_EcMasterFrameStatistic; - - fbEtherCATAlarmDelayTON: TON; - bStartEtherCATdelayTON: BOOL := FALSE; - bEtherCATInitialized: BOOL := FALSE; + bFirstReadSlaveConfigDone: BOOL := FALSE; + bErrorZeroEcSlavesFound: BOOL := FALSE; END_VAR ]]> Date: Mon, 14 Sep 2026 14:13:48 +0200 Subject: [PATCH 12/19] MBP-389: Change order of return checks Changes order of early returns to be able print error message even when there was no sucessful read at all. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 4393cd2a..870b1668 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -463,10 +463,6 @@ fbGetEcSlaveStates( bExecute:=fbUpdateEcSlaveStateTON.q); nActualEcSlaves:=fbGetEcSlaveStates.nSlaves; -IF NOT bFirstReadSlaveConfigDone THEN - RETURN; -END_IF - bEcMasterError := _nEcMasterDevState > 0; // After startup timeout, reset variables before loop @@ -488,6 +484,10 @@ IF nActualEcSlaves = 0 THEN RETURN; END_IF +IF NOT bFirstReadSlaveConfigDone THEN + RETURN; +END_IF + FOR i:=0 TO nActualEcSlaves-1 DO IF stSlaveState[i].linkState <> EC_LINK_STATE_OK THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := From 32d19031764fef56d76737d1a4e05feb39e0eaf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 14 Sep 2026 14:15:06 +0200 Subject: [PATCH 13/19] MBP-389: Add clear of zero slave found error Adds clear of zero slave found error to be able to detect it more than once. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 1 + 1 file changed, 1 insertion(+) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 870b1668..8a79c8ab 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -483,6 +483,7 @@ IF nActualEcSlaves = 0 THEN aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', 0 EtherCAT Slaves found'; RETURN; END_IF +bErrorZeroEcSlavesFound := FALSE; IF NOT bFirstReadSlaveConfigDone THEN RETURN; From 84fadf2e2495d758189d1ea627f2aef8ab9d39fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 14 Sep 2026 14:18:07 +0200 Subject: [PATCH 14/19] MBP-389: Fix issue buffer swap without read Fixes the issue of possible buffer swap without sucessful read of configured slave data, by introducing the check of returned slave count. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 8a79c8ab..89361421 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -427,8 +427,11 @@ fbGetEcConfSlaves( bExecute := NOT (fbGetEcConfSlaves.bBusy OR fbGetEcConfSlaves.bError)); nEcMasterFramesLost := fbGetEcMasterFrames.nLostFrames; -//Swap buffer if read out is finished -IF NOT (fbGetEcConfSlaves.bBusy OR fbGetEcConfSlaves.bError) THEN +//Swap buffer if read out is sucessfully finishes +IF NOT (fbGetEcConfSlaves.bBusy + OR fbGetEcConfSlaves.bError + OR fbGetEcConfSlaves.nSlaves = 0) +THEN bFirstReadSlaveConfigDone := TRUE; IF pWriteSlaveConfigBuffer = ADR(aSlaveConfigBuffer1) THEN pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer2); From de09ae1a3a64f9770c92738983513c50079be6ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 14 Sep 2026 14:22:51 +0200 Subject: [PATCH 15/19] MBP-389: Change execute logic of all diag fbs Changes execute logic of all diagnostic function blocks to start the execution on startup and to have a consistent logic. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 43 +++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 89361421..5ac33f1f 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -397,35 +397,34 @@ VAR END_VAR VAR_INST - fbUpdateEcSlaveStateTON: TON; fbGetEcSlaveStates: FB_EcGetAllSlaveStates; stSlaveState: ARRAY[0..nMAX_EC_SLAVES] OF ST_EcSlaveState; nActualEcSlaves: UINT := 0; - TON_UpdateGetEcConfSlaves: TON; fbGetEcConfSlaves: FB_EcGetConfSlaves; aSlaveConfigBuffer1: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 1 for EtherCAT Slave Config Data aSlaveConfigBuffer2: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 2 for EtherCAT Slave Config Data pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access - - //Frame statistics - fbUpdateEcMasterFrame: TON; fbGetEcMasterFrames: FB_EcMasterFrameStatistic; bFirstReadSlaveConfigDone: BOOL := FALSE; bErrorZeroEcSlavesFound: BOOL := FALSE; END_VAR ]]> - 0; -// After startup timeout, reset variables before loop +//After startup reset variables before loop bSlaveStateNotOP := FALSE; bSlaveLinkError := FALSE; aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := ', Slave Id #: '; From d7e238da429dcfd3a76d3836990415501d74b995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szil=C3=A1rd=20H=C3=B6kk=C3=B6n?= Date: Mon, 14 Sep 2026 14:29:29 +0200 Subject: [PATCH 16/19] MBP-389: Add auto reset --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 5ac33f1f..540fb2c5 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -406,16 +406,24 @@ VAR_INST pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access fbGetEcMasterFrames: FB_EcMasterFrameStatistic; + tonAutoResetError: TON := (PT := T#3S); bFirstReadSlaveConfigDone: BOOL := FALSE; bErrorZeroEcSlavesFound: BOOL := FALSE; END_VAR ]]> + Date: Mon, 14 Sep 2026 15:02:36 +0200 Subject: [PATCH 17/19] MBP-389: Add init of buffer addresses Adds init of buffer addresses, to fix initialization restriction of variables inside VAR_INST. --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index 540fb2c5..d3044101 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -403,16 +403,23 @@ VAR_INST fbGetEcConfSlaves: FB_EcGetConfSlaves; aSlaveConfigBuffer1: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 1 for EtherCAT Slave Config Data aSlaveConfigBuffer2: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 2 for EtherCAT Slave Config Data - pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer1); //Pointer to the buffer with write access - pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData := ADR(aSlaveConfigBuffer2); //Pointer to the buffer with read access + pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with write access + pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with read access fbGetEcMasterFrames: FB_EcMasterFrameStatistic; tonAutoResetError: TON := (PT := T#3S); bFirstReadSlaveConfigDone: BOOL := FALSE; bErrorZeroEcSlavesFound: BOOL := FALSE; + bInit: BOOL := TRUE; END_VAR ]]> - Date: Thu, 24 Sep 2026 09:40:15 +0200 Subject: [PATCH 18/19] MBP-389: Add constant to define auto reset time --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index d3044101..da060a66 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -406,11 +406,14 @@ VAR_INST pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with write access pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with read access fbGetEcMasterFrames: FB_EcMasterFrameStatistic; - tonAutoResetError: TON := (PT := T#3S); + tonAutoResetError: TON; bFirstReadSlaveConfigDone: BOOL := FALSE; bErrorZeroEcSlavesFound: BOOL := FALSE; bInit: BOOL := TRUE; END_VAR +VAR CONSTANT + tAUTO_RESET: TIME := T#3S; +END_VAR ]]> Date: Thu, 24 Sep 2026 09:40:44 +0200 Subject: [PATCH 19/19] MBP-389: Fix indentation --- POUs/Monitoring/FB_ESSMonitoringBase.TcPOU | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU index da060a66..a522db72 100644 --- a/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU +++ b/POUs/Monitoring/FB_ESSMonitoringBase.TcPOU @@ -425,9 +425,9 @@ END_IF tonAutoResetError( PT := tAUTO_RESET, IN := NOT tonAutoResetError.Q - AND (fbGetEcMasterFrames.bError - OR fbGetEcConfSlaves.bError - OR fbGetEcSlaveStates.bError)); + AND (fbGetEcMasterFrames.bError + OR fbGetEcConfSlaves.bError + OR fbGetEcSlaveStates.bError)); //Read the frame statistics of the EtherCAT master. fbGetEcMasterFrames(