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