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