easy-forum
Deutsch - Software => XSoft-CoDeSys => Thema gestartet von: radar17892 am Juni 01, 2013, 22:20:17 Nachmittag
-
Hallo
Ich brauch mal wieder eure Hilfe!
In einem größeren Projekt möchte ich mit einem Vergleich:
Fehlerarray <> Fehlerarray_alt eine Änderung erkennen und damit die Prozedur zur aktualisierung der GRS Fehlervariablen anstoßen.
Da der direkte Vergleich mit NE nicht geht und es 80 Fehler sind, wollte ich es mit einer FOR Schleife in ST machen.
Meine bisherige Lösung funktioniert leider noch nicht
FUNCTION_BLOCK E_test
VAR_INPUT
(* Error wird direkt aus der global_var gelesen*)
END_VAR
VAR_OUTPUT
ungleich:BOOL:=FALSE ;
END_VAR
VAR
index:INT:=0 ;
Error_alt: ARRAY [0..79] OF BOOL;
END_VAR
____________________________________________
FOR index:=0 TO 79 BY 1 DO
IF (Error [index] <>Error_alt [index]) THEN EXIT; (* ist Unterschied zum letzten Zyklus?*)
ungleich:=TRUE;
END_IF
END_FOR;
Error_alt:=Error;
Wird ein Unterschied gefunden soll ungleich auf true gesetzt werden.
Danke im voraus
Thomas
-
Hallo Thomas,
ich denke vom Prinyip bist du auf dem richtigen Weg. Vielleicht solltest du den Exit entfernen.
Ich koennte mir vorstellen dass dann deine Variable ungleich gar nicht mehr gesetzt wird.
Vielleicht macht es auch Sinn das Array Error_Alt global yu definieren!!??
Gruss Paul
-
Hallo Paul
Habe den Code etwas abgeändert und jetzt funktionierts. Das EXIT war ander falschen Stelle.
Das EXIT muss sein, sonst würde bei nachfolgenden Übereinstimmungen "ungleich" wieder auf FALSE gesetzt und die Schleife mit FALSE beendet.
FOR index:=0 TO 79 BY 1 DO
IF (Error [index] <>Error_alt [index]) THEN (* ist Unterschied zum letzten Zyklus?*)
ungleich:=TRUE; EXIT; (* Bei Unterschied "ungleich" auf true setzen und aus der Schleife springen*)
ELSE ungleich:= FALSE;
END_IF
END_FOR;
Error_alt:=Error; (*Fehlerarray nach alt schieben*)
Außerdem ist der FB übergeordnet wie im folgendem Bild beschaltet:
(Der Timer erzwingt extra noch eine Aktualisierung alle 300s)
Bei der Kontroll und Statusstruktur wurden nur die ersten zwei Worte global deklariert und jeweils das Bit 5 zur Aktualisierung verwendet.
Gruß Thomas
-
Hallo allerseits, hallo Thomas!
ist zwar schon länger her, aber . . . . . .
ich würde der fehlerspeicher der einfachheit auf 96 bit erweitern und den code etwas anders gestalten ;)
du kannst das array auch auf [0..5] of word deklarieren und die schleife 5x durchlaufen dann bleiben deine 80bit.
FUNCTION_BLOCK ERROR_LOG
VAR_INPUT
ERR_ACT : ARRAY[0..96] OF BOOL;
END_VAR
VAR_OUTPUT
ERR_OCCUR : BOOL;
END_VAR
VAR
ERR_OLD : ARRAY[0..2] OF DWORD;
ERR_PTR : POINTER TO ARRAY[0..2] OF DWORD;
END_VAR
VAR_TEMP
i : USINT;
END_VAR
----------------------------------------------------------
ERR_PTR := ADR(ERR_ACT);
ERR_OCCUR := FALSE;
FOR i := 0 TO 2 DO
ERR_OCCUR := ERR_OCCUR OR (ERR_OLD[i] <> ERR_PTR^[i]);
ERR_OLD[i] := ERR_PTR^[i];
END_FOR
END_FUNCTION_BLOCK