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