=== FB 95: MAntrieb_PowerSave  [STL] ===
INTERFACE:
  Input:
    Automatik : Bool                                    // Automatikbetrieb ist aktiv
    Handbetrieb : Bool                                  // Handbetrieb ist aktiv
    BereichErr : Bool := 1                              // Bereichsstörung -> Antrieb stoppen
    Q : Bool                                            // Eingang Motorschutz ok
    Ptc : Bool                                          // Eingang Motortemperatur ok
    Fu : Bool                                           // Eingang Frequenzumrichter ok
    QKontroll : Bool                                    // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
    FuKontroll : Bool                                   // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
    ErrQuit : Bool                                      // Motorschutzstörung quittieren
    Kontroll_B : Bool                                   // Kontroll-Sensor für Bewegung
    T_Nachlauf : Int := 60                              // Nachlaufzeit (*1s)
  Output:
    Antriebrueck : Bool                                 // Rückwärts-Ausgang des Antriebs
    Antriebvor : Bool                                   // Vorwärts-Ausgang des Antriebs
    Jog1 : Bool                                         // Frequenz 1/3 aktivieren
    Jog2 : Bool                                         // Frequenz 2/3 aktivieren
    Analog : Int                                        // Ausgangswort für Analogwandler
  InOut:
    QErr : Bool                                         // Motorschutzstörung
    PtcErr : Bool                                       // Temperaturstörung
    FuErr : Bool                                        // Frequenzumrichter ist gestört
    Err_Antrieb_verklemmt : Bool                        // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
  Static:
    sJog1 : Bool                                        // Frequenz 1/3 aktivieren
    sJog2 : Bool                                        // Frequenz 2/3 aktivieren
    sAntriebrueck : Bool                                // Rückwärts-Ausgang des Antriebs
    sAntriebvor : Bool                                  // Vorwärts-Ausgang des Antriebs
    Stat : "UAntrieb_PowerSave"                         // Status des Antriebs
  Temp:
    Antriebaktiv : Bool                                 // Antrieb ist aktiv
    Neustart : Bool                                     // Antrieb wurde erneut gestartet
    Frequenz : Real                                     // Frequenz für FC106
  Constant:

--- NW 1: Zeitwert laden ---
      AN     Automatik
      ON     Stat.A_start
      JC     Nw02

      L      T_Nachlauf                                      // Zeitwert laden
      T      Stat.T_Zelle


--- NW 2: Zeitwert löschen ---
Nw02: AN     Automatik
      O      Stat.A_vor
      O      Stat.A_rueck
      O      BereichErr
      O      QErr
      O      FuErr
      JCN    Nw03

      L      0                                               // Zeitwert löschen
// //      T     #Stat.T_Zelle


--- NW 3: Motorschutzstörung / Temperaturüberwachung ---
Nw03: A      ErrQuit
      R      QErr
      AN     Q
      A      QKontroll
      S      QErr

      A      ErrQuit
      R      PtcErr
      AN     Ptc
      S      PtcErr


--- NW 4: Frequenzumrichterstörung ---
      AN     Stat.Frequenz
      AN     Stat.Analog
      JC     en05

      A      ErrQuit
      ON     FuKontroll
      R      FuErr
      AN     Fu
      A      FuKontroll
      S      FuErr

en05: NOP 0

--- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) ---
      A      Automatik                                       // Automatik + Hand aktiv
      A      Handbetrieb
      O
      AN     Automatik                                       // keine Betriebsart
      AN     Handbetrieb
      O
      A      Stat.A_vor                                      // Vorwärts + Rückwärts aktiv
      A      Stat.A_rueck
      O
      A      Stat.H_vor
      A      Stat.H_rueck
      O
      A      BereichErr                                      // Bereichsstörung
      A      Automatik                                       // Automatik aktiv
      O
      AN     Stat.Normal                                     // Antrieb nicht eindeutig
      AN     Stat.Frequenz
      AN     Stat.Analog
      O
      A      Stat.Normal
      A(
      O      Stat.Frequenz
      O      Stat.Analog
      )
      O
      A      Stat.Frequenz
      A      Stat.Analog
      O      QErr                                            // Motorschutzstörung
      O
      A      Automatik                                       // Automatik aktiv
      A      PtcErr                                          // Temperaturstörung
      JCN    en06

Stop: SET
      R      sAntriebvor
      R      sAntriebrueck
      R      Stat.T_Ausfertig
      R      sJog1
      R      sJog2

      L      0.0                                             // Zeitwert/Frequenz löschen
// //      T     #Stat.T_Zelle
      T      Frequenz                                        // Frequenz für FC106

      JU     RET

en06: NOP 0

--- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) ---
      A      Stat.Frequenz
      A(
      AN     Stat.F1                                         // Keine Frequenz angegeben
      AN     Stat.F2
      AN     Stat.F3
      O
      A      Stat.F1                                         // Mehrere Frequenzen angegeben
      A(
      O      Stat.F2
      O      Stat.F3
      )
      O
      A      Stat.F2                                         // Mehrere Frequenzen angegeben
      A      Stat.F3
      O      FuErr                                           // Frequenzumrichterstörung
      ON     FuKontroll                                      // Frequenzumrichter ist eingeschaltet
      )
      JC     Stop

--- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) ---
      A      Stat.Analog
      A(
      L      Stat.F                                          // Keine Frequenz angegeben
      L      0.0
      ==R
      AN     Stat.F1                                         // Keine Frequenz angegeben
      AN     Stat.F2
      AN     Stat.F3
      O      FuErr                                           // Frequenzumrichterstörung
      ON     FuKontroll                                      // Frequenzumrichter ist eingeschaltet
      )
      JC     Stop


--- NW 8: Antrieb vorwärts starten ---
      A(
      A      Automatik                                       // Automatik ist aktiv
      AN     Stat.A_rueck
      A(
      L      Stat.T_Zelle
      L      0                                               // Nachlaufzeit vorhanden ?
      <>I                                                    // Ja !
      AN     Stat.A_PS                                       // PowerSave-Mode: Bei Ausschaltverzögerung anhalten
      O      Stat.A_vor                                      // Einschalten
      )
      O
      A      Handbetrieb                                     // Handbetrieb aktiv
      A      Stat.H_vor                                      // Handtaste vorwärts
      )
      AN     Stat.Stop_vor                                   // Stoppen
      A      Q                                               // Motorschutz ok
      AN     QErr                                            // Motorschutzstörung noch aktiv
      =      sAntriebvor
      R      Stat.T_Ausfertig

--- NW 9: Antrieb rückwärts starten ---
      A(
      A      Automatik                                       // Automatik ist aktiv
      A      Stat.A_rueck                                    // Einschalten
      O
      A      Handbetrieb                                     // Handbetrieb aktiv
      A      Stat.H_rueck                                    // Handtaste rückwärts
      )
      AN     Stat.Stop_rueck                                 // Stoppen
      A      Q                                               // Motorschutz ok
      AN     QErr                                            // Motorschutzstörung noch aktiv
      AN     sAntriebvor
      =      sAntriebrueck
      R      Stat.T_Ausfertig

--- NW 10: Frequenz übergeben (Fu-Zusatz) ---
      AN     Stat.Frequenz
      AN     Stat.Analog
      JC     en11

      A      sAntriebvor
      AN     sAntriebrueck
      O
      AN     sAntriebvor
      A      sAntriebrueck
      =      Antriebaktiv

      A      Antriebaktiv
      A(
      O      Stat.F1
      O      Stat.F3
      )
      =      sJog1

      A      Antriebaktiv
      A(
      O      Stat.F2
      O      Stat.F3
      )
      =      sJog2

      AN     sJog1                                           // Keine Geschwindigtkeit aktiv
      AN     sJog2
      AN     Stat.Analog                                     // falls analoge Übergabe erfolgt
      R      sAntriebvor
      R      sAntriebrueck

en11: NOP 0

--- NW 11: Frequenz übergeben (Analog-Zusatz) ---
      AN     Stat.Analog
      JC     en12

      A      sAntriebvor
      AN     sAntriebrueck
      O
      AN     sAntriebvor
      A      sAntriebrueck
      =      Antriebaktiv

      L      0.0                                             // Falls Stop erwünscht

      AN     Antriebaktiv
      JC     w090

      L      Stat.F
w090: T      Frequenz                                        // Frequenz für FC106

      L      3000.0                                          // Maximal 3000 U/min ?
      <=R                                                    // Ja !
      JC     w091

      T      Frequenz                                        // Frequenz für FC106

w091: L      Frequenz
      L      0.0                                             // Keine Geschwindigtkeit aktiv ?
      ==R                                                    // Ja !
      AN     sJog1                                           // Aber schon Jog-Geschwindigtkeit aktiv
      AN     sJog2
      R      sAntriebvor
      R      sAntriebrueck

en12: NOP 0

--- NW 12: Steuersignale zurücksetzen ---
RET:  A      Stat.A_vor                                      // Übergabe an OP
      =      Stat.OP_A_vor

      A      Stat.A_start
      =      Stat.OP_A_start

      A      Stat.A_PS
      =      Stat.OP_A_PS

      A      Stat.Stop_vor
      =      Stat.OP_Stop_vor

      A      Stat.Stop_rueck
      =      Stat.OP_Stop_rueck

      L      Stat.F
      T      Stat.OP_F

      A      Stat.F1
      =      Stat.OP_F1

      A      Stat.F2
      =      Stat.OP_F2

      A      Stat.F3
      =      Stat.OP_F3

      L      0.0
      T      Stat.F

      SET
      R      Stat.F1
      R      Stat.F2
      R      Stat.F3
      R      Stat.Stop_vor
      R      Stat.Stop_rueck
      R      Stat.Stop_intern
      R      Stat.A_vor
      R      Stat.A_rueck
      R      Stat.A_start
      R      Stat.A_PS
      R      Stat.H_vor
      R      Stat.H_rueck


--- NW 13: Nachlaufzeit läuft ---
      AN     "1s-Impuls"                                     // 1s-Impuls
      ON     sAntriebvor                                     // Antrieb steht
      JC     Nw14

      L      Stat.T_Zelle
      L      0                                               // Zeit steht ?
      ==I                                                    // Ja !
      JC     Nw14

      L      Stat.T_Zelle
      +      -1
      T      Stat.T_Zelle

      L      0                                               // Zeit gerade abgelaufen ?
      <=I                                                    // Ja !
      S      Stat.T_Ausfertig
      JCN    Nw14

      T      Stat.T_Zelle


--- NW 14: Analog-Signal wandeln ---
Nw14: AN     Stat.Analog
      JC     en14

CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog)

      L      Stat.RET_VAL_FC106
      L      0                                               // Fehler vorhanden ?
      <>I                                                    // Ja !
      R      sAntriebvor                                     // Antrieb stoppen
      R      sAntriebrueck

en14: NOP 0


--- NW 15: Ausgänge an OP übergeben ---
      A      sAntriebvor
      AN     Stat.OP_Out_Mvor                                // beim letzten Zyklus war Motor nicht eingeschaltet
      O
      A      sAntriebrueck
      AN     Stat.OP_Out_Mrueck                              // beim letzten Zyklus war Motor nicht eingeschaltet
      =      Neustart                                        // Antrieb wurde erneut gestartet

      A      sAntriebvor
      =      Stat.OP_Out_Mvor

      A      sAntriebrueck
      =      Stat.OP_Out_Mrueck


--- NW 16: Verklemm-Kontrolle ---
      AN     Stat.Kontroll_B_verbaut                         // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut
      R      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      JC     en16

      A      ErrQuit
      A      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      JC     w161


      A      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      R      sAntriebvor                                     // Antrieb anhalten
      R      sAntriebrueck
      JC     en16

      AN     Kontroll_B                                      // Sensor ist nicht aktiv
      JC     w160

// Also Sensor aktiv:
      L      0                                               // Inaktiv-Zeit nullen
      T      Stat.Raster_B_inaktiv

      AN     sAntriebvor                                     // Antrieb steht
      AN     sAntriebrueck
      ON     "100ms-Impuls"                                  // 0,1s-Impuls
      JC     en16

      L      Stat.Raster_B_aktiv
      L      "MW2"                                           // Anzahl der 100ms-Takte
      +I
      T      Stat.Raster_B_aktiv
      L      20                                              // 2s erreicht ?
      >=I                                                    // Ja !
      S      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)

      JU     en16

// Sensor inaktiv:
w160: L      0                                               // Aktiv-Zeit nullen
      T      Stat.Raster_B_aktiv

      AN     sAntriebvor                                     // Antrieb steht
      AN     sAntriebrueck
      ON     "100ms-Impuls"                                  // 0,1s-Impuls
      JC     en16

      L      Stat.Raster_B_inaktiv
      L      "MW2"                                           // Anzahl der 100ms-Takte
      +I
      T      Stat.Raster_B_inaktiv
      L      20                                              // 2s erreicht ?
      >=I                                                    // Ja !
      S      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)

      JU     en16

w161: L      0
      T      Stat.Raster_B_aktiv                             // Aktiv-Zeit nullen
      T      Stat.Raster_B_inaktiv                           // Inaktiv-Zeit nullen

      SET
      R      Err_Antrieb_verklemmt                           // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)

en16: NOP 0


--- NW 17: Anzahl der Einschaltungen speichern ---
      AN     Neustart                                        // Antrieb wurde erneut gestartet
      JC     en17

      L      Stat.Statistik.Einschaltungen
      +      DINT#1                                          // Anzahl der Einschaltungen +1
      T      Stat.Statistik.Einschaltungen

en17: NOP 0


--- NW 18: Ausgangsvariablen schreiben ---
      A      sAntriebvor
      =      Antriebvor

      A      sAntriebrueck
      =      Antriebrueck

      A      sJog1
      =      Jog1

      A      sJog2
      =      Jog2


--- NW 19: Gesamt-Laufzeit aufaddieren ---
      AN     sAntriebvor                                     // Antrieb steht
      AN     sAntriebrueck
      ON     "1s-Impuls"                                     // 1s-Impuls
      BEC

      L      Stat.Statistik.Laufzeit_s
      +      1                                               // Laufzeit des Antriebs in Sekunden+1
      T      Stat.Statistik.Laufzeit_s
      L      60                                              // Eine Minte erreicht ?
      <I                                                     // Nein !
      BEC

      L      0
      T      Stat.Statistik.Laufzeit_s
      L      Stat.Statistik.Laufzeit_m
      +      1                                               // Laufzeit des Antriebs in Minuten+1
      T      Stat.Statistik.Laufzeit_m
      L      60                                              // Eine Stunde erreicht ?
      <I                                                     // Nein !
      BEC

      L      0
      T      Stat.Statistik.Laufzeit_m
      L      Stat.Statistik.Laufzeit_h
      +      1                                               // Laufzeit des Antriebs in Stunden+1
      T      Stat.Statistik.Laufzeit_h


--- NW 20: Ende ---
      BE

