FUNCTION_BLOCK "MAntrieb_PowerSave" 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 T_Nachlauf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 60; // Nachlaufzeit (*1s) 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) 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_PowerSave"; // 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 #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; 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 ! UN #Stat.A_PS ;//PowerSave-Mode: Bei Ausschaltverzögerung anhalten 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.A_vor ;//Übergabe an OP = #Stat.OP_A_vor; U #Stat.A_start; = #Stat.OP_A_start; U #Stat.A_PS; = #Stat.OP_A_PS; U #Stat.Stop_vor; = #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.A_PS; R #Stat.H_vor; R #Stat.H_rueck; NETWORK TITLE = Nachlaufzeit läuft UN "1s-Impuls" ;//1s-Impuls ON #sAntriebvor;//Antrieb steht SPB Nw14; L #Stat.T_Zelle; L 0;//Zeit steht ? ==I;//Ja ! SPB Nw14; L #Stat.T_Zelle; + -1; T #Stat.T_Zelle; L 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 ?