Aufgabe 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, Regelstrecke*)
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.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;
|
| Übung 3 |
Fragen - Antworten PROGRAM PLC_PRG
(**************************************************************************
Frage-Antwort
Öffnen Sie nach dem Einloggen und Start
die Visualisierung und klicken Sie auf "Frage"
..."Antwort"
***************************************************************************)
VAR
Frage:ARRAY[1..17] OF STRING:=
'Wie wird der Programmbaustein PLC_PRG standardmäßig
aufgerufen?',
'Das Zuweisungszeichen im Programm ist ... ',
'Der Wertebereich einer Variablen wird festgelegt mit ...',
'VAR, END_VAR, BOOL, FALSE ... sind ...',
'Der Datentyp USINT kann Werte annehmen bis ...',
'Die WHILE-Schleife erlaubt die wiederholte Ausführung
einer Anweisungsfolge ...',
'Mit der Modulo-Division MOD wird ...',
'Mit der Anweisung EXIT können Sie ...',
'Mit der Anweisung RETURN wird ...',
'Unterprogramme werden im Hauptprogramm ...',
'Anwenderdefinierte Datentypen (DUT) setzt sich aus ...',
'Bei TIME und TIME_OF_DAY wird die Zeit in ...',
'Eine Funktion ist ein Codebaustein ohne ...',
'Der Parameter, der dem "PT" der Instanz vom
TON übergeben wird, ist vom Datentyp',
'Der GRAFCET ist eine ...',
'R_TRIG ist ein Systemfunktionsbaustein; er erzeugt bei
einer ...',
'Um Bausteine aus einer Bibliothek benutzen zu können,
muss ...';
Antwort:ARRAY[1..17] OF STRING:=
'Freilaufend zyklisch.',
'der Doppelpunkt und das Gleichheitszeichen.',
'dem Datentyp der Variablen.',
'Schlüsselwörter.',
'255.',
'unter Kontrolle einer Durchführungsbedingung am Anfang
der Schleife.',
'der Rest der Division ermittelt.',
'eine Schleife verlassen.',
'der Software-Baustein (POE) ohne Bedingung verlassen.',
'nacheinander aufgerufen.',
'Standard-Datentypen zusammen.',
'Millisekunden angegeben, wobei bei TOD ab 00:00 Uhr
gerechnet wird.',
'Gedächtnis mit einem Rückgabewert.',
'TIME.',
'Spezifikationssprache für Ablaufsteuerungen',
'positiven Flanke am CLK-Parameter einen Zyklus lang am Q
den Wert TRUE.',
'die Bibliothek im Projekt über die
Bibliotheksverwaltung eingebunden werden.';
S1Visu, S2Visu:BOOL; Zufallszahl:USINT; sFrage, sAntwort:STRING;
END_VAR
IF S1Visu THEN
Zufallszahl:= FC_ZUFALLSZAHL(usiAnzahl:= 17) ;
sFrage:=Frage[Zufallszahl];
sAntwort:='';
END_IF;
IF S2Visu THEN
sAntwort:=Antwort[Zufallszahl];
END_IF;
FUNCTION FC_ZUFALLSZAHL
: USINT
(*Zahl 1...usiAnzahl erzeugen*)
VAR_INPUT
usiAnzahl:USINT;
END_VAR;
VAR
usiZufallszahl: USINT;
END_VAR
WHILE usiZufallszahl
< 1 OR usiZufallszahl > usiAnzahl DO
usiZufallszahl:= REAL_TO_USINT( RDM(last:= 0.0 ) *10.0);
END_WHILE;
FC_ZUFALLSZAHL:= usiZufallszahl;
|