easy-forum

Deutsch - Software => XSoft-CoDeSys => Thema gestartet von: radar17892 am Juni 01, 2013, 22:20:17 Nachmittag

Titel: 2 ARRAY [..] OF BOOL vergleichen in ST ?
Beitrag 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
Titel: Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
Beitrag von: Knodelpa am Juni 03, 2013, 09:55:22 Vormittag
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
Titel: Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
Beitrag von: radar17892 am Juni 04, 2013, 21:20:32 Nachmittag
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
Titel: Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
Beitrag von: weiss_nix am Oktober 17, 2013, 08:21:11 Vormittag
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