SPS- Programmierung mit ST

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

Lösungen Kapitel 7 Anwenderdefinierte Datentypen, Aufzählungstypen, IEC-Operatoren

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


Aufgabe 7.1 TANKANLAGE Lösung 2

VAR_GLOBAL
 iTank1_Temperatur AT %IW0:INT; (*Sensor*)
 iTank2_Temperatur AT %IW1:INT; (*Sensor*)
 iTank1_Durchfluss AT %IW2:INT; (*Sensor*)
 iTank2_Durchfluss AT %IW3:INT; (*Sensor*)
 S1_AnlEin AT %IX4.0:BOOL;
 Q1_Heizung AT %QX0.0:BOOL;
 S2_AnlEin AT %IX4.1:BOOL;
 Q2_Heizung AT %QX0.1:BOOL;
END_VAR
  
PROGRAM TANKANLAGE
(****************************************************************
Tankanlage, anwenderdefinierter Datentyp, Task, IEC-Operatoren,
Skalieren, Linearisieren.
Der Datentyp TANK wurde erweitert.
Geben Sie die Werte zum Testen in der Steuerungskonfiguration ein
*****************************************************************)
VAR
 Tank:ARRAY [1..2] OF TANK;
 Max_Temp, Max_Durchfluss: INT;
 i: USINT;
END_VAR
(*Werte lesen*)
Tank[1].iTemp:=iTank1_Temperatur;
Tank[2].iTemp:=iTank2_Temperatur;
Tank[1].iDurchfluss:=iTank1_Durchfluss;
Tank[2].iDurchfluss:=iTank2_Durchfluss;
Tank[1].xHeizEin:=S1_AnlEin;
Tank[2].xHeizEin:=S2_AnlEin;
(*Messwert skalieren und linearisieren*)
FOR i:=1 TO 2 DO
 Tank[i].rTemperatur:= INT_TO_REAL(Tank[i].iTemp)/10.0;
 Tank[i].rDurchfluss:= SQRT(INT_TO_REAL(Tank[i].iDurchfluss))/1.81;
 Tank[i].xHeizung:= Tank[i].xHeizEin;
END_FOR;
(*max. Werte bestimmen und runden*)
Max_Temp:= REAL_TO_INT(MAX(Tank[1].rTemperatur, Tank[2].rTemperatur));
Max_Durchfluss:= REAL_TO_INT(MAX(Tank[1].rDurchfluss, Tank[2].rDurchfluss));
(*Werte schreiben*)
Q1_Heizung:=Tank[1].xHeizung;
Q2_Heizung:=Tank[2].xHeizung;

TYPE TANK :
STRUCT
 iTemp, iDurchfluss:INT;
 rTemperatur, rDurchfluss:REAL;
 xHeizung, xHeizEin:BOOL;
END_STRUCT
END_TYPE
  
Übung  7.1 Tankanlage 2, Erweiterung der Aufgabe 7.1
  
VAR_GLOBAL
 iTank1_Temperatur AT %IW0:INT;
 iTank2_Temperatur AT %IW1:INT;
 iTank1_Durchfluss AT %IW2:INT;
 iTank2_Durchfluss AT %IW3:INT;
 S1_AnlEin AT %IX4.0:BOOL;
 Q1_Heizung AT %QX0.0:BOOL;
 S2_AnlEin AT %IX4.1:BOOL;
 Q2_Heizung AT %QX0.1:BOOL;
END_VAR

TYPE TANK :
STRUCT
 rTemperatur:REAL;
 rDurchfluss:REAL;
 rDurchfl_r:REAL;(*gerundet*)
 xHeizung, xHeizEin:BOOL;
END_STRUCT
END_TYPE

PROGRAM TANKANLAGE
VAR
 Tank1, Tank2: Tank;
 Max_Temp: INT;
END_VAR
(*Messwert skalieren in °C*)
Tank1.rTemperatur:= INT_TO_REAL(iTank1_Temperatur)/10.0;
Tank2.rTemperatur:= INT_TO_REAL(iTank2_Temperatur)/10.0;
(*max. Temperatur bestimmen und runden*)
Max_Temp:= TRUNC(MAX(Tank1.rTemperatur, Tank2.rTemperatur));
(*Messwert linearisieren und skalieren in L/min*)
Tank1.rDurchfluss:= SQRT(INT_TO_REAL(iTank1_Durchfluss))/1.81;
Tank2.rDurchfluss:= SQRT(INT_TO_REAL(iTank2_Durchfluss))/1.81;
(*Durchfluss runden auf 2 bzw. 1 Nachkommastelle*)
(*da die TRUNC() die Nachkommestellen abschneidet*)
Tank1.rDurchfl_r:= DINT_TO_REAL(REAL_TO_DINT(Tank1.rDurchfluss*100.0))/100.0;
Tank2.rDurchfl_r:= DINT_TO_REAL(REAL_TO_DINT(Tank2.rDurchfluss * 10.0))/10.0;
(*Heizung steuern*)
IF Tank1.rTemperatur > 100.1 THEN
  Tank1.xHeizung := FALSE;
 ELSIF Tank1.rTemperatur < 99.9 THEN
  Tank1.xHeizung:= TRUE;
END_IF;
IF Tank2.rTemperatur > 100.1 THEN
  Tank2.xHeizung := FALSE;
 ELSIF Tank2.rTemperatur < 99.9 THEN
  Tank2.xHeizung:= TRUE;
END_IF;
Q1_Heizung:=Tank1.xHeizung AND S1_AnlEin;
Q2_Heizung:=Tank2.xHeizung AND S2_AnlEin;
  
Übung  7.2 a) Datentypen der Zeit kennenlernen.
  
PROGRAM PLC_PRG
(******************************************************
Datentypen der Zeit kennenlernen.
Wenn Sie die Simulation zum Testen verwenden, so können
Sie die Instanz des RTC als Echtzeituhr benutzen
*******************************************************)
VAR
 instRTC:RTC;
 dtZeitpunkt:DT;
 todZeitpunkt: TOD;
 Person:ARRAY[1..3] OF Arbeiter ;
 i: USINT;
END_VAR
(*Datum und Uhrzeit*)
instRTC(EN:=TRUE , PDT:= DT#2019-05-14-07:00:00, Q=> , CDT=>dtZeitpunkt);
todZeitpunkt:= DT_TO_TOD(dtZeitpunkt);
(*Arbeitszeit ermitteln*)
FOR i := 1 TO 3 DO
 IF Person[i].Start THEN
  Person[i].Startzeit:=todZeitpunkt;
  Person[i].Arbeitszeit:=T#0m;
 END_IF;
 IF Person[i].Ende THEN
  Person[i].Endezeit:=todZeitpunkt;
  Person[i].Arbeitszeit:=
          UDINT_TO_TIME(TOD_TO_UDINT(Person[i].Endezeit) -
          TOD_TO_UDINT(Person[i].Startzeit));
 END_IF;
 Person[i].Datum:=DT_TO_DATE(dtZeitpunkt);
END_FOR;

TYPE Arbeiter :
STRUCT
 Name:STRING:='Name';
 Datum:DATE;
 Start, Ende:BOOL;
 Startzeit, Endezeit:TOD;
 Arbeitszeit:TIME;
END_STRUCT
END_TYPE
  
b) Datentypen der Zeit kennenlernen, Stringfunktionen anwenden
  
PROGRAM PLC_PRG
(******************************************************
Datentypen der Zeit kennenlernen.
Wenn Sie die Simulation zum Testen verwenden, so können
Sie die Instanz des RTC als Echtzeituhr benutzen
*******************************************************)
VAR
 instRTC:RTC;
 dtZeitpunkt:DT;
 todZeitpunkt: TOD;
 Person:ARRAY[1..3] OF Arbeiter ;
 i: USINT;
 stZeitpunkt: STRING;
END_VAR
(*Datum und Uhrzeit*)
instRTC(EN:=TRUE , PDT:= DT#2019-05-14-07:00:00, Q=> , CDT=>dtZeitpunkt );
(*Für die Visu stZeitpunkt*)
stZeitpunkt:=RIGHT(STR:=DT_TO_STRING(dtZeitpunkt) , SIZE:=19 ) ;
todZeitpunkt:= DT_TO_TOD(dtZeitpunkt); (*Tageszeit*)
(*Arbeitszeit ermitteln*)
FOR i := 1 TO 3 DO
 IF Person[i].Start THEN
  Person[i].Startzeit:=todZeitpunkt;
  Person[i].Arbeitszeit:=T#0m;
 END_IF;
 IF Person[i].Ende THEN
  Person[i].Endezeit:=todZeitpunkt;
  Person[i].Arbeitszeit:=UDINT_TO_TIME(TOD_TO_UDINT(Person[i].Endezeit)
                       - TOD_TO_UDINT(Person[i].Startzeit));
 END_IF;
 Person[i].Datum:=DT_TO_DATE(dtZeitpunkt);
 (*Für die Visu stArbeitszeit*)
 Person[i].stArbeitszeit:=
                      DELETE(TIME_TO_STRING(Person[i].Arbeitszeit), 2, 1) ;
END_FOR;
  
TYPE Arbeiter :
STRUCT
 Name:STRING:='Name';
 Datum:DATE;
 Start, Ende:BOOL;
 Startzeit, Endezeit:TOD;
 Arbeitszeit:TIME;
 stArbeitszeit:STRING;
END_STRUCT
END_TYPE
Aufgabe 7.2 a) Beleuchtung für Bühnenbilder
  
TYPE LEUCHTE:
STRUCT
 xEin:BOOL;
 uiHelligkeit:USINT:= 30;
 uiFarbe:USINT;
END_STRUCT
END_TYPE

PROGRAM PLC_PRG
VAR
 usiSzenenNr:USINT;
 Leuchte1, Leuchte2, Leuchte3:LEUCHTE;
END_VAR
usiSzenenNr:= LIMIT(0,usiSzenenNr,2);(*Variablenwert begrenzen 0...2*)
CASE usiSzenenNr OF
 1: Leuchte1.xEin:= TRUE;
  Leuchte2.xEin:= TRUE; Leuchte2.uiFarbe:= 20;
  Leuchte2.uiHelligkeit:= 20;
  Leuchte3.xEin:= TRUE; Leuchte3.uiFarbe:= 30;
  Leuchte3.uiHelligkeit:= 10;
 2: Leuchte1.xEin:= FALSE;
  Leuchte2.xEin:= TRUE; Leuchte2.uiFarbe:= 10;
  Leuchte2.uiHelligkeit:= 10;
  Leuchte3.xEin:= TRUE; Leuchte3.uiFarbe:= 20;
  Leuchte3.uiHelligkeit:= 20;
 ELSE
  Leuchte1.xEin:=FALSE; Leuchte1.uiFarbe:= 0;
  Leuchte1.uiHelligkeit:= 30;
  Leuchte2.xEin:=FALSE; Leuchte2.uiFarbe:= 0;
  Leuchte2.uiHelligkeit:= 30;
  Leuchte3.xEin:=FALSE; Leuchte3.uiFarbe:= 0;
  Leuchte3.uiHelligkeit:= 30;
END_CASE
  
b) Beleuchtung für Bühnenbilder mit Aufzählungstyp

TYPE FARBEN :(weiss, rot:=10, blau:=20, gruen:=30);
END_TYPE

TYPE HELLIGKEIT :(dunkel:=10, mittel:=20, hell:=30);
END_TYPE

TYPE LEUCHTE:
STRUCT
 xEin:BOOL;
 uiHelligkeit:UINT:= 30; (*Datentyp nur UINT und INT zulässig*)
 uiFarbe:INT;
END_STRUCT
END_TYPE

PROGRAM PLC_PRG
VAR
 usiSzenenNr:USINT;
 Leuchte1, Leuchte2, Leuchte3:LEUCHTE;
END_VAR
usiSzenenNr:= LIMIT(0,usiSzenenNr,2);(*Variablenwert begrenzen*)
CASE usiSzenenNr OF
 1: Leuchte1.xEin:= TRUE;
  Leuchte2.xEin:= TRUE; Leuchte2.uiFarbe:= blau;
  Leuchte2.uiHelligkeit:= mittel;
  Leuchte3.xEin:= TRUE; Leuchte3.uiFarbe:= gruen;
  Leuchte3.uiHelligkeit:= dunkel;
 2: Leuchte1.xEin:= FALSE;
  Leuchte2.xEin:= TRUE; Leuchte2.uiFarbe:= rot;
  Leuchte2.uiHelligkeit:= dunkel;
  Leuchte3.xEin:= TRUE; Leuchte3.uiFarbe:= blau;
  Leuchte3.uiHelligkeit:= mittel;
 ELSE
  Leuchte1.xEin:= FALSE; Leuchte1.uiFarbe:= weiss;
  Leuchte1.uiHelligkeit:= hell;
  Leuchte2.xEin:= FALSE; Leuchte2.uiFarbe:= weiss;
  Leuchte2.uiHelligkeit:= hell;
  Leuchte3.xEin:= FALSE; Leuchte3.uiFarbe:= weiss;
  Leuchte3.uiHelligkeit:= hell;
END_CASE;

© Vogel Buchverlag