FUNCTION_BLOCK "MImpulsGeber"
TITLE = Modul Zähler über Zahnrad-Sensor Wert in Zähler-DB eintragen
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Ink_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;   // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
      B_Zaehlen : Bool;   // Sensor zum Zählen
      Antrieb_aktiv : Bool;   // Antrieb ist aktiv
      Quit : Bool;
      Zeit_Signal_zu_lang : Time := T#350ms;
      Zeit_Kein_Signal : Time := T#500ms;
   END_VAR

   VAR_OUTPUT 
      Signal : Bool;   // Falls kein InkDB
   END_VAR

   VAR_IN_OUT 
      Err_Kein_Signal : Bool;   // Kein_Signal bei laufenden Antrieb
      Err_Signal_zu_lang : Bool;   // Signal bei laufenden Antrieb zu lang
   END_VAR

   VAR 
      Sensor_entprellen : Bool;
      Timer_1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
      Timer_2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
      Timer_3 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
   END_VAR


BEGIN
NETWORK
TITLE = Initialisierung
      SET;
      R #Signal;

NETWORK
TITLE = Störungen

//Störung quittieren:
      U #Quit;
      R #Err_Signal_zu_lang;
      R #Err_Kein_Signal;

//Signal zu lang:
      U #B_Zaehlen                ;//Sensor zum Zählen
      U #Antrieb_aktiv            ;//Antrieb ist aktiv
      UN #Quit;
      = "M200.0";

      CALL #Timer_2
      {time_type := 'Time'}
      (  IN                          := "M200.0" , 
         PT                          := #Zeit_Signal_zu_lang
      );

      U #Timer_2.Q;
      S #Err_Signal_zu_lang;

//Kein Signal:
      UN #B_Zaehlen         ;//Sensor zum Zählen
      U #Antrieb_aktiv            ;//Antrieb ist aktiv
      UN #Quit;
      = "M200.0";

      CALL #Timer_3
      {time_type := 'Time'}
      (  IN                          := "M200.0" , 
         PT                          := #Zeit_Kein_Signal
      );

      U #Timer_3.Q;
      S #Err_Kein_Signal;

NETWORK
TITLE = Zählen über Sensor
      UN #B_Zaehlen         ;//Sensor zum Zählen
      U #Sensor_entprellen          ;//Sperre Auswertung schon erfolgt
      U #Antrieb_aktiv            ;//Antrieb ist aktiv
      = "M200.0";

      CALL #Timer_1
      {time_type := 'Time'}
      (  IN                          := "M200.0" , 
         PT                          := t#50ms
      );

      U #Timer_1.Q;
      R #Sensor_entprellen        ;//Sperre Auswertung schon erfolgt

      UN #B_Zaehlen                ;//Sensor zum Zählen
      O #Sensor_entprellen;
      BEB;

      SET;
      S #Sensor_entprellen         ;//Sperre Auswertung schon erfolgt
      S #Signal            ;//Für Signal-Auswertung ohne InkDB

NETWORK
TITLE = Übergabe an Inkrement-Baustein / max.Wert erreicht?
      L #Ink_DB;
      T "MW200";

      L 0;//Sinnvolle Angabe?
      <=I;//Nein!
      BEB;//Also nur Signal-Auswertung !

      AUF DB[ "MW200"]               ;//Zähler-DB öffnen

      L %DBD80;
      + DINT#1                       ;//Aktueller Zählerwert +1
      T %DBD80;

      L %DBD80              ;//Aktueller Zählerwert
      L %DBD76                  ;//Max. Wert erreicht ?
      <=D                             ;//Nein !
      R %DBX74.5                ;//Ohne Flag-Lauf wurde beendet
      R %DBX74.4                ;//Flag-Lauf wurde beendet
      BEB;

      -D                              ;//Restwert als Startwert nehmen !
      T %DBD80              ;//Keine Inkrementalgeber verbaut, sondern nur Sensor

      UN %DBX74.3                ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      = %DBX74.5                ;//Ohne Flag-Lauf wurde beendet
      U %DBX74.3                ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      = %DBX74.4                ;//Flag-Lauf wurde beendet

      UN %DBX74.3                ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
      = %DBX74.3;

//Zähler auf 000 setzen ?:
      UN %DBX74.6           ;//Zähler Zero-Load
      BEB;

      SET;
      R %DBX74.6;

      L 0;
      T %DBD80             ;//Zählerwert zum Setzen

NETWORK
TITLE = Ende
      BE;

END_FUNCTION_BLOCK

