5. Lösungen: Kontrollstrukturen-Schleifen ======================================================================= Aufgabe 5.1 a) Impedanzberechnung in einer Tabelle mit der FOR-Schleife PROGRAM PLC_PRG VAR index:INT;(*Laufvariable*) U:REAL:=10.0; I:ARRAY[1..5] OF REAL; Z:ARRAY[1..5] OF REAL; a:REAL; END_VAR FOR index:=1 TO 5 DO I[index]:= INT_TO_REAL(index); Z[index]:= U/I[index]; END_FOR; a:=Z[3]; _______________________________________________________________________ Aufgabe 5.1 b) PROGRAM PLC_PRG VAR index:USINT;(*Laufvariable*) U:REAL:=10.0; I:ARRAY[1..6] OF REAL; Z:ARRAY[1..6] OF REAL; END_VAR FOR index:=2 TO 12 BY 2 DO I[index/2]:= USINT_TO_REAL(index); Z[index/2]:= U/I[index/2]; END_FOR; _______________________________________________________________________ Übung 5.1 Messstellen, Mittelwertberechnung mit der FOR-Schleife PROGRAM PLC_PRG (*Mittelwert von %IW0...%IW5 berechnen*) (*Geben Sie während der Laufzeit in der Steuerungskonfiguration Werte 0...32760 ein*) VAR iMw AT %IW0: ARRAY[0..5] OF INT; i:INT; (*Index*) rMesswert: ARRAY[0..5] OF REAL; rMittelwert, rSumme:REAL; END_VAR (*Messwerte berechnen*) rSumme:= 0.0; FOR i:= 0 TO 5 DO rMesswert[i]:= iMw[i] * 100 / 32760.0; (*Implizierte Typenumwandlung*) rSumme:= rSumme + rMesswert[i]; END_FOR; (*Mittelwert berechnen*) rMittelwert:= rSumme / i; (*Implizierte Typenumwandlung*) _______________________________________________________________________ Aufgabe 5.2 PROGRAM PLC_PRG VAR index:INT;(*Laufvariable*) U:REAL:= 10.0; I:ARRAY[1..5] OF REAL; Z:ARRAY[1..5] OF REAL; a:INT; END_VAR index:= 1; WHILE index < 6 DO I[index]:= index; Z[index]:= U / I[index]; index:= index + 1; END_WHILE; a:=index; _______________________________________________________________________ Aufgabe 5.3 PROGRAM PLC_PRG VAR S1:BOOL;(*Schalter*) Q1:BOOL; iVar:INT; END_VAR WHILE S1 = TRUE DO Q1 := TRUE; END_WHILE; iVar := iVar+1; Q1 := FALSE; _______________________________________________________________________ Aufgabe 5.4 PROGRAM PLC_PRG VAR index:INT;(*Laufvariable*) U:REAL:= 10.0; I:ARRAY[1..5] OF REAL; Z:ARRAY[1..5] OF REAL; a:INT; END_VAR index :=1; REPEAT I[index] := index; Z[index] := U / I[index]; index := index + 1; UNTIL index > 5 END_REPEAT; a:=index; _______________________________________________________________________ Übung 5.2 mit REPEAT, Sortieren von Zahlen nach dem "Bubble Sort"-Verfahren PROGRAM PLC_PRG (*Sortieren nach dem "Bubble Sort" Verfahren*) VAR CONSTANT iMax: INT:= 3; END_VAR VAR xSortieren, xTauschen: BOOL; i, iTauschplatz: INT; iPlatz: ARRAY[0..imax] OF INT:= [3,2,4,1]; END_VAR IF xSortieren THEN REPEAT xTauschen := FALSE; FOR i:= iMax TO 1 BY -1 DO IF iPlatz[i-1] > iPlatz[i]THEN iTauschplatz:= iPlatz[i]; iPlatz[i]:= iPlatz[i-1]; iPlatz[i-1]:= iTauschplatz; xTauschen:= TRUE; END_IF; END_FOR; UNTIL NOT xTauschen END_REPEAT; END_IF Übung 5.2 mit WHILE, Sortieren von Zahlen nach dem "Bubble Sort"-Verfahren PROGRAM PLC_PRG (*Sortieren nach dem "Bubble Sort" Verfahren*) VAR CONSTANT iMax: INT:=3; END_VAR VAR xSortieren, xTauschen: BOOL; i, iTauschplatz: INT; iPlatz: ARRAY[0..imax] OF INT:= [3,2,4,1]; END_VAR IF xSortieren THEN xTauschen:= TRUE; WHILE xTauschen DO xTauschen := FALSE; FOR i:= iMax TO 1 BY -1 DO IF iPlatz[i-1] > iPlatz[i]THEN iTauschplatz:= iPlatz[i]; iPlatz[i]:= iPlatz[i-1]; iPlatz[i-1]:= iTauschplatz; xTauschen:= TRUE; END_IF; END_FOR; END_WHILE; END_IF _______________________________________________________________________ Übung 5.3 Dezimalzahl -> Dualzahl PROGRAM PLC_PRG (*Dezimalzahl -> Dualzahl*) VAR usiEingabe_zahl :USINT := 10; usiZahl ,i, usiRest :USINT; usiOut : ARRAY[0..7] OF USINT; END_VAR FOR i:= 0 TO 7 DO usiOut[i]:= 0; END_FOR; i:= 0; usiZahl:= usiEingabe_zahl; REPEAT usiRest:= usiZahl MOD 2; usiOut[i]:= usiRest; usiZahl:= usiZahl/2; i:=i + 1; UNTIL usiZahl = 0 END_REPEAT; _______________________________________________________________________ Aufgabe 5.5 a) PROGRAM PLC_PRG VAR i,k,a,b:USINT; M:ARRAY[0..2,0..7] OF BOOL; END_VAR IF M[2,7]=FALSE THEN FOR i:=0 TO 7 DO FOR k:=0 TO 2 DO IF (i<2 OR i=4) THEN EXIT; END_IF; M[k,i]:=TRUE; END_FOR; END_FOR; END_IF; a:=i;b:=k; _______________________________________________________________________ Aufgabe 5.5 b) FOR-Schleife in FOR-Schleife mit EXIT: PROGRAM PLC_PRG VAR i,k,a,b:INT; M:ARRAY[1..3,0..7] OF BOOL; END_VAR IF M[2,7] = FALSE THEN FOR i:=0 TO 7 DO FOR k:=1 TO 3 DO IF (i=2 OR i=4 OR i=6) THEN EXIT; END_IF M[k,i]:= TRUE; END_FOR; END_FOR; END_IF; a:=i;b:=k; Aufgabe 5.5 c) FOR-Schleife mit CONTINUE PROGRAM PLC_PRG (********************************************************************* Bitmuster in ein Datenfeld schreiben , Schleife mit EXIT oder CONTINUE Beschreiben Sie, nach dem Einloggen und Start, S1 und beobachten Sie die Werte von M[...]. Setzen Sie Haltepunkte ein. Ersetzen Sie dann CONTINUE durch EXIT **********************************************************************) VAR S1:BOOL; i:INT; M:ARRAY[0..7] OF BOOL; END_VAR IF S1 THEN FOR i:=0 TO 7 DO IF (i=2 OR i=4) THEN CONTINUE; END_IF; M[i]:= TRUE; END_FOR; ELSE FOR i:=0 TO 7 DO M[i]:= FALSE; END_FOR END_IF; _______________________________________________________________________ Übung 5.4 Kennwort-Abfrage mit REPEAT-Schleife und EXIT PROGRAM PLC_PRG (*Eingabe mit Liste vergleichen*) VAR sEingabe:STRING:= 'a'; Index:INT; sKennwort:ARRAY[1..6] OF STRING:=['a','b','c','d','e','f']; xKw_nicht_gefunden:BOOL; END_VAR Index:= 0; REPEAT Index:= Index + 1; IF Index > 6 THEN EXIT; END_IF; UNTIL Index > 6 OR sKennwort[Index]= sEingabe END_REPEAT; IF Index > 6 THEN xKw_nicht_gefunden:= TRUE; ELSE xKw_nicht_gefunden:= FALSE; END_IF; _______________________________________________________________________ Übung 5.4 Kennwort-Abfrage mit der WHILE-Schleife Index:= 1; WHILE Index <= 6 AND sKennwort[Index]<> sEingabe DO Index:= Index + 1; END_WHILE; .... =======================================================================