Autor Thema: 2 ARRAY [..] OF BOOL vergleichen in ST ?  (Gelesen 9943 mal)

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 788
  • Think easy!
    • mollgruppe
2 ARRAY [..] OF BOOL vergleichen in ST ?
« 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
« Letzte Änderung: Juni 02, 2013, 11:28:07 Vormittag von radar17892 »
Weil Einfach einfach Einfach ist!

Offline Knodelpa

  • easy god
  • *****
  • Beiträge: 1410
  • I love easy-Forum.net
Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
« Antwort #1 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

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 788
  • Think easy!
    • mollgruppe
Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
« Antwort #2 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
« Letzte Änderung: Juni 04, 2013, 21:30:35 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Re:2 ARRAY [..] OF BOOL vergleichen in ST ?
« Antwort #3 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
« Letzte Änderung: Oktober 18, 2013, 06:50:11 Vormittag von weiss_nix »
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!