11. Lösungen: Bibliotheken verwenden ======================================================================= Aufgaben 11.1 und 11.2 Zeitversetztes Zentral-Ein- und Ausschalten, Lichtszenen schalten Vergessen Sie nicht, die Bibliothek "Gebaeude_allgemein.lib" in Ihr Projekt über die Bibliotheksverwaltung einzubinden. VAR_GLOBAL (*Zeitversetztes Zentral-Ein- und Ausschalten*) S1_Licht AT %IX2.0:BOOL; Q1_Lichtband1 AT %QX0.0:BOOL; Q2_Lichtband2 AT %QX0.1:BOOL; Q3_Lichtband3 AT %QX0.2:BOOL; Q4_Lichtband4 AT %QX0.3:BOOL; (*Lichtszenen schalten*) S20_Lichtszene AT %IX2.1:BOOL; Q20_Licht AT %QX0.4:BOOL; Q21_Licht AT %QX0.5:BOOL; Q22_Licht AT %QX0.6:BOOL; Q23_Licht AT %QX0.7:BOOL; END_VAR PROGRAM PLC_PRG (********************************************* Beleuchtungssteuerung Bibliothek: Gebaeude_allgemein.lib 24.10.07 Version: 1.0 Firma: ........´Datum: ........ **********************************************) VAR (*Zeitversetztes Zentral-Ein- und Ausschalten*) S1visu:BOOL; Fb_LichtZentral_1:Fb_LichtZentral; (*Lichtszene schalten*) Fb_Klick_1:Fb_Klick; FbSzeneDigital_1:FbSzeneDigital; S20visu:BOOL; SzenenNr:BYTE:= 1; END_VAR (*Zeitversetztes Zentral-Ein- und Ausschalten*) Fb_LichtZentral_1( xEingang:= S1_Licht OR S1visu, uiTvein:= , uiTvaus:= ); Q1_Lichtband1:= Fb_LichtZentral_1.xAusgang1; Q2_Lichtband2:= Fb_LichtZentral_1.xAusgang2; Q3_Lichtband3:= Fb_LichtZentral_1.xAusgang3; Q4_Lichtband4:= Fb_LichtZentral_1.xAusgang4; (*Lichtszenen schalten*) Fb_Klick_1(xTaster:= S20visu OR S20_Lichtszene, uiT_10tel_s:= ); IF Fb_Klick_1.xEinzel THEN SzenenNr:= SzenenNr + 1; END_IF; IF SzenenNr= 9 OR Fb_Klick_1.xDoppel THEN SzenenNr:= 1; END_IF; FbSzeneDigital_1( bAktorSzenenNr1bis8:= SzenenNr, xSchaltAktor1:= , xSchaltAktor2:= , xSchaltAktor3:= , xSchaltAktor4:= , xSpeichern:= ); Q20_Licht:=FbSzeneDigital_1.xDoSchaltAktor1; Q21_Licht:=FbSzeneDigital_1.xDoSchaltAktor2; Q22_Licht:=FbSzeneDigital_1.xDoSchaltAktor3; Q23_Licht:=FbSzeneDigital_1.xDoSchaltAktor4; _______________________________________________________________________ Aufgabe 11.3 Temperaturregelung mit dem PID-Reglerbaustein Vergessen Sie nicht, die Bibliothek "Building_HVAC_01.lib" in Ihr Projekt über die Bibliotheksverwaltung einzubinden. FUNCTION_BLOCK PT2 (*Strecke mit Ausgleich*) VAR_INPUT Y:REAL;(*Stellwert*) N:USINT:= 30; (*zeitliches Verhalten*) END_VAR VAR_OUTPUT X:REAL;(*Istwert*) END_VAR VAR LOW_PASS_1, LOW_PASS_2:LOW_PASS;(*Instanzen*) x1: REAL; END_VAR LOW_PASS_1(IN:= Y, N:= N); x1:= LOW_PASS_1.OUT; LOW_PASS_2(IN:= x1, N:= N); X:= LOW_PASS_2.OUT; FUNCTION_BLOCK LOW_PASS (*Einfacher Tiefpass, Ausgangsverlauf ist nahe der e-Funktion*) VAR_INPUT IN: REAL; N: USINT;(*nach N Zyklen wird der Endwert erreicht*) END_VAR VAR_OUTPUT FAULT: BOOL; OUT: REAL; END_VAR IF N<5 OR N>200 THEN N:= 50; FAULT:= TRUE; ELSE FAULT:= FALSE; END_IF; OUT:=((IN-OUT)/N)+ OUT; PROGRAM TEMP_REG (******************************************* Temperaturregelung: Abtastzeit: 100 ms Version: 1.0, Datum: .... ., Autor: SchmittK Bibliothek: Building_HVAC_01.lib 06.08.2010 ********************************************) VAR w:REAL;(*Sollwert*) x: REAL;(*Istwert = Temperatur normiert 0...1*) e:REAL;(*Regeldifferenz*) y: REAL;(*Stellwert 0...1.0 = Heizleistung normiert*) PT2_1:PT2;(*Instanz*) Fb_Control_PID_1:Fb_Control_PID; END_VAR (*Simulation der Regelstrecke mit Ausgleich, Tg=10s, Tu=1.2s*) PT2_1(Y:= y, N:=); x:=PT2_1.X; (*PID-Regler, Reglerparameter optimiert nach Takahashi*) Fb_Control_PID_1( xEnable:= TRUE, rActualValue:= x, rReferenceValue:= w, rCycleTime:= 0.1, rKp:= (1.2*10.0/(1.2+0.1)), rTi:= (2.0*(1.25*1.25)/(1.3)), rTd:= (0.5*(1.2+0.1)), rOutputMin:= 0.0, rOutputMax:= 1.0); y:=Fb_Control_PID_1.rY; _______________________________________________________________________ Übung 11.1 Zufallszahl erraten Fügen Sie die Bibliothek oscat206.lib hinzu PROGRAM PLC_PRG (********************************************************************* Funktion: Es wird eine Zufallszahl erzeugt die durch Eingabe zu erraten ist. Bibliothek: oscat206.lib-> RDM(0),Version: 1.0, Datum: ..... **********************************************************************) VAR Zufallszahl: USINT; Eingabezahl: USINT;(*Visu*) Meldung: STRING; Meld_ok:STRING:='Die Zahl ist richtig!'; Meld_gr:STRING:='Die Zahl ist zu groß!'; Meld_kl:STRING:='Die Zahl ist zu klein!'; richtig: BOOL:=TRUE;(*Visu*) go: BOOL;(*Taster in der Visu "Neue Zahl"*) Versuche: INT;(*Anzahl der Versuche*) Eingabezahl_alt: USINT; END_VAR IF go OR Zufallszahl = 0 THEN Zufallszahl:= REAL_TO_USINT(RDM(0)*100.0); Versuche:=0; END_IF; IF Eingabezahl = Zufallszahl THEN Meldung:=Meld_ok; richtig:=TRUE; ELSIF Eingabezahl > Zufallszahl THEN Meldung:=Meld_gr; richtig:=FALSE; ELSE Meldung:=Meld_kl; richtig:=FALSE; END_IF; IF Eingabezahl <> Eingabezahl_alt THEN Versuche:= Versuche + 1; END_IF; Eingabezahl_alt:=Eingabezahl; _______________________________________________________________________ Übung 11.2 PIG ein Würfelspiel Fügen Sie die Bibliothek oscat206.lib hinzu PROGRAM PLC_PRG (*********************************************************** PIG Würfelspiel für zwei Spieler Bibliothek: oscat206.lib-> RDM(0),Version: 1.0, Datum: ..... ************************************************************) VAR instPIG1, instPIG2:PIG; xSpieler, xNeuesSpiel:BOOL;(*Schalter Visu*) END_VAR (*Spieler 1*) instPIG1(xSPIELEN:= NOT xSpieler, xNEUES_SPIEL:= xNeuesSpiel); (*Spieler 2*) instPIG2(xSPIELEN:= xSpieler, xNEUES_SPIEL:= xNeuesSpiel); Lösungsvariante 1 mit Hilfe des PAP FUNCTION_BLOCK PIG VAR_INPUT xSPIELEN, xWUERFELN, xNEUES_SPIEL:BOOL; END_VAR VAR_OUTPUT usiWUERFELZAHL: USINT; uiSPIELSTAND:UINT; END_VAR VAR instWUERFELN_TRIG:R_TRIG; usiWuerfelzahlNeu: USINT; END_VAR IF xSPIELEN THEN instWUERFELN_TRIG(CLK:= xWUERFELN); usiWuerfelzahlNeu:= 0; IF instWUERFELN_TRIG.Q THEN WHILE usiWuerfelzahlNeu < 1 OR usiWuerfelzahlNeu > 6 DO usiWuerfelzahlNeu:= REAL_TO_USINT(RDM(last:= 0)*10.0); END_WHILE; IF usiWuerfelzahlNeu > 1 THEN uiSPIELSTAND:= uiSPIELSTAND + usiWuerfelzahlNeu; ELSE uiSPIELSTAND:= 0; END_IF; usiWUERFELZAHL:= usiWuerfelzahlNeu; END_IF; END_IF; IF xNEUES_SPIEL THEN uiSPIELSTAND:= 0; usiWuerfelzahl:= 0; END_IF; Lösungsvariante 2 mit Hilfe des GRAFCETs FUNCTION_BLOCK PIG VAR_INPUT xSPIELEN, xWUERFELN, xNEUES_SPIEL:BOOL; END_VAR VAR_OUTPUT usiWUERFELZAHL: USINT; uiSPIELSTAND: UINT; END_VAR VAR usiSchrittNr:USINT; instWUERFELN_TRIG_R:R_TRIG; instWUERFELN_TRIG_F:F_TRIG; END_VAR instWUERFELN_TRIG_R(CLK:= xWUERFELN); instWUERFELN_TRIG_F(CLK:= xWUERFELN); CASE usiSchrittNr OF 0: IF instWUERFELN_TRIG_R.Q AND xSPIELEN THEN usiSchrittNr:= 1; END_IF; 1: usiWUERFELZAHL:= FC_ZUFALLSZAHL();(*Funktionsaufruf*) IF usiWUERFELZAHL > 1 THEN usiSchrittNr:= 2; END_IF; IF usiWUERFELZAHL = 1 THEN usiSchrittNr:= 3; END_IF; 2: IF instWUERFELN_TRIG_F.Q AND xSPIELEN THEN uiSPIELSTAND:= uiSPIELSTAND + usiWUERFELZAHL; END_IF; IF instWUERFELN_TRIG_R.Q AND xSPIELEN THEN usiSchrittNr:= 1; END_IF; IF xNEUES_SPIEL THEN usiSchrittNr:= 4; END_IF; 3: uiSPIELSTAND:= 0; IF instWUERFELN_TRIG_R.Q AND xSPIELEN THEN usiSchrittNr:= 1; END_IF; IF xNEUES_SPIEL THEN usiSchrittNr:= 4; END_IF; 4: uiSPIELSTAND:= 0; usiWUERFELZAHL:= 0; IF instWUERFELN_TRIG_R.Q AND xSPIELEN THEN usiSchrittNr:= 1; END_IF; END_CASE; FUNCTION FC_ZUFALLSZAHL : USINT (********************************* Zahl 1...6 erzeugen Bibliothek: oscat206.lib-> RDM(0) **********************************) VAR usiWuerfelzahlNeu: USINT; END_VAR WHILE usiWuerfelzahlNeu < 1 OR usiWuerfelzahlNeu > 6 DO usiWuerfelzahlNeu:= REAL_TO_USINT(RDM(last:= 0)*10.0); END_WHILE; FC_ZUFALLSZAHL:= usiWuerfelzahlNeu; =======================================================================