SPS- Programmierung mit ST

nach IEC 61131 mit CODESYS V2.3, CODESYS V3, e!COCKPIT

Lösungen Kapitel 6 Unterprogramme, Tasks für CODESYS V3 oder e!COCKPIT ,  für CoDeSys V2.3

  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_VAR

PROGRAM PLC_PRG
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_VAR

PROGRAM 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_VAR

PROGRAM 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_VAR

PROGRAM 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