SPS- Programmierung mit STnach IEC
61131 mit CODESYS V2.3, CODESYS V3, e!COCKPIT
Lösungen Kapitel 6 Unterprogramme,
Tasks für CODESYS V2.3 (WAGO I/O Pro)
Kopieren Sie den Programmcode und
fügen Sie diesen in Ihre Entwicklungsumgebung
ein.
|
|
|
| Aufgabe 6.2 |
Unterprogramme,
Kompensationsanlage
VAR_GLOBAL
r_Q:REAL;
xQ1 AT %QX0.0:BOOL;
xQ2 AT %QX0.1:BOOL;
xQ3 AT %QX0.2:BOOL;
xP1_Eingabefehler AT %QX0.7:BOOL;
END_VARPROGRAM
PLC_PRG
(******************************************************************
Kompensationsanlage, Unterprogramme, GVL (globale
Variablenliste)
Verändern Sie im Programm BERECHNEN den Wert von r_I, z.B.
20,
nach dem Einloggen und Start, beobachten Sie die Werte in
der GVL.
*******************************************************************)
VAR
(*Variablen sind global deklariert*)
END_VAR
(*Aufruf der Unterprogramme*)
BERECHNEN();
STEUERN();
PROGRAM BERECHNEN
(*Blindleistung berechnen*)
VAR
r_U:REAL:= 230.0;
r_I:REAL:= 10.0;
r_P:REAL:= 2300.0;
r_S:REAL;
(*r_Q global deklariert*)
END_VAR
(*Scheinleistung berechnen*)
r_S:= r_U * r_I;
(*Baustein verlassen wenn P>S*)
IF r_P > r_S THEN
xP1_Eingabefehler:=TRUE;
RETURN;
ELSE xP1_Eingabefehler:=FALSE;
END_IF;
(*Blindleistung berechnen*)
r_Q:= SQRT(EXPT(r_S,2) EXPT(r_P,2));
PROGRAM STEUERN
(*Schütze Q1...Q3 abhängig von der Blindleistung
schalten.
Ändert sich r_Q nicht, wird der Baustein wieder
verlassen*)
VAR
(*r_Q, xQ1, xQ2, xQ3 sind global deklariert*)
i_Q_alt:INT;
END_VAR
IF i_Q_alt = REAL_TO_INT(r_Q) THEN RETURN; END_IF;
IF r_Q < 1000.0 THEN xQ3:=FALSE;xQ2:=FALSE;xQ1:=FALSE;
ELSIF r_Q < 2000.0 THEN xQ3:=FALSE;xQ2:=FALSE;xQ1:=TRUE;
ELSIF r_Q < 3000.0 THEN xQ3:=FALSE;xQ2:=TRUE; xQ1:=FALSE;
ELSIF r_Q < 4000.0 THEN xQ3:=FALSE;xQ2:=TRUE; xQ1:=TRUE;
ELSIF r_Q < 5000.0 THEN xQ3:=TRUE; xQ2:=FALSE;xQ1:=FALSE;
ELSIF r_Q < 6000.0 THEN xQ3:=TRUE; xQ2:=FALSE;xQ1:=TRUE;
ELSIF r_Q < 7000.0 THEN xQ3:=TRUE; xQ2:=TRUE; xQ1:=FALSE;
ELSE xQ3:=TRUE; xQ2:=TRUE; xQ1:=TRUE;
END_IF;
i_Q_alt:= REAL_TO_INT(r_Q);(*Wert runden und merken*)
|
| Aufgabe 6.4 |
Ereignisgesteuerter Task
Fügen Sie die ereignisgesteuerten Tasks EreignisS0,
EreignisS1 ein.
VAR_GLOBAL
xS0_Aus AT %IX2.0:BOOL; xS1_Ein AT %IX2.1:BOOL;
xQ0 AT %QX0.0: BOOL;
END_VARPROGRAM
PROG1
VAR
END_VAR
xQ0:=TRUE;
PROGRAM PROG2
VAR
END_VAR
xQ0:=FALSE;
|
| Übung 6.1 |
Unterprogramme, Autowaschanlage
VAR_GLOBAL
S00_Freigabe AT %IX0.0:BOOL;(*Schalter*)
B01_Anfang AT %IX0.1:BOOL;(*Anfangsposition*)
B02_Ende AT %IX0.2:BOOL;(*Endposition*)
Q00_Band AT %QX0.0:BOOL;(*Schütz Förderband*)
M01_wasch AT %QX0.1:BOOL;(*Waschmittelventil*)
B11 AT %IX1.1:BOOL;(*Lichtschranke 1*)
B12 AT %IX1.2:BOOL;
B13 AT %IX1.3:BOOL;
B14 AT %IX1.4:BOOL;
Q10_Buerste AT %QX1.0:BOOL;(*Schütz
Bürstenantrieb*)
M11_ab AT %QX1.1:BOOL;(*Ventil Bürsten ab*)
M12_auf AT %QX1.2:BOOL;(*Ventil Bürsten auf*)
END_VARPROGRAM
PLC_PRG
VAR
(*Variablen sind global deklariert*)
END_VAR
TRANSPORT_WASCH();
BUERSTEN();
PROGRAM TRANSPORT_WASCH
(******************************************************
Ist die Anlage freigegeben und der PKW in Position,
so schaltet das Band und das Waschmittelventil ein.
Das Band schaltet aus, wenn der Waschvorgang beendet ist
********************************************************)
VAR
END_VAR
(*Transport*)
IF B02_Ende OR NOT S00_Freigabe THEN
Q00_Band:= FALSE;
ELSIF B01_Anfang THEN
Q00_Band:= TRUE;
END_IF;
(*Waschmittelventil*)
M01_Wasch:= B01_anfang AND Q00_Band;
PROGRAM BUERSTEN
(****************************************************************
Über 4 Lichtschranken (B11..B14) wird der Abstand zum
Fahrzeug
konstant gehalten. Das Ventil-ab sowie der
Bürstenantrieb sind nur
ansteuerbar, wenn das Band eingeschaltet ist.
*****************************************************************)
VAR
END_VAR
(*Bürstenantrieb*)
Q10_Buerste:= Q00_band;
(*Bürste herunterfahren*)
M11_ab:= Q10_Buerste AND NOT B11 AND NOT B12 AND NOT B13
AND NOT B14;
(*Bürste hochfahren*)
M12_auf:= B11 OR B14;
|
| Übung 6.2 |
Positionieren
VAR_GLOBAL
iIstPosition:INT; (*z.B. IO-Link fähigen
Distanzsensor,
Wert
in mmm, z.B.IW0*)
xQ0 AT %QX0.0:BOOL; (*Schütz-zurück*)
xQ1 AT %QX0.1:BOOL; (*Schütz-vor*)
END_VARPROGRAM
PLC_PRG
(********************************************************************
Mit dem Taster S0 wird über ein Schütz Q0 ein Antrieb
eingeschaltet,
bis die Position 0 erreicht ist. Mit dem Taster S1 wird
die Position 1
angefahren usw. Die Position könnte über einen IO-Link
fähigen
Distanzsensor erfasst werden, sein Wert in mm könnte im
zugehörigen
Speicher, z.B. %IW0 gelesen werden. In dieser Übung wird
der Wert
des Distanzsensor im Unterprogramm MODELL abhängig von
den Variablen
xQ0 und xQ1 (Schütze) erzeugt, dieses Programm simuliert
den Sensor.
*********************************************************************)
VAR
END_VAR
(*Unterprogrammaufrufe
Modell nicht löschen, verändert den
Positionswert
abhängig von den Schützen *)
MODELL();
POSITIONIEREN();
PROGRAM MODELL
VAR
(*******************************************************
Verändern Sie den Programmcode nicht, er stellt
die Intelligenz des visualisierten Anlagenmodells dar.
********************************************************)
END_VAR
IF xQ1 THEN
iIstPosition := iIstPosition + 1;
ELSIF xQ0 THEN
iIstPosition := iIstPosition - 1;
END_IF;
PROGRAM POSITIONIEREN
VAR
xS0_Visu, xS1_Visu, xS2_Visu, xS3_Visu:BOOL;
iSollPosition: ARRAY[0..3] OF INT:= 0, 50, 100, 150;
END_VAR
(*Positionen anfahren*)
IF xS0_Visu AND iIstPosition < iSollPosition[0] THEN
xQ0:=FALSE; xQ1:=TRUE;
ELSIF xS0_Visu AND iIstPosition > iSollPosition[0]
THEN
xQ0:=TRUE; xQ1:=FALSE;
ELSIF xS0_Visu AND iIstPosition = iSollPosition[0]
THEN
xQ0:=FALSE; xQ1:=FALSE;
ELSIF xS1_Visu AND iIstPosition < iSollPosition[1]
THEN
xQ1:=TRUE; xQ0:=FALSE;
ELSIF xS1_Visu AND iIstPosition = iSollPosition[1]
THEN
xQ1:=FALSE; xQ0:=FALSE;
ELSIF xS1_Visu AND iIstPosition > iSollPosition[1]
THEN
xQ0:=TRUE; xQ1:=FALSE;
ELSIF xS2_Visu AND iIstPosition < iSollPosition[2]
THEN
xQ1:=TRUE; xQ0:=FALSE;
ELSIF xS2_Visu AND iIstPosition = iSollPosition[2]
THEN
xQ1:=FALSE; xQ0:=FALSE;
ELSIF xS2_Visu AND iIstPosition > iSollPosition[2]
THEN
xQ0:=TRUE; xQ1:=FALSE;
ELSIF xS3_Visu AND iIstPosition < iSollPosition[3]
THEN
xQ1:=TRUE; xQ0:=FALSE;
ELSIF xS3_Visu AND iIstPosition = iSollPosition[3]
THEN
xQ0:=FALSE; xQ1:=FALSE;
ELSE xQ0:=FALSE; xQ1:=FALSE;
END_IF;
|
© Vogel Buchverlag
|