[COLOR="#008000"]//für bessere Performance als SCL die Adresse des Aktualparameters IN:ErrMsgBytes
//schon vor der FOR-Schleife holen:[/COLOR]
L P##ErrMsgBytes [COLOR="#008000"]//IN: ErrMsgBytes : ARRAY[1..150] OF BYTE;[/COLOR]
[COLOR="#008000"]// //IN: ErrBitFeld AT ErrMsgBytes : ARRAY[1..1200] OF BOOL;[/COLOR]
LAR1 [COLOR="#008000"]//wird als POINTER an den FC übergeben[/COLOR]
L W [AR1,P#0.0] [COLOR="#008000"]//POINTER: DB-Nr[/COLOR]
T #IN_ErrBitFeld_DB [COLOR="#008000"]//(TEMP: Word)[/COLOR]
L D [AR1,P#2.0] [COLOR="#008000"]//POINTER: Bereichsadresse[/COLOR]
T #IN_ErrBitFeld_Adr [COLOR="#008000"]//(TEMP: DWord)[/COLOR]
[COLOR="#006400"]//gesetztes Fehlerbit suchen und dessen Nummer in Fehlernummern-Array eintragen
//[/COLOR] [COLOR="#0000FF"]n := 1;[/COLOR] [COLOR="#006400"]//Index in Fehlernummern-Array (1..10)
//[/COLOR] [COLOR="#0000FF"]FOR i := 1 TO 1200 DO[/COLOR] [COLOR="#006400"]//Index in FehlerBitfeld (1..1200)[/COLOR]
L 1
T #n [COLOR="#008000"]//(TEMP: Int)[/COLOR]
T #i [COLOR="#008000"]//(TEMP: Int)[/COLOR]
[COLOR="#008000"]// FOR i .. TO 1200 DO[/COLOR]
MFOR: L #i
L 1200
<=I
SPBN MWHI
[COLOR="#008000"]//Adresse IN:ErrBitFeld[i] berechnen[/COLOR]
L #i
+ -1 [COLOR="#008000"]//weil IN:ErrBitFeld[] mit Index 1 beginnt[/COLOR]
L #IN_ErrBitFeld_Adr [COLOR="#008000"]//Adresse des Aktualparameters IN:ErrBitFeld[] [/COLOR]
+D
LAR1 [COLOR="#008000"]//Adresse IN:ErrBitFeld[i][/COLOR]
[COLOR="#006400"]// [COLOR="#0000FF"]IF ErrBitFeld[i] THEN[/COLOR] //FehlerBit gesetzt?[/COLOR]
AUF DB [#IN_ErrBitFeld_DB]
U [AR1,P#0.0]
SPBN EFOR [COLOR="#008000"]//zu END_IF; END_FOR;[/COLOR]
[COLOR="#006400"]// [COLOR="#0000FF"]tmpErrActive[n] := i;[/COLOR] //Fehlernummer in Fehlernummern-Array eintragen[/COLOR]
L #n
+ -1 [COLOR="#008000"]//weil tmpErrActive[] mit Index 1 beginnt[/COLOR]
SLD 4 [COLOR="#008000"]//tmpErrActive ist ein INT-Array[/COLOR]
L P##tmpErrActive [COLOR="#008000"]//Anfangsadresse tmpErrActive[][/COLOR]
+D
LAR1 [COLOR="#008000"]//Adresse tmpErrActive[n][/COLOR]
L #i
T LW [AR1,P#0.0] [COLOR="#008000"]//tmpErrActive[n] := i;[/COLOR]
[COLOR="#006400"]// [COLOR="#0000FF"]n := n + 1;[/COLOR] //Index auf nächsten Fehlernummern-Eintrag
// [COLOR="#0000FF"]IF n > 10 THEN[/COLOR]
// [COLOR="#0000FF"]EXIT;[/COLOR] //FOR-Schleife verlassen weil bereits 10 1-Bits gefunden
// [COLOR="#0000FF"]END_IF;[/COLOR][/COLOR]
L #n
+ 1
T #n
L 10
>I
SPB MWHI [COLOR="#008000"]//EXIT FOR[/COLOR]
[COLOR="#006400"]// [COLOR="#0000FF"]END_IF;[/COLOR]
// [COLOR="#0000FF"]END_IF;[/COLOR]
// [COLOR="#0000FF"]END_FOR;[/COLOR] ---> i++[/COLOR]
EFOR: L #i
+ 1
T #i
SPA MFOR [COLOR="#008000"]//zurück zu FOR ...[/COLOR]
[COLOR="#006400"]//restliche Fehlernummern löschen
// [COLOR="#0000FF"]WHILE n <= 10 DO[/COLOR][/COLOR]
MWHI: L #n
L 10
<=I
SPBN MRET [COLOR="#008000"]//zu END_WHILE;
//[/COLOR] [COLOR="#0000FF"]tmpErrActive[n] := 0;[/COLOR]
L #n
+ -1 [COLOR="#008000"]//weil tmpErrActive[] mit Index 1 beginnt[/COLOR]
SLD 4 [COLOR="#008000"]//tmpErrActive ist ein INT-Array[/COLOR]
L P##tmpErrActive [COLOR="#008000"]//Anfangsadresse tmpErrActive[][/COLOR]
+D
LAR1 [COLOR="#008000"]//Adresse tmpErrActive[n][/COLOR]
L 0
T LW [AR1,P#0.0] [COLOR="#008000"]//tmpErrActive[n] := 0;[/COLOR]
// [COLOR="#0000FF"]n := n + 1;[/COLOR]
L #n
+ 1
T #n
SPA MWHI [COLOR="#008000"]//zurück zu WHILE ...
//[/COLOR] [COLOR="#0000FF"]END_WHILE;[/COLOR]
[COLOR="#006400"]//Array mit den Fehlernummern (an Leitrechner) zurückgeben
// [COLOR="#0000FF"]ErrActive := tmpErrActive;[/COLOR][/COLOR]
MRET: L P##ErrActive [COLOR="#008000"]//OUT: ErrActive : ARRAY[1..10] OF INT;[/COLOR]
LAR1 [COLOR="#008000"]//wird als POINTER an den FC übergeben[/COLOR]
L W [AR1,P#0.0] [COLOR="#008000"]//POINTER: DB-Nr[/COLOR]
T #OUT_ErrActive_DB [COLOR="#008000"]//(TEMP: Word)[/COLOR]
AUF DB [#OUT_ErrActive_DB]
L D [AR1,P#2.0] [COLOR="#008000"]//POINTER: Bereichsadresse (OUT_ErrActive_Adr)[/COLOR]
LAR1
[COLOR="#008000"]//kopieren mit SFC20 BLKMOV ist nicht möglich!
//deshalb mit AR2 kopieren: " *LAR1 <-- *LAR2 "[/COLOR]
LAR2 P##tmpErrActive [COLOR="#008000"]//tmpErrActive : ARRAY[1..10] OF INT[/COLOR]
L LD [AR2,P#0.0] [COLOR="#008000"]//von tmpErrActive ...[/COLOR]
T D [AR1,P#0.0] [COLOR="#008000"]//nach ErrActive ...[/COLOR]
L LD [AR2,P#4.0]
T D [AR1,P#4.0]
L LD [AR2,P#8.0]
T D [AR1,P#8.0]
L LD [AR2,P#12.0]
T D [AR1,P#12.0]
L LD [AR2,P#16.0]
T D [AR1,P#16.0]