Motor_EVG_AVG();
// Um zu wissen, bei welchem Schritt mein Automatikmodus ist
Anzeige_iSchrittnummer := Automatik_iSchrittnummer;
// Flanken deklarieren
fStopp(CLK := GVL.tStop);
fStart(CLK := GVL.tStart);
fRueckgabe (CLK:= GVL.xRueckgabeWert_AN_Fertig);
// Anlaufprogramm Var
mAn_Fertig := GVL.xRueckgabeWert_AN_Fertig;
// Wenn Stopp, dann muss gestoppt werden, bis wieder Start gedrückt wird
IF fStopp.Q OR NOT mAn_Fertig OR GVL.xP_allgemein THEN
mStopp := TRUE;
END_IF
(* Wenn Voll dann eingestelltezeit um Anlage komplett auszuschalten, wenn aus dann müssen alle Motoren ausgehen
dann Quitieren durch Stop und wieder Starten mit Start*)
fbTon_Stoermeldung ( PT := DWORD_TO_TIME (dwStoermeldung *1000));
IF (fbTonxS1.Q AND fbTonxS3.Q) OR (fbTonxS3.Q AND fbTonxS4.Q) THEN
fbTon_Stoermeldung.IN := TRUE;
ELSE
fbTon_Stoermeldung.IN := FALSE;
END_IF
IF fbTon_Stoermeldung.Q THEN
xStoermeldung_Sieb_Voll:= TRUE;
END_IF
IF xStoermeldung_Sieb_Voll AND fStopp.Q
AND M1_SiebRL = FALSE
AND M2_SiebRL = FALSE
AND M3_SiebRL = FALSE
AND MV1_Sieb = FALSE THEN
xStoermeldung_Sieb_Voll := FALSE;
END_IF
// Alles stoppen, wenn alle Motoren aus sind, dann darf wieder gestartet werden
IF mStopp and NOT GVL.xP_allgemein AND (NOT M1_SiebRL) AND (NOT M2_SiebRL) AND (NOT M3_SiebRL) AND (NOT MV1_Sieb) AND mAn_Fertig THEN
mStopp := FALSE;
END_IF
// Start merker damit bei starten nicht nach S1 was hat nochmal Start gedrückt werden muss
IF fStart.Q or fRueckgabe.Q THEN
mStart:= TRUE;
ELSIF mStopp OR mNot_Aus THEN
mStart:= FALSE;
END_IF
// Not-Aus wurde gedrückt, dann muss zuerst mit Stopp quittiert werden
IF NOT GVL.tNot_Aus THEN
mNot_Aus := TRUE;
ELSIF fStopp.Q AND GVL.tNot_Aus THEN
mNot_Aus := FALSE;
END_IF
// Not-Aus ist gedrückt oder Wahlschalter nicht mehr auf Automatik
IF mNot_Aus OR NOT mAutomatik THEN
M1_SiebRL := FALSE;
M2_SiebRL := FALSE;
M3_SiebRL := FALSE;
MV1_Sieb := FALSE;
mAutomatik := FALSE;
Automatik_iSchrittnummer := 40;
Automatik_iNachvortrag := 0;
END_IF
// Hand- oder Automatikbetrieb wählen
IF GVL.mAutomatik_AP1 AND mStart THEN
mAutomatik := TRUE;
ELSIF NOT GVL.xWahlschalter_Automatik THEN
mAutomatik := FALSE;
END_IF
// Automatische Schrittkette
CASE Automatik_iSchrittnummer OF
0: // Schrittkette starten nach Bedingungen
IF mStart AND mAutomatik AND NOT mStopp AND NOT xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 5;
END_IF
5: // hat S1 was dann Startet
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 30;
ELSIF fbTonxS1.Q THEN
Automatik_iSchrittnummer := 10;
END_IF
10: // Zweite Schnecke an, dann Erste, also Auffüllbehälter leer
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 30;
ELSIF fbTonS1_AVG.Q THEN
Automatik_iSchrittnummer := 5;
ELSIF fbTonxS1.Q AND (fbTonS2_AVG.Q AND fbTonS3_AVG.Q) OR (fbTonS3_AVG.Q AND fbTonxS2.Q) THEN
M2_SiebRL := TRUE;
END_IF
// 1 Sekunde Verzögerung, um M1 anzuschalten
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 30;
ELSIF fbTonS1_AVG.Q THEN
Automatik_iSchrittnummer := 25;
ELSE
Automatik_iSchrittnummer := 15;
END_IF
15: // wenn beide Schnecken an sind dann warten bis irgendwas passiert
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 30;
ELSIF fbTonS1_AVG.Q OR fbTonxS3.Q THEN
Automatik_iSchrittnummer := 25;
ELSIF M1_SiebRL AND M2_SiebRL THEN
Automatik_iSchrittnummer := 20;
END_IF
20: // Beide Schnecken laufen, bis der Behälter voll wird oder tStop wurde gedrückt
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 30;
ELSIF fbTonS1_AVG.Q OR fbTonxS3.Q THEN
Automatik_iSchrittnummer := 25;
END_IF
25: // Behälter voll oder keine Kohle da Fall.....
M1_SiebRL := FALSE;
IF M1_SiebRL = FALSE THEN
fbTonM2_Aus_Verzogerung.IN := TRUE;
END_IF
IF fbTonM2_Aus_Verzogerung.Q THEN
M2_SiebRL := FALSE;
Automatik_iSchrittnummer := 27;
END_IF
27: // Timern zurücksetzen in Behältervoll-Fall
IF NOT M2_SiebRL AND NOT M1_SiebRL THEN
fbTonM1_Ein_Verzogerung.IN := FALSE;
fbTonM2_Aus_Verzogerung.IN := FALSE;
Automatik_iSchrittnummer := 5;
END_IF
30: // (Stopp-Fall) Schnecken nacheinander ausschalten, Timer zurücksetzen
M1_SiebRL := FALSE;
IF M1_SiebRL = FALSE THEN
fbTonM2_Aus_Verzogerung.IN := TRUE;
END_IF
IF fbTonM2_Aus_Verzogerung.Q THEN
M2_SiebRL := FALSE;
Automatik_iSchrittnummer := 40;
END_IF
40: // Timer zurücksetzen und zum Anfang springen beim tStop
IF NOT M2_SiebRL AND NOT M1_SiebRL THEN
fbTonM1_Ein_Verzogerung.IN := FALSE;
fbTonM2_Aus_Verzogerung.IN := FALSE;
Automatik_iSchrittnummer := 0;
END_IF
END_CASE
// Zweite Schrittkette (Nachvortrag)
CASE Automatik_iNachvortrag OF
// Läuft in Abhängigkeit vom Vortagesbehälter
0: // Startbedingungen
IF mAutomatik AND mStart THEN
Automatik_iNachvortrag := 10;
END_IF
10: // Behälter hat Inhalt, dann M3 und MV1 anschalten
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iNachvortrag := 20;
ELSIF (fbTonxS3.Q AND fbTonxS2.Q) AND (fbTonS4_AVG.Q) THEN
M3_SiebRL := TRUE;
MV1_Sieb := TRUE;
Automatik_iNachvortrag := 20;
END_IF
20: // Stopp alles und zurück zur Anfang
IF mStopp OR xStoermeldung_Sieb_Voll THEN
M3_SiebRL := FALSE;
MV1_Sieb := FALSE;
Automatik_iNachvortrag := 0;
ELSIF fbTonS2_AVG.Q OR fbTonxS4.Q THEN
M3_SiebRL := FALSE;
MV1_Sieb := FALSE;
Automatik_iNachvortrag := 10;
END_IF
END_CASE