Hi Leute,
ein Beispiel eines komplexeren Hydraulikaggregates mit drucklosem YD-Anlauf, Druckspeicherventil und Ölkühlungüber Thermostat.
FUNCTION_BLOCK HydraulikaggregatA
(*
##################################################################################
Programmbeschreibung:
Baustein zur Ansteuerung eines komplexeren Hydraulikaggregates mit drucklosem
YD-Anlauf, Ölkühlung und Druckspeicher.
Temperatursteuerung über ext Schaltthermostat
Überwacht werden Motorschutz, Öltemperatur, Filterdruck, Ölniveau und Anlauf
benötigt: FB SSR, YD_Anlauf
getestet auf: XV102
##################################################################################
Änderungsindex
Name: TL Datum: 08.09.2012 Version:0.1 Grund: neu
Name: TL Datum: 08.04.2017 Version:0.2 Grund: neu in ST geschrieben für V3.5
Name: TL Datum: 19.01.2018 Version:0.3 Grund: Y/D Anlauf und Ausgabe Statuswort hinzugefügt
##################################################################################
*)
VAR_INPUT
ein_aus: BOOL; (*Ein/Aus-befehl (Taster)*)
Stop: BOOL; (*0= Aggregat stoppen extern*)
reset: BOOL; (*Fehlerreset*)
Motor_on: BOOL; (*1= Motor ist hochgelaufen (Dreieck)*)
MS_ok: BOOL; (*1= Motorschutz Hauptantrieb ist OK*)
Filter_ok: BOOL; (*1= Differenzdruck Ölfilter ist OK*)
Niveau_ok: BOOL; (*1= Ölniveau Tank ist OK*)
OelTemp1: BOOL; (*Thermokontakt für Kühlung ein NC*)
OelTemp2: BOOL; (*Thermokontakt Warnung Öl heiß NC*)
OelTempOT: BOOL; (*Thermokontakt Fehler Öl Übertemperatur NC*)
MS_Kuehlung_ok: BOOL; (*1= Motorschutz Kühlantriebe sind OK*)
BlkTakt: BOOL; (*Blinktakt*)
END_VAR
VAR_OUTPUT
Hydr_PumpeH: BOOL; (*Motor Pumpe Hauptschütz Ein*)
Hydr_PumpeD: BOOL; (*Motor Pumpe Dreieckschütz Ein*)
Hydr_PumpeY: BOOL; (*Motor Pumpe Sternschütz Ein*)
H_Hydr_ein: BOOL; (*Signallampe: blinkt= Anlauf, dauer an= betriebsbereit*)
Y_druckl_Anlauf: BOOL; (*Ventil druckloser Anlauf Ein*)
Y_Speicher_auf: BOOL; (*Ventil Druckspeicher öffnen*)
Hydr_laeuft: BOOL; (*Betriebsmeldung: Hydraulik arbeitsbereit*)
Kuehlpumpe: BOOL; (*Motor Kühlpumpe Ein*)
Kuehlluefter: BOOL; (*Motor Kühllüfter Ein*)
Fehler: BOOL; (*Fehler steht an*)
Status: WORD;
END_VAR
VAR
EinAus: SSR;
Hauptantrieb: YD_Anlauf; (*YD-Anlaufzeit*)
Anlauf: TP; (*Timer Druckloser Anlauf*)
EinschaltSperre: TOF; (*Timer Wiedereinschaltsperre zum Druckabbau nach ausschalten*)
Anlaufueberw: TON;
AusFlanke: F_TRIG; (*Ausschaltflanke*)
VzFilter: TOF; (*Verzögerung bis Filterdruckwarnung*)
Aggr_aus: BOOL; (*Sammelmerker für Ausschaltbedingungen*)
KuehlEin: BOOL; (*Hilfsmerker Kühlung ein*)
KuehlNachlauf: TOF; (*Nachlauftimer Kühlsystem*)
VzLuefter: TON; (*Anlaufverzögerung Kühllüfter*)
Err_MS_P: BOOL; (*Fehler: Motorschutz Pumpe hat ausgelöst*)
Err_MS_K: BOOL; (*Fehler: Motorschutz Kühlung hat ausgelöst*)
Err_Niveau: BOOL; (*Fehler: Ölniveau niedrig*)
Err_Oeltemp: BOOL; (*Fehler: Öl übertemperatur*)
Err_Anlauf: BOOL; (*Fehler: Timeout Anlauf ausgelöst*)
END_VAR
VAR CONSTANT
Sperrzeit: TIME := T#15S; (*Zeit zum Druckabbau*)
Nachlauf: TIME := t#2m; (*Nachlaufzeit des Kühlers*)
YD_Zeit: TIME := T#2S; (*YD-Anlaufzeit*)
Anlaufzeit: TIME := T#6S; (*Impulszeit Anlauf*)
END_VAR
##############################################
(*Sperrzeit für Druckabbau nach ausschalten erzeugen*)
AusFlanke(CLK:= Hydr_PumpeH, Q=> );
EinschaltSperre(IN:= AusFlanke.Q, PT:= Sperrzeit, Q=> , ET=> );
(*Fehler resetten*)
IF reset THEN
Err_MS_P :=FALSE;
Err_MS_K :=FALSE;
Err_Niveau :=FALSE;
Err_Oeltemp :=FALSE;
Err_Anlauf :=FALSE;
END_IF
(*Einschaltbedingungen prüfen und Fehlerbits setzten*)
IF NOT MS_ok THEN Err_MS_P :=TRUE; END_IF
IF NOT MS_Kuehlung_ok THEN Err_MS_K :=TRUE; END_IF
IF NOT Niveau_ok THEN Err_Niveau :=TRUE; END_IF
IF NOT OelTempOT THEN Err_Oeltemp :=TRUE; END_IF
IF Anlaufueberw.Q THEN Err_Anlauf :=TRUE; END_IF
Fehler := (Err_MS_P OR Err_MS_K OR Err_Niveau OR Err_Oeltemp OR Err_Anlauf);
(*Bedingungen füs sofortiges Abschalten sammeln*)
Aggr_aus:= (EinschaltSperre.Q OR Fehler OR NOT Stop);
(*Ein/aus mit reset*)
EinAus(xToggle:= ein_aus, xRes:= Aggr_aus, xOut=> );
(*Y/D Anlauf Hauptantrieb*)
Hauptantrieb(
ON:= EinAus.xOut,
Zeit:= YD_Zeit,
H=> Hydr_PumpeH,
Y=> Hydr_PumpeY,
D=> Hydr_PumpeD,
Err=> );
Anlaufueberw(IN:= Hydr_PumpeH AND NOT Motor_on, PT:= Anlaufzeit, Q=> , ET=> );
(*Betriebsmeldungen*)
Hydr_laeuft:= Motor_on AND NOT Anlauf.Q AND Y_Speicher_auf;
H_Hydr_ein:= (Anlauf.Q AND BlkTakt) OR Hydr_laeuft;
(*Ventile für Anlauf Steuern*)
Anlauf(IN:= EinAus.xOut, PT:= Anlaufzeit, Q=> Y_druckl_Anlauf, ET=> );
Y_Speicher_auf:= Hydr_PumpeH AND NOT Anlauf.Q;
(*Kühlung mit Nachlauf*)
IF (Stop AND NOT Err_Niveau AND NOT Err_MS_K) THEN
KuehlNachlauf(IN:= KuehlEin, PT:= Nachlauf, Q=> , ET=> );
ELSE (*Nachlauftimer Nullsetzen wenn extStop*)
KuehlNachlauf(IN:= FALSE, PT:= T#0S, Q=> , ET=> );
END_IF
KuehlEin:= (Niveau_ok AND MS_Kuehlung_ok) AND (NOT OelTemp1 OR (KuehlNachlauf.Q AND Stop)) ;
Kuehlpumpe:= KuehlEin;
VzLuefter(IN:= KuehlEin, PT:= t#2s, Q=> Kuehlluefter, ET=> ); (*Lüfter 2s nach Pumpe einschalten*)
(*Statuswort beschreiben*)
Status.0 := Hydr_PumpeH; //Pumpe läuft
Status.1 := Hydr_laeuft; //Hydraulik hochgelaufen und arbeitsbereit
Status.2 := KuehlEin; //Kühlung läuft
Status.3 := 0; //reserve
Status.4 := EinschaltSperre.Q; //Wiedereinschaltsperre ist aktiv
Status.5 := NOT OelTemp2; //Warnung Öl heiss
Status.6 := NOT Filter_ok; //Warnung Ölfilter verschmutzt
Status.7 := 0; //reserve
Status.8 := Err_MS_P; //Fehler Motorschutz Pumpe hat ausgelöst
Status.9 := Err_MS_K; //Fehler Motorschutz Kühlung hat ausgelöst
Status.10 := Err_Niveau; //Fehler Ölniveau niedrig
Status.11 := Err_Oeltemp; //Fehler Öl übertemperatur
Status.12 := Err_Anlauf; //Timeout Anlauf ausgelöst
Status.13 := 0; //reserve
Status.14 := 0; //reserve
Status.15 := 0; //reserve
have a lot of fun!
Gruß Thomas