SPS- Programmierung mit ST

nach IEC 61131 mit CODESYS V2.3, CODESYS V3, e!COCKPIT

Lösungen Kapitel 11   Bibliotheken verwenden für CODESYS V2.3 (WAGO I/O Pro)

  Kopieren Sie den Programmcode und fügen Sie diesen in Ihre Entwicklungsumgebung ein.
  

 Aufgabe 11.3     Übung 11.1   Übung 11.2   Übung 11.3
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.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;
  

Ü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;


© Vogel Buchverlag