Hallo,
wer mit Galileo arbeitet, möchte bestimmt nicht die Kommunikation mit dem dauerndem pollen der Fehlervariablen belasten.
Hier nun ein Beispiel dazu.
Der FB ist noch nicht ausgiebig getestet, da könntet IHR aber mithelfen.
FUNCTION_BLOCK GRS_Error_aktual
(*
##################################################################################
Programmbeschreibung:
ein 32Bit Array, in das die Hinweise, Warnungen und Störungen geschrieben wurden wird mit dem,
aus dem letzten Zyklus verglichen, tritt eine Änderung ein wird die Prozedur zur Aktualisierung der Galileo
Fehlervariablen ausgeführt
siehe Galileo Hilfe: Steuern von Funktionen durch die SPS
extern sind die Status und Control Strukturen anzulegen
Bits 5, 6 oder 7 im 1. Datenwort der Kontroll-Struktur und Status-Struktur
##################################################################################
Änderungsindex
Name: TL Version:0.1 Datum: 11.6.2015 Grund: neu angelegt
##################################################################################
*)
VAR_INPUT
Errors: ARRAY [1..32] OF BOOL;
GRS_Statusbit: BOOL;
END_VAR
VAR_OUTPUT
GRS_Controlbit: BOOL;
END_VAR
VAR
Errors_alt: ARRAY [1..32] OF BOOL; (*Speicher*)
i1: INT; (*Laufvariable für Schleife*)
x_E_neu: BOOL; (*Änderung erkannt*)
END_VAR
##################################################################################
(* Änderung erkennen*)
FOR i1 := 1 TO 32 BY 1 DO
IF Errors[i1] <> Errors_alt[i1] THEN (* ist Unterschied zum letzten Zyklus?*)
x_E_neu:=TRUE; (* Bei "Unterschied" auf true setzen und aus der Schleife springen*)
EXIT;
END_IF;
END_FOR;
Errors_alt:= Errors;
(*Ablauf Aktualisierung*)
IF (x_E_neu AND NOT GRS_Statusbit)
THEN GRS_Controlbit:= TRUE;
END_IF
IF (GRS_Controlbit AND GRS_Statusbit)
THEN GRS_Controlbit:= FALSE;
x_E_neu:=FALSE;
END_IF
Eine Überlegung zum Schluss:
Was passiert, wenn eine Aktualisierung länger als ein Zyklus dauert?
Ich denke, das man so lange die Aktualisierung läuft, den Teil "Änderung erkennen" anhalten müsste.
Gruß Thomas