Files

520 lines
13 KiB
Plaintext

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 ?
<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