FUNCTION_BLOCK FB41
Title = 'Rezept'
//
// Rezeptur von HMI über Variable im HMI
// anfordern
// die Variable ist auf "Ausführen bei Wertänderung" eingestellt
// und arbeitet mit den an sie übergebenen Variablen
// Rezeptnummer und Datensatzname
// Der Wert Status wird zurückgegeben
// Status = 2 --> Daten werden geholt
// Status = 4 --> Daten holen erfolgreih beendet
// Status = 12 -> Daten holen Fehler
//
Version : '1.0'
author : Ralle
name : RZ01
family : REZEPT
VAR_INPUT
// Eingangsparameter
Ack: BOOL;
Rezept: INT;
Datensatzname: STRING[16];
END_VAR
VAR_IN_OUT
// IN_OUT_Parameter
Auftrag: STRUCT
Rezeptnummer: INT;
Datensatznummer: INT;
Datensatzname: STRING[16];
Status: INT;
Startvar: INT;
Toggelvar: INT;
END_STRUCT;
bStart: BOOL;
bBusy: BOOL;
bEnd: Bool;
bErr: Bool;
END_VAR
VAR_TEMP
// temporäre Variablen
Timeout_bit : BOOL ;
Auftrag_Wait: BOOL ;
END_VAR
VAR
// statische Variablen
bHM_StartFlanke: BOOL;
Wait_Timer : TON;
Timeout_Timer : TON;
Timeout_stat : BOOL ;
END_VAR
// Anweisungsteil
IF bStart THEN
bEnd := False;
END_IF;
//Der Auftrag wird gestartet, Rezeptnummr und Datensatzname an das HMI übergeben
IF (Auftrag.StartVar = 0) AND bStart AND NOT bHM_Startflanke THEN
Auftrag.Rezeptnummer := Rezept;
Auftrag.Datensatzname := Datensatzname;
Auftrag.Status := 0;
bEnd := False;
bErr := False;
bHM_Startflanke := True;
Auftrag.StartVar := 1;
END_IF;
//Wartezeit bis zum Start der Funktion im HMI
//da sonst Rezeptnummer und Datensatzname u.U. noch die alten Werte haben
Auftrag_Wait := (Auftrag.Startvar = 1);
Wait_Timer(IN := Auftrag_Wait // IN: BOOL
,PT := T#500ms // IN: TIME
);
//Start der Funktion im HMI nach Wartezeit
IF Wait_Timer.Q THEN
IF Auftrag.Toggelvar > 1000 THEN
Auftrag.Toggelvar := 0;
ELSE
Auftrag.Toggelvar := Auftrag.Toggelvar + 1;
END_IF;
Auftrag.Startvar := 2;
END_IF;
//Auftrag ist korrekt beendet, Meldung nach außen
IF (Auftrag.Startvar = 2) AND (Auftrag.Status = 4) AND bStart AND bHM_Startflanke THEN
bStart := False;
bHM_Startflanke := False;
bEnd := True;
Auftrag.Startvar := 0;
END_IF;
//Ausgabe Busy
bBusy := bHM_Startflanke;
//Timeout nach 5 Sekunden Busy
Timeout_Timer(IN := bBusy // IN: BOOL
,PT := T#5s // IN: TIME
);
Timeout_bit := Timeout_Timer.Q; // OUT: BOOL
// := Timeout_Timer.ET; // OUT: TIME
IF Timeout_bit THEN
Timeout_stat := True;
END_IF;
//Reset mit Ack
IF ACK AND Timeout_stat THEN
Timeout_stat := False;
bStart := False;
Auftrag.Startvar := 0;
bHM_Startflanke := False;
END_IF;
//Ausgabe Error
bErr := Timeout_stat;
;
END_FUNCTION_BLOCK