7. Lösungen: Anwenderdefinierte Datentypen, Aufzählungstypen, IEC-Operatoren ======================================================================= Aufgabe 7.1 Lösung 2 PROGRAM TANKANLAGE (**************************************************************** Aufgabe 7.1, Lösung 2 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:=%IW0; Tank[2].iTemp:=%IW1; Tank[1].iDurchfluss:=%IW2; Tank[2].iDurchfluss:=%IW3; Tank[1].xHeizEin:=%IX4.0; Tank[2].xHeizEin:=%IX4.1; (*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*) %QX0.0:=Tank[1].xHeizung; %QX0.1:=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.2a 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 _______________________________________________________________________ Übung 7.2b 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 _______________________________________________________________________ Aufgabe 7.2 b) 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; =======================================================================