SPS- Programmierung mit ST

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

Lösungen Kapitel 4 Kontrollstrukturen – Alternativen

  Kopieren Sie den Programmcode und fügen Sie diesen in Ihre Entwicklungsumgebung ein.
  


Aufgabe 4.1 b) SR-Kippglied

PROGRAM PLC_PRG
(*setzen vorrangig*)
VAR
 xStart, xStopp:BOOL;
 xOut:BOOL;
END_VAR
IF xStopp THEN
 xOut:= FALSE;
END_IF;
IF xStart THEN
 xOut:= TRUE;
END_IF;

c) SR-Kippglied mit ELSIF...

PROGRAM PLC_PRG
(*setzen vorrangig*)
VAR
 xStart, xStopp:BOOL;
 xOut:BOOL;
END_VAR
IF xStart THEN
  xOut:= TRUE;
 ELSIF xStopp THEN
  xOut:= FALSE;
END_IF;
  
d) RS-Kippglied mit remanenten Speicher

PROGRAM PLC_PRG
(*rücksetzen vorrangig mit remanenten Speicher*)
VAR
 xOUT AT %QX0.0:BOOL;
 xStopp AT %IX2.0:BOOL;
 xStart AT %IX2.1:BOOL;
END_VAR
VAR RETAIN
 xMerker:BOOL;
END_VAR
IF xStopp THEN
  xMerker:=FALSE;
 ELSIF xStart THEN
  xMerker:=TRUE;
END_IF
xOUT:= xMerker;
  
Übung 4.1 Behältersteuerung

PROGRAM PLC_PRG
(*Projekt: Behältersteuerung*)
VAR
(*Adr. abhängig von der Gerätekonfiguration *)
 S1_ein AT %IX2.0:BOOL;
 B1 AT %IX2.1:BOOL;
 B2 AT %IX2.2:BOOL;
 P1_ein AT %QX0.0:BOOL;
 M1_Ventil AT %QX0.1:BOOL;
 M2_Ventil AT %QX0.2:BOOL;
END_VAR
P1_ein := S1_ein; (*Meldung ein*)
IF NOT B1 THEN(*Ventile ein*)
 M1_Ventil:= TRUE; M2_Ventil:= TRUE;
END_IF;
(*Ventile ausschalten*)
IF B2 OR NOT S1_ein THEN
 M1_Ventil:= FALSE; M2_Ventil:= FALSE;
END_IF;
Übung 4.2 Zweipunktregler

PROGRAM PLC_PRG
(*Helligkeits- und dann Schwellwert ändern, xOut beobachten*)
VAR
 usiSchwellwert :USINT:= 150; (*Testwert*)
 usiHelligkeit :USINT:= 200; (*Testwert*)
 usiEinschaltpunkt, usiAusschaltpunkt :USINT;
 xOut :BOOL;
END_VAR
(*Schwellwert prüfen*)
IF usiSchwellwert >200 OR usiSchwellwert <100
 THEN usiSchwellwert:= 150;
END_IF
(*Schaltpunkte berechnen, Hysterese=50*)
usiEinschaltpunkt:= usiSchwellwert – 25;
usiAusschaltpunkt:= usiSchwellwert + 25;
(*schalten*)
IF usiHelligkeit > usiAusschaltpunkt
 THEN xOut:= FALSE;
END_IF;
IF usiHelligkeit < usiEinschaltpunkt
 THEN xOut:= TRUE;
END_IF;
  
Übung 4.3 Kompensationsanlage

PROGRAM PLC_PRG
VAR
(*rQ eingeben, xQ1..xQ3 beobachten*)
 rQ:REAL:= 1500.0; (*Testwert*)
 xQ1, xQ2, xQ3:BOOL;
END_VAR
IF rQ < 1000.0 THEN
  xQ3:= FALSE; xQ2:= FALSE; xQ1:= FALSE;
 ELSIF rQ < 2000.0 THEN
  xQ3:= FALSE; xQ2:= FALSE; xQ1:= TRUE;
 ELSIF rQ < 3000.0 THEN
  xQ3:= FALSE; xQ2:= TRUE; xQ1:= TRUE;
 ELSE
  xQ3:= TRUE; xQ2:= TRUE; xQ1:= TRUE;
END_IF;
Übung 4.4 Zähler

PROGRAM PLC_PRG
(* Vorwärtszähler eng. Counter up *)
VAR
 CU AT %IX2.1 :BOOL;(*Zähleingang- count up*)
 CV :INT;(*aktueller Zählwert-countervalue*)
 PV :INT:= 10;(*Vorgabewert-presetvalue*)
 CU_flanke,xGedaechtnis :BOOL;
 Q AT %Q0.0 :BOOL;
END_VAR
(*steigende Flanke erkennen*)
CU_flanke:= CU AND NOT xGedaechtnis;
xGedaechtnis:= CU;
(*vorwärts zählen*)
IF CU_flanke THEN
 CV:= CV + 1;
END_IF
Q:= CV >= PV;
Aufgabe 4.2 Multiplexer

PROGRAM PLC_PRG
(******************************************
Geben Sie zum Testen in mw_1...mw_3 Werte vor
Geben Sie in der Visu die Schalterstelung 1... ein
Beurteilen Sie das Ergebniss
*******************************************)
VAR
 iSel:INT;
 mw_1 AT %IW?:INT;(* ? = abhängig von der Gerätekonfiguration *)
 mw_2 AT %IW?:INT;
 mw_3 AT %IW?:INT;
 rOut:REAL;
END_VAR
CASE iSel OF
 1: rOut:=INT_TO_REAL(mw_1)/3276.0;
 2: rOut:=INT_TO_REAL(mw_2)/3276.0;
 3: rOut:=INT_TO_REAL(mw_3)/3276.0;
 ELSE rOut:=0.0;
END_CASE;
Übung 4.5 Autowaschanlage

PROGRAM PLC_PRG
(*Autowaschanlage, ablauforientiert programmiert*)
VAR
 step_no:USINT:=0;(*Schrittnummer*)
 S1_start AT %IX0.0: BOOL;(*Start-Taste*)
 B1_pos_vorw AT %IX0.1: BOOL;(*Endschalter*)
 B2_pos_hauptw AT %IX0.2: BOOL;(*Endschalter*)
 B3_pos_trock AT %IX0.3: BOOL;(*Endschalter*)
 B4_pos_ende AT %IX0.4: BOOL;(*Endschalter*)
 P1_startbereit AT %QX0.0: BOOL;(*Anzeige*)
 Q1_Band AT %QX0.2: BOOL;(*Bandantrieb*)
 M1_Vorw AT %QX0.3: BOOL;(*Ventil*)
 M2_Q2_Hauptw AT %QX0.4: BOOL;(*Ventil+Bürsten*)
 Q3_Trockner AT %QX0.5: BOOL;(*Trocknerantrieb*)
END_VAR
CASE step_no OF
 0: Q1_Band: = FALSE;
    Q3_Trockner:= FALSE;
    P1_startbereit:= TRUE;
    IF S1_start THEN
     step_no:= step_no + 1; END_IF;
 1: P1_startbereit:= FALSE;
    Q1_Band:= TRUE;
    IF B1_pos_vorw THEN
     step_no:= step_no + 1; END_IF;
 2: M1_Vorw:= TRUE;
    IF B2_pos_hauptw THEN
     step_no:= step_no + 1; END_IF;
 3: M1_Vorw:= FALSE;
    M2_Q2_Hauptw:= TRUE;
    IF B3_pos_trock THEN
     step_no:= step_no + 1; END_IF;
 4: M2_Q2_Hauptw:= FALSE;
    Q3_Trockner:= TRUE;
    IF B4_pos_ende THEN
     step_no:= 0; END_IF;
END_CASE;
  
Aufgabe 4.3 Meldung, String

PROGRAM PLC_PRG
(*usiMWert ändern, sMeldung beobachten*)
VAR
 usiMWert :USINT:= 5;(*Testwert*)
 sMeldung :STRING;
END_VAR
CASE usiMWert OF
 0..10 : sMeldung:= 'Temperatur zu niedrig';
 11..15: sMeldung:= 'Temperatur etwas hoch fahren';
 16 : sMeldung:= 'Temperatur ok';
 17..20: sMeldung:= 'Temperatur etwas herunter fahren';
 ELSE sMeldung:= 'Temperatur zu hoch';
END_CASE;
Übung 4.6 Füllstand, Frequenzumrichter

PROGRAM PLC_PRG
(*Zum Testen den Füllstand ändern*)
VAR
 wHoehe AT %IW0:WORD; (*Füllstand 0...32760)
 usiHoehe:USINT;(*Füllstand in %*)
 wSollwert AT %QW0:WORD;
 led_gruen, led_gelb, led_rot:BOOL;
END_VAR
usiHoehe:= WORD_TO_USINT(wHoehe*100/32760);
CASE usiHoehe OF
 0..25 : wSollwert:= 0;(*0V*)
         led_gruen:= TRUE; led_gelb:= FALSE;
         led_rot:= FALSE;
 26..50: wSollwert:= 8192;(*2,5V*)
         led_gruen:= TRUE; led_gelb:= FALSE;
         led_rot:= FALSE;
 51..75 : wSollwert:= 16384;(*5V*)
         led_gruen:= FALSE; led_gelb:= TRUE;
         led_rot:= FALSE;
 ELSE wSollwert:= 32767;(*10V*)
         led_gruen:= FALSE; led_gelb:= FALSE;
         led_rot:= TRUE;
END_CASE;
Aufgabe 4.4 Funktion "2 aus 3" mit CASE-Anweisung

PROGRAM PLC_PRG
(*Funktion(2aus3)%I2.0...I2.2 ändern, %Q0.0 beobachten*)
VAR
 bSensoren AT %IB4: BYTE;(*Sensoreingänge*)
 usiSensoren: USINT;
 xP1 AT %QX0.0: BOOL;
END_VAR
(*Bit3..7 ausmaskieren und in USINT umwandeln*)
usiSensoren:= BYTE_TO_USINT(bSensoren AND 2#0000_0111);
CASE usiSensoren OF
 3,5,6,7 :
  xP1:= TRUE;
 ELSE
  xP1:= FALSE;
END_CASE;
Bandanlage Speichernd ein/aus

Lösung

© Vogel Buchverlag