FUNCTION_BLOCK "MAntrieb_all"
TITLE = Antriebsmodul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
VERSION : 0.1
   VAR_INPUT 
      Automatik { ExternalWritable := 'False'} : Bool;   // Automatikbetrieb ist aktiv
      Handbetrieb { ExternalWritable := 'False'} : Bool;   // Handbetrieb ist aktiv
      BereichErr { ExternalWritable := 'False'} : Bool := 1;   // Bereichsstörung -> Antrieb stoppen
      Q { ExternalWritable := 'False'} : Bool;   // Eingang Motorschutz ok
      Ptc { ExternalWritable := 'False'} : Bool;   // Eingang Motortemperatur ok
      Fu { ExternalWritable := 'False'} : Bool;   // Eingang Frequenzumrichter ok
      QKontroll { ExternalWritable := 'False'} : Bool;   // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
      FuKontroll { ExternalWritable := 'False'} : Bool;   // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
      ErrQuit { ExternalWritable := 'False'} : Bool;   // Motorschutzstörung quittieren
      Kontroll_B { ExternalWritable := 'False'} : Bool;   // Kontroll-Sensor für Bewegung
   END_VAR

   VAR_OUTPUT 
      Antriebrueck { ExternalWritable := 'False'} : Bool;   // Rückwärts-Ausgang des Antriebs
      Antriebvor { ExternalWritable := 'False'} : Bool;   // Vorwärts-Ausgang des Antriebs
      Jog1 { ExternalWritable := 'False'} : Bool;   // Frequenz 1/3 aktivieren
      Jog2 { ExternalWritable := 'False'} : Bool;   // Frequenz 2/3 aktivieren
      Analog { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;   // Ausgangswort für Analogwandler
   END_VAR

   VAR_IN_OUT 
      QErr { ExternalWritable := 'False'} : Bool;   // Motorschutzstörung
      PtcErr { ExternalWritable := 'False'} : Bool;   // Temperaturstörung
      FuErr { ExternalWritable := 'False'} : Bool;   // Frequenzumrichter ist gestört
      Err_Antrieb_verklemmt { ExternalWritable := 'False'} : Bool;   // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      hStOk : Bool;   // Anzeige Start n. Störung aktivieren
   END_VAR

   VAR 
      sJog1 { ExternalWritable := 'False'} : Bool;   // Frequenz 1/3 aktivieren
      sJog2 { ExternalWritable := 'False'} : Bool;   // Frequenz 2/3 aktivieren
      sAntriebrueck { ExternalWritable := 'False'} : Bool;   // Rückwärts-Ausgang des Antriebs
      sAntriebvor { ExternalWritable := 'False'} : Bool;   // Vorwärts-Ausgang des Antriebs
      Stat { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UAntrieb_all";   // Status des Antriebs
   END_VAR

   VAR_TEMP 
      Antriebaktiv : Bool;   // Antrieb ist aktiv
      Neustart : Bool;   // Antrieb wurde erneut gestartet
      Frequenz : Real;   // Frequenz für FC106
   END_VAR


BEGIN
NETWORK
TITLE = Zeitwert laden
      UN #Automatik;
      ON #Stat.A_start;
      SPB Nw02;

      L #Stat.T_Nachlauf;//Zeitwert laden
      T #Stat.T_Zelle;

NETWORK
TITLE = Zeitwert löschen
Nw02:      UN #Automatik;
      O #Stat.A_vor;
      O #Stat.A_rueck;
      O #BereichErr;
      O #QErr;
      O #FuErr;
      SPBN Nw03;

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

NETWORK
TITLE = Motorschutzstörung / Temperaturüberwachung
Nw03:      U #ErrQuit;
      R #QErr;
      UN #Q;
      U #QKontroll;
      S #QErr;

      U #ErrQuit;
      R #PtcErr;
      UN #Ptc;
      S #PtcErr;

//Störung ist quittierbar:
      U #Q;
      U #QErr;
      O;
      U #Ptc;
      U #PtcErr;
      S #hStOk;

NETWORK
TITLE = Frequenzumrichterstörung
      UN #Stat.Frequenz;
      UN #Stat.Analog;
      SPB en05;

      U #ErrQuit;
      ON #FuKontroll;
      R #FuErr;
      UN #Fu;
      U #FuKontroll;
      S #FuErr;

en05:      NOP 0;
NETWORK
TITLE = Undefinierte Zustände / Befehle (alle Antriebe)
      U #Automatik;//Automatik + Hand aktiv
      U #Handbetrieb;
      O;
      UN #Automatik;//keine Betriebsart
      UN #Handbetrieb;
      O;
      U #Stat.A_vor;//Vorwärts + Rückwärts aktiv
      U #Stat.A_rueck;
      O;
      U #Stat.H_vor;
      U #Stat.H_rueck;
      O;
      U #BereichErr;//Bereichsstörung
      U #Automatik;//Automatik aktiv
      O;
      UN #Stat.Normal;//Antrieb nicht eindeutig
      UN #Stat.Frequenz;
      UN #Stat.Analog;
      O;
      U #Stat.Normal;
      U(;
      O #Stat.Frequenz;
      O #Stat.Analog;
      );
      O;
      U #Stat.Frequenz;
      U #Stat.Analog;
      O #QErr;//Motorschutzstörung
      O;
      U #Automatik;//Automatik aktiv
      U #PtcErr;//Temperaturstörung
      SPBN 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

      SPA RET;

en06:      NOP 0;
NETWORK
TITLE = Undefinierte Zustände / Befehle (Fu-Zusatz)
      U #Stat.Frequenz;
      U(;
      UN #Stat.F1;//Keine Frequenz angegeben
      UN #Stat.F2;
      UN #Stat.F3;
      O;
      U #Stat.F1;//Mehrere Frequenzen angegeben
      U(;
      O #Stat.F2;
      O #Stat.F3;
      );
      O;
      U #Stat.F2;//Mehrere Frequenzen angegeben
      U #Stat.F3;
      O #FuErr;//Frequenzumrichterstörung
      ON #FuKontroll;//Frequenzumrichter ist eingeschaltet
      );
      SPB Stop;
NETWORK
TITLE = Undefinierte Zustände / Befehle (Analog-Zusatz)
      U #Stat.Analog;
      U(;
      L #Stat.F;//Keine Frequenz angegeben
      L 0.0;
      ==R;
      UN #Stat.F1;//Keine Frequenz angegeben
      UN #Stat.F2;
      UN #Stat.F3;
      O #FuErr;//Frequenzumrichterstörung
      ON #FuKontroll;//Frequenzumrichter ist eingeschaltet
      );
      SPB Stop;

NETWORK
TITLE = Antrieb vorwärts starten
      U(;
      U #Automatik;//Automatik ist aktiv
      UN #Stat.A_rueck;
      U(;
      L #Stat.T_Zelle;
      L 0                ;//Nachlaufzeit vorhanden ?
      <>I                      ;//Ja !
      O #Stat.A_start;
      O #Stat.A_vor;//Einschalten
      );
      O;
      U #Handbetrieb;//Handbetrieb aktiv
      U #Stat.H_vor;//Handtaste vorwärts
      );
      UN #Stat.Stop_vor;//Stoppen
      U #Q;//Motorschutz ok
      UN #QErr;//Motorschutzstörung noch aktiv
      = #sAntriebvor;
      R #Stat.T_Ausfertig;
NETWORK
TITLE = Antrieb rückwärts starten
      U(;
      U #Automatik;//Automatik ist aktiv
      U #Stat.A_rueck;//Einschalten
      O;
      U #Handbetrieb;//Handbetrieb aktiv
      U #Stat.H_rueck;//Handtaste rückwärts
      );
      UN #Stat.Stop_rueck;//Stoppen
      U #Q;//Motorschutz ok
      UN #QErr;//Motorschutzstörung noch aktiv
      UN #sAntriebvor;
      = #sAntriebrueck;
      R #Stat.T_Ausfertig;
NETWORK
TITLE = Frequenz übergeben (Fu-Zusatz)
      UN #Stat.Frequenz;
      UN #Stat.Analog;
      SPB en11;

      U #sAntriebvor;
      UN #sAntriebrueck;
      O;
      UN #sAntriebvor;
      U #sAntriebrueck;
      = #Antriebaktiv;

      U #Antriebaktiv;
      U(;
      O #Stat.F1;
      O #Stat.F3;
      );
      = #sJog1;

      U #Antriebaktiv;
      U(;
      O #Stat.F2;
      O #Stat.F3;
      );
      = #sJog2;

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

en11:      NOP 0;
NETWORK
TITLE = Frequenz übergeben (Analog-Zusatz)
      UN #Stat.Analog;
      SPB en12;

      U #sAntriebvor;
      UN #sAntriebrueck;
      O;
      UN #sAntriebvor;
      U #sAntriebrueck;
      = #Antriebaktiv;

      L 0.0;//Falls Stop erwünscht

      UN #Antriebaktiv;
      SPB w090;

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

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

      T #Frequenz;//Frequenz für FC106

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

en12:      NOP 0;
NETWORK
TITLE = Steuersignale zurücksetzen
RET:      U #Stat.Stop_vor;//Übergabe an OP
      = #Stat.OP_Stop_vor;

      U #Stat.Stop_rueck;
      = #Stat.OP_Stop_rueck;

      L #Stat.F;
      T #Stat.OP_F;

      U #Stat.F1;
      = #Stat.OP_F1;

      U #Stat.F2;
      = #Stat.OP_F2;

      U #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.H_vor;
      R #Stat.H_rueck;

NETWORK
TITLE = Nachlaufzeit läuft
      UN "100ms-Impuls";//0,1s-Impuls
      ON #sAntriebvor;//Antrieb steht
      SPB Nw14;

      L #Stat.T_Zelle;
      L 0;//Zeit steht ?
      ==I;//Ja !
      SPB Nw14;

      L #Stat.T_Zelle;
      L "MW2";//minus 0,1-Takte
      -I;
      T #Stat.T_Zelle;

      L 0.0;//Zeit gerade abgelaufen ?
      <=I;//Ja !
      S #Stat.T_Ausfertig;
      SPBN Nw14;

      T #Stat.T_Zelle;

NETWORK
TITLE = Analog-Signal wandeln
Nw14:      UN #Stat.Analog;
      SPB en14;

      CALL 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;

NETWORK
TITLE = Ausgänge an OP übergeben
      U #sAntriebvor;
      UN #Stat.OP_Out_Mvor;//beim letzten Zyklus war Motor nicht eingeschaltet
      O;
      U #sAntriebrueck;
      UN #Stat.OP_Out_Mrueck;//beim letzten Zyklus war Motor nicht eingeschaltet
      = #Neustart;//Antrieb wurde erneut gestartet

      U #sAntriebvor;
      = #Stat.OP_Out_Mvor;

      U #sAntriebrueck;
      = #Stat.OP_Out_Mrueck;

NETWORK
TITLE = Verklemm-Kontrolle
      UN #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)
      SPB en16;

      U #ErrQuit;
      U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      SPB w161;


      U #Err_Antrieb_verklemmt;//Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
      R #sAntriebvor;//Antrieb anhalten 
      R #sAntriebrueck;
      SPB en16;

      UN #Kontroll_B;//Sensor ist nicht aktiv
      SPB w160;

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

      UN #sAntriebvor;//Antrieb steht
      UN #sAntriebrueck;
      ON "100ms-Impuls";//0,1s-Impuls
      SPB 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)

      SPA en16;

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

      UN #sAntriebvor;//Antrieb steht
      UN #sAntriebrueck;
      ON "100ms-Impuls";//0,1s-Impuls
      SPB 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)

      SPA 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;

NETWORK
TITLE = Anzahl der Einschaltungen speichern
      UN #Neustart;//Antrieb wurde erneut gestartet
      SPB en17;

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

en17:      NOP 0;

NETWORK
TITLE = Ausgangsvariablen schreiben
      U #sAntriebvor;
      = #Antriebvor;

      U #sAntriebrueck;
      = #Antriebrueck;

      U #sJog1;
      = #Jog1;

      U #sJog2;
      = #Jog2;

NETWORK
TITLE = Gesamt-Laufzeit aufaddieren
      UN #sAntriebvor;//Antrieb steht
      UN #sAntriebrueck;
      ON "1s-Impuls";//1s-Impuls
      BEB;

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

      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 !
      BEB;

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

NETWORK
TITLE = Ende
      BE;

END_FUNCTION_BLOCK

