Files

147 lines
5.8 KiB
Plaintext

FUNCTION_BLOCK "MZylinder"
TITLE = Zylinderansteuerung
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : Module
NAME : MZylinder
//SCL-Portierung des AWL-Bausteins FB92 "MZylinder" (verhaltensgleich).
//Schnittstelle und Instanzdaten (UDT "UZylinder") unveraendert.
VAR_INPUT
Automatik : Bool; // Automatikbetrieb ist aktiv
Handbetrieb : Bool; // Handbetrieb ist aktiv
T_Ast : Int := 5; // Zeit bis AST erreicht ist (*100ms)
T_Gst : Int := 5; // Zeit bis GST erreicht ist (*100ms)
END_VAR
VAR_OUTPUT
ZylAst : Bool; // Vorwaerts-Ausgang des Antriebs
ZylGst : Bool; // Rueckwaerts-Ausgang des Antriebs
END_VAR
VAR
Stat { S7_SetPoint := 'True'} : "UZylinder";
END_VAR
VAR_TEMP
tZeitNullen : Bool; // AWL-Sprungziel "tdel": Zeitzelle nullen + Old_Ast nachfuehren
tFehler : Bool; // NW5: undefinierter Zustand / Befehl
tFlanke : Bool; // NW10: Flankenergebnis
END_VAR
BEGIN
REGION NW1: Zeitwert loeschen
// Endstellung erreicht oder Fahrtrichtung hat gewechselt -> Zeit nullen
#tZeitNullen := (#ZylAst AND (#Stat.B_AST OR NOT #Stat.Old_Ast))
OR (NOT #ZylAst AND (#Stat.B_GST OR #Stat.Old_Ast));
END_REGION
IF NOT #tZeitNullen THEN
REGION NW2: AST-Erreichtzeit abgelaufen ?
IF #Stat.T_AST_Akt = 9999 THEN
#Stat.T_AST_Akt := #T_Ast; // Sollwert uebergeben (9999 = kein Zeitwert angegeben)
END_IF;
IF #ZylAst THEN // Zylinder faehrt nach AST ?
#Stat.B_GST := FALSE;
IF #Stat.T_Zelle >= #Stat.T_AST_Akt THEN // Gewollter Zeitwert erreicht ?
#Stat.B_AST := TRUE; // Zylinder hat AST erreicht
#tZeitNullen := TRUE; // AWL: JC tdel
END_IF;
ELSIF NOT #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.B_AST := FALSE;
END_IF;
END_REGION
END_IF;
IF NOT #tZeitNullen THEN
REGION NW3: GST-Erreichtzeit abgelaufen ?
IF #Stat.T_GST_Akt = 9999 THEN
#Stat.T_GST_Akt := #T_Gst; // Sollwert uebergeben (9999 = kein Zeitwert angegeben)
END_IF;
// Zylinder faehrt nach GST ? (2-fache Ansteuerung: ZylGst / 1-fache: ZylAst aus)
IF ((#Stat.Typ5_2 OR #Stat.Typ5_3) AND #ZylGst)
OR (#Stat.Typ3_2 AND NOT #ZylAst) THEN
#Stat.B_AST := FALSE;
IF #Stat.T_Zelle >= #Stat.T_GST_Akt THEN // Gewollter Zeitwert erreicht ?
#Stat.B_GST := TRUE; // Zylinder hat GST erreicht
#tZeitNullen := TRUE; // AWL: JC tdel
END_IF;
ELSIF NOT #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.B_GST := FALSE;
END_IF;
END_REGION
END_IF;
IF NOT #tZeitNullen THEN
REGION NW4: Zeit laeuft
// Nicht zaehlen, wenn 2-fach angesteuerter Zylinder gar nicht angesteuert wird;
// Zaehlung nur mit dem 100ms-Impuls
IF "100ms-Impuls"
AND NOT ((#Stat.Typ5_2 OR #Stat.Typ5_3) AND NOT #ZylGst AND NOT #ZylAst) THEN
#Stat.T_Zelle := #Stat.T_Zelle + WORD_TO_INT("MW2"); // 100ms-Takte
END_IF;
END_REGION
ELSE
// AWL-Sprungziel "tdel" (aus NW1/NW2/NW3)
#Stat.T_Zelle := 0; // Zeitwert loeschen
#Stat.Old_Ast := #ZylAst; // Fuhr letzten Zyklus nach AST
END_IF;
REGION NW5: Undefinierte Zustaende / Befehle
#tFehler := (#Automatik AND #Handbetrieb) // Automatik + Hand aktiv
OR (NOT #Automatik AND NOT #Handbetrieb) // keine Betriebsart
OR (#Stat.Ast AND #Stat.Gst) // AST- + GST-fahren gleichzeitig aktiv
OR (NOT #Stat.Typ3_2 AND NOT #Stat.Typ5_2 AND NOT #Stat.Typ5_3) // undefinierter Ventil-Typ
OR (#Stat.Typ3_2 AND (#Stat.Typ5_2 OR #Stat.Typ5_3)) // mehrere Ventil-Typen
OR (#Stat.Typ5_2 AND #Stat.Typ5_3);
IF #tFehler THEN // Zylinderstellung bleibt eingefroren
IF #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.Ast := FALSE; // Bewegungsbits loeschen
#Stat.Gst := FALSE;
END_IF;
RETURN; // AWL: BEU
END_IF;
END_REGION
REGION NW6: Zylinder auf Arbeitsstellung fahren
#ZylAst := #Stat.Ast;
END_REGION
REGION NW7: Zylinder auf Grundstellung fahren
#ZylGst := (#Stat.Typ5_2 OR #Stat.Typ5_3) AND #Stat.Gst;
END_REGION
REGION NW8: Daten, die zurueckgesetzt werden
IF #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.Ast := FALSE; // Bewegungsbits loeschen
#Stat.Gst := FALSE;
END_IF;
IF #Stat.Typ3_2 THEN
#Stat.Gst := FALSE; // Es gibt kein GST fahren !
END_IF;
END_REGION
REGION NW9: Ausgaenge an OP uebergeben
#Stat.OP_Out_GST := #ZylGst;
#Stat.OP_Out_AST := #ZylAst;
END_REGION
REGION NW10: Statistik
// Positive Flanke ZylAst (AWL: FP Stat.FP_AST)
#tFlanke := #ZylAst AND NOT #Stat.FP_AST;
#Stat.FP_AST := #ZylAst;
IF #tFlanke THEN
#Stat.Statistik.AST_Schaltungen := #Stat.Statistik.AST_Schaltungen + 1;
END_IF;
// Positive Flanke ZylGst bei Typ5_3 (AWL: FP Stat.FP_AST2)
#tFlanke := #ZylGst AND #Stat.Typ5_3 AND NOT #Stat.FP_AST2;
#Stat.FP_AST2 := #ZylGst AND #Stat.Typ5_3;
IF #tFlanke THEN
#Stat.Statistik.AST2_Schaltungen := #Stat.Statistik.AST2_Schaltungen + 1;
END_IF;
END_REGION
END_FUNCTION_BLOCK