6. Lösungen: Unterprogramme, Tasks ======================================================================= Aufgabe 6.1 siehe Aufgabe 6.2 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 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; Fügen Sie die ereignisgesteuerten Tasks EreignisS0, EreignisS1 ein. _______________________________________________________________________ Ü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 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*) 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; =======================================================================