Im Projekt die Steuerungsapplikation programmieren
Deklarieren der globalen Variablen
Deklarieren Sie zunächst die Variablen, die Sie in der gesamten Applikation verwenden wollen. Dazu legen Sie unter Application eine Globale Variablenliste an:
Selektieren Sie den Eintrag
Application
und wählen im Kontextmenü den Befehl . Ändern Sie den automatisch eingetragenen NamenGVL
zuGlob_Var
und bestätigen Sie mit Hinzufügen.Unter
Application
erscheint das ObjektGlob_Var
. Der GVL-Editor öffnet rechts vom Gerätebaum.Wenn die textuelle Ansicht erscheint, sind die Schlüsselwörter
VAR_GLOBAL
undEND_VAR
bereits enthalten. Aktivieren Sie für unser Beispiel mit einem Klick auf die Schaltflächein der rechten Randleiste des Editors die tabellarische Ansicht.
Eine leere Zeile erscheint. Der Cursor ist in der Spalte Name.
Wählen Sie im Kontextmenü den Befehl Einfügen.
Ein Eingabefeld öffnet sich. Gleichzeitig werden in der Zeile automatisch der Gültigkeitsbereich
VAR_GLOBAL
und der DatentypBOOL
eingetragen.Tippen Sie
rTempActual
im Feld Name ein.Doppelklicken Sie in das Feld in der Spalte Datentyp.
Das Feld ist jetzt editierbar und die Schaltfläche
erscheint.
Klicken Sie auf die Schaltfläche
und wählen Sie Eingabehilfe.
Der Dialog Eingabehilfe öffnet sich.
Wählen Sie den Datentyp
REAL
aus und klicken Sie auf die Schaltfläche OK.Geben Sie einen numerischen Wert in der Spalte Initialisierung ein, beispielsweise
8.0
.
Deklarieren Sie die folgenden Variablen auf gleiche Weise:
Name | Datentyp | Initialisierung | Kommentar |
---|---|---|---|
|
|
| Isttemperatur |
|
|
| Solltemperatur |
|
|
| Status Tür |
|
|
| Kompressorlaufzeit, nach der ein Signal ertönt |
|
|
| Zeit ab Türöffnung, nach der ein Signal ertönt |
|
|
| Steuersignal |
|
|
| Steuersignal |
|
|
| Statusmeldung |
Hauptprogramm zur Kühlungssteuerung im CFC-Editor erstellen
Im standardmäßig angelegten Hauptprogrammbaustein PLC_PRG
beschreiben Sie nun die Hauptfunktion des Applikationsprogramms: Der Kompressor wird aktiv und kühlt, wenn die Isttemperatur höher ist als die Solltemperatur zuzüglich einer Hysterese. Der Kompressor wird ausgeschaltet, sobald die Isttemperatur niedriger ist als die Solltemperatur abzüglich der Hysterese.
Um diese Funktionalität in der Implementierungssprache CFC zu beschreiben, führen Sie folgende Schritte aus:
Doppelklicken Sie auf
PLC_PRG
im Gerätebaum.Der CFC-Editor öffnet sich mit der Registerkarte
PLC_PRG
. Oberhalb des grafischen Editorbereichs erscheint der Deklarationseditor in textueller oder tabellarischer Darstellung. Rechts ist das Fenster Werkzeuge.Klicken Sie im Fenster Werkzeuge auf das Element Eingang und ziehen Sie es mit der Maus in den CFC-Editor unter die Registerkarte
PLC_PRG
.Der namenlose Eingang
???
wurde eingefügt.Klicken Sie im CFC-Editor bei dem Eingang auf
???
und öffnen Sie dann mit einem Klick aufdie Eingabehilfe. Wählen Sie aus der Kategorie Variablen unter die Variable
rTempActual
aus. So referenzieren Sie hier die globale VariablerTempActual
.Der Eingangsname ist
Glob_Var.rTempActual
.Legen Sie wie bei 3. einen weiteren Eingang mit dem Namen der globalen Variable
Glob_Var.rTempSet
an.Legen Sie einen weiteren Eingang an, klicken Sie auf die drei Fragezeichen
???
und ersetzen Sie diese mit dem NamenrHysteresis
.Weil dies nicht der Name einer bereits bekannten Variablen ist, erscheint der Dialog Variable deklarieren. Der Name ist bereits in den Dialog übernommen.
Füllen Sie die Felder im Dialog Variable deklarieren mit dem Datentyp
REAL
und dem Initialisierungswert1
aus. Klicken Sie auf die Schaltfläche OK.Die Variable
rHysteresis
erscheint im Deklarationseditor.Nun fügen Sie einen Additionsbaustein ein: Klicken Sie im Fenster Werkzeuge auf das Element Baustein und ziehen Sie es mit der Maus unterhalb der Registerkarte PLC_PRG in den CFC-Editor.
Der Baustein erscheint im CFC-Editor.
Ersetzen Sie
???
mitADD
.Der Baustein addiert alle Eingänge, die mit ihm verbunden sind.
Verbinden Sie den Eingang
Glob_Var.rTempSet
mit dem BausteinADD
. Klicken Sie dazu auf den Ausgangspin des Eingangs und ziehen Sie Ihn bis zum oberen Eingangspin des BausteinsADD
.Verbinden Sie auf die gleiche Weise den Eingang
rHysteresis
mit dem unteren Eingang des BausteinsADD
.Die beiden Eingänge
rHysteresis
undGlob_Var.rTempSet
werden nun vonADD
addiert.Wenn Sie ein Element im Editor verschieben möchten, klicken Sie auf eine freie Stelle im Element oder auf den Rahmen, so dass das Element selektiert ist (roter Rahmen, rot schattiert). Lassen Sie die Maustaste gedrückt und ziehen Sie das Element an die gewünschte Position.
Legen Sie einen weiteren Baustein rechts vom Baustein
ADD
an. Er sollGlob_Var.rTempActual
mit der Summe ausGlob_Var.rTempSet
+rHysteresis
vergleichen. Geben Sie dem Baustein die FunktionGT
(Greater Than).Der
GT
-Baustein arbeitet folgendermaßen:IF (oberer Eingang > unterer Eingang) THEN Ausgang := TRUE;
Verbinden Sie den Eingang
Glob_Var.rTempActual
mit dem oberen Eingang des BausteinsGT
.Verbinden Sie den Ausgang des Bausteins
ADD
mit dem unteren Eingang des BausteinsGT
.Erzeugen Sie nun mit dem Bausteinelement einen Funktionsbaustein rechts vom Baustein
GT
an, der den Kühlkompressor je nach Eingangsbedingung startet oder stoppt (Set - Reset). Tippen Sie im Feld???
den NamenSR
ein. Schließen Sie das geöffnete Eingabefeld oberhalb des Bausteins (SR_0
) mit der Eingabetaste.Der Dialog Variable deklarieren erscheint.
Deklarieren Sie die Variable mit dem Namen
SR_0
und dem DatentypSR
. Klicken Sie auf die Schaltfläche OK.Der Baustein
SR
aus der BibliothekStandard
ist instanziert.SR
dient der Definition desTHEN
am Ausgang des GT-Bausteins. Die EingängeSET1
undRESET
erscheinen.Verbinden Sie die Ausgangsverbindung rechts am Baustein
GT
mit dem EingangSET1
des BausteinsSR_0
.SR
kann eine boolesche Variable vonFALSE
aufTRUE
und wieder zurück setzen. Wenn die Bedingung am EingangSET1
zutrifft, wird die boolesche Variable aufTRUE
gesetzt. Trifft die Bedingung anRESET
zu , wird die Variable wieder zurückgesetzt. Die boolesche (globale) Variable ist in unserem BeispielGlob_Var.xCompressor
.Legen Sie ein Element Ausgang an und weisen Sie ihm die globale Variable
Glob_Var.xCompressor
zu. Ziehen Sie eine Verbindungslinie zwischenGlob_Var.xCompressor
und AusgangsverbindungQ1
vonSR
.
Jetzt geben Sie an, unter welcher Bedingung sich der Kompressor wieder abschalten soll, also der RESET
-Eingang des SR-Bausteins ein TRUE
-Signal erhält. Dazu formulieren Sie die gegenteilige Bedingung wie oben. Verwenden Sie dazu die Bausteine SUB
(Subtract) und LT
(Less Than).
Letztendlich entsteht folgender CFC-Plan:

Erstellen eines Programmbausteins zur Signalverwaltung im Kontaktplan-Editor
Sie implementieren nun in einem weiteren Programmbaustein die Signalverwaltung für den Alarmtongeber und für das Ein- und Ausschalten der Lampe. Dafür eignet sich die Implementierungssprache Kontaktplan (KOP).
Behandeln Sie die folgenden Signale jeweils in einem eigenen Netzwerk:
Wenn der Kompressor zu lange läuft, weil die Temperatur zu hoch ist, macht ein durchgehendes akustisches Signal darauf aufmerksam.
Wenn die Türe zu lange geöffnet ist, macht ein getaktetes Signal darauf aufmerksam.
Solange die Türe geöffnet ist, brennt das Licht.
Rechtsklicken Sie im Gerätebaum auf das Objekts
Application
und fügen Sie ein POU-Objekt des Typs Programm mit der Implementierungssprache Kontaktplan (KOP2) ein.Benennen Sie das Programm
Signals
.Das Programm
Signals
erscheint im Gerätebaum nebenPLC_PRG
. Der Kontaktplan-Editor öffnet mit der RegisterkarteSignals
. Im oberen Teil erscheint der Deklarationseditor, rechts das Fenster Werkzeuge. Der Kontaktplan enthält ein leeres Netzwerk.Im Netzwerk programmieren Sie, dass ein akustisches Signal ertönt, wenn der Kühlkompressor zu lange läuft, ohne die Solltemperatur zu erreichen. Hierzu fügen Sie in den nächsten Schritten einen Timer-Baustein
TON
ein. Er schaltet ein boolesches Signal nach einer vorgegebenen Zeit aufTRUE
.Wählen Sie in der Ansicht Werkzeuge das Element Baustein aus und ziehen Sie es mit der Maus ins leere Netzwerk auf eine angebotene Einfügeposition und lassen Sie die Maustaste los.
Der Baustein erscheint als Rechteck mit Ein- und Ausgängen.
Doppelklicken Sie die 3 Fragezeichen
???
in dem Baustein und klicken Sie im Zeileneditor auf das Symbol.
Der Dialog Eingabehilfe öffnet sich.
Wählen Sie im Dialog Eingabehilfe aus der Kategorie Standard-Funktionsbausteine aus der Bibliothek Standard den Timer
TON
aus und klicken Sie auf OK.Drücken Sie nun im Zeileneditor des Bausteins, der jetzt den Funktionsbausteinnamen
TON
anzeigt, die Eingabetaste.Der Baustein
TON
wird mit seinen Ein- und Ausgängen angezeigt.Um den Eingang
EN
und den AusgangENO
zu entfernen, selektieren Sie den Baustein und wählen Sie im Kontextemenü die Befehle EN/ENO → EN.Der Baustein hat jetzt nur noch die Eingänge
IN
undPT
und die AusgängeQ
undET
.Doppelklicken Sie auf die drei Fragezeichen [???] direkt über dem Baustein, geben Sie als Instanzname
TON_0
ein und drücken Sie die Eingabetaste.Sie haben den Instanznamen bestätigt und der Dialog Variable deklarieren öffnet sich.
Bestätigen Sie den Dialog mit OK.
Der eingefügte Baustein
TON
ist nun mit dem NamenTON_0
instanziert.Programmieren Sie, dass der Baustein aktiviert wird, sobald der Kühlkompressor zu laufen beginnt: Ziehen Sie zunächst aus der Ansicht Werkzeuge das Kontaktplan-Element
Kontakt
vor den EingangIN
des Bausteins. Doppelklicken Sie die drei Fragezeichen und klicken Sie im Zeileneditor auf das Symbol. In der Eingabehilfe wählen Sie nun die bereits deklarierte globale Variable xCompressor aus und klicken Sie auf OK.
Über dem Kontakt wird der Variablenname
Glob_Var.xCompressor
angezeigt.Tipp
Wenn Sie beginnen, an der Eingabeposition einen Variablennamen einzugeben, erhalten Sie immer automatisch eine Liste aller Variablen, deren Namen mit den eingetippten Zeichen beginnen und die an dieser Stelle verwendbar sind. Diese Unterstützung ist eine Standardeinstellung in den CODESYS-Optionen für Intelligentes Codieren.
Fügen Sie das Signal ein, das aktiviert werden soll. Ziehen Sie dazu aus der Ansicht Werkzeuge, Kategorie Kontaktplan eine Spule an den Ausgang
Q
desTON
-Bausteins. Benennen Sie die Spule mitGlob_Var.xSignal
.Definieren Sie die Zeit ab Aktivierung des
TON_0
-Bausteins, nach der das Signal ertönen soll: Diese Definition erfolgt über die VariableGlob_Var.timAlarmThreshold
, die Sie zu diesem Zweck am EingangPT
vonTON_0
einfügen. Dazu bewegen Sie den Mauszeiger an das linke Ende der Eingangsverbindung des EingangsPT
. Klicken Sie auf das fein umrandete Rechteck, das nun links der Eingangsverbindung angezeigt wird und geben Sie den Variablennamen ein.Drücken Sie die Eingabetaste.
Der Dialog Variable deklarieren öffnet sich.
Bestätigen Sie den Dialog mit OK.
Die neu deklarierte Variable wid im Deklarationsteil angezeigt.
Rechtsklicken Sie auf den
TON
-Baustein und wählen Sie im Kontextmenü den Befehl Nicht verwendete Pins entfernen.Der nicht verwendete Ausgang
ET
ist entfernt.Im zweiten Netzwerk des KOP programmieren Sie, dass das Signal getaktet ertönen soll, wenn die Türe zu lange geöffnet ist.
Ziehen Sie mit der Maus aus der Ansicht Werkzeuge ein Element Netzwerk an die Einfügestelle unterhalb von Netzwerk 1.
Ein leeres Netzwerk mit Nummer 2 erscheint.
Implementieren Sie wie im ersten Netzwerk einen
TON
-Baustein zur zeitgesteuerten Aktivierung des Signals, diesmal getriggert durch die globale VariableGlob_Var.xDoorOpen
am EingangIN
. Am EingangPT
fügen Sie die globale VariableGlob_Var.timDoorOpenThreshold
hinzu.Fügen Sie in diesem Netzwerk an Ausgang
Q
desTON
-Bausteins einenBLINK
-Baustein aus der BibliothekUtil
ein und instanzieren Sie ihn mit dem NamenBlink_0
.Der Baustein
BLINK_0
taktet die SignalweiterleitungQ
und damitGlob_Var.xSignal
.Ziehen Sie hierfür zunächst 2 Elemente Kontakt aus der Ansicht Werkzeuge an den Ausgang
OUT
des Bausteins. Weisen Sie dem Kontakt direkt hinter dem AusgangQ
die VariableTON_1.Q
und dem zweiten Kontakt die globale VariableGlob_Var.xDoorOpen
zu.Hinter die beiden Kontakte fügen Sie ein Element Spule ein und weisen Sie ihr die globale Variable
Glob_Var.xSignal
zu.Deklarieren Sie die lokale Variable
timSignalTime : TIME := T#1S;
und fügen Sie diese Variable an den EingängenTIMELOW
undTIMEHIGH
ein; die Taktdauer ist somit jeweils 1 Sekunde fürTRUE
und 1 Sekunde fürFALSE
.Rechtsklicken Sie auf den
TON
-Baustein und wählen Sie im Kontextmenü den Befehl Nicht verwendete Pins entfernen.Der nicht verwendete Ausgang
ET
ist entfernt.Im dritten Netzwerk programmieren Sie, dass die Lampe leuchtet, solange die Tür geöffnet ist. Fügen Sie dazu ein weiteres Netzwerk und einen Kontakt ein. Weisen Sie dem Kontakt die Variable
GlobVar.xDoorOpen
zu.Der eingefügte Kontakt leitet direkt auf eine Spule. Fügen Sie hierzu rechts vom Kontakt eine Spule hinzu und und weisen Sie der Spule die globale Variable
Glob_Var.xLamp
zu.CODESYS arbeitet die Netzwerke eines KOP nacheinander ab. Um zu erreichen, dass nur Netzwerk 1 oder nur Netzwerk 2 ausgeführt werden, bauen Sie jetzt am Ende von Netzwerk 1 noch einen Sprung zu Netzwerk 3 ein:
Wenn Sie im Netzwerk 3 den Mauszeiger auf die 3. Zeile im linken oberen Rand des Netzwerks halten, wird die Information <Sprungmarke hier einfügen> angezeigt. Doppelklicken Sie diese Position und geben Sie im Zeileneditor als Sprungmarke DoorIsOpen: ein.
Selektieren Sie das Netzwerk 1. Ziehen Sie aus der Ansicht Werkzeuge, Kategorie Kontaktplan das Element Sprung an die mit einem Dreieck gekennzeichnete Einfügeposition vor der Spule
Glob_Var.xSignal
.Das Sprungelement erscheint. Das Sprungziel ist noch mit
???
angegeben.Doppelklicken Sie die drei Fragezeichen [???] und klicken Sie im Zeileneditor auf das Symbol
. Wählen Sie im Dialog Eingabehilfe aus den möglichen Bezeichnern von Sprungmarken
DoorIsOpen
aus und bestätigen Sie mit OK.Die Sprungmarke zu Netzwerk 3 ist implementiert.
Das KOP-Programm sieht nun folgendermaßen aus:

Aufrufen des Programms "Signals" im Hauptprogramm
In unserem Programmbeispiel soll das Hauptprogramm PLC_PRG
das Programm Signals
zur Signalverarbeitung aufrufen.
Doppelklicken Sie im Gerätebaum auf
PLC_PRG
.Das Programm
PLC_PRG
öffnet sich im Editor.Ziehen Sie ein Element Baustein aus Ansicht Werkzeuge in den Editor von
PLC_PRG
.Doppelklicken Sie die drei Fragezeichen [???] und klicken Sie im Zeileneditor auf das Symbol
. Wählen Sie im Dialog Eingabehilfe aus in der Kategorie POU- /Programm- und Funktionsaufrufe das Programm
Signals
aus und bestätigen Sie mit OK.
Erstellen eines ST-Programmbausteins für eine Simulation
Da die Applikation dieses Beispielprojekts nicht mit realen Sensoren und Aktoren verknüpft ist, schreiben Sie nun noch ein Programm zur Simulation von Temperaturanstieg und Temperatursenkung. Damit können Sie nachher das Arbeiten der Kühlschranksteuerung im Onlinebetrieb beobachten.
Sie erstellen das Simulationsprogramm in Strukturiertem Text.
Das Programm erhöht die Temperatur solange, bis das Hauptprogramm PLC_PRG
feststellt, dass die Solltemperatur überschritten ist und den Kühlkompressor aktiviert. Daraufhin senkt das Simulationsprogramm die Temperatur wieder, bis das Hauptprogramm den Kompressor wieder deaktiviert.
Rechtsklicken Sie im Gerätebau auf Applikation und fügen Sie einen POU-Baustein des Typs Programm und der Implementierungssprache ST ein. Benennen Sie den Baustein
Simulation
.Implementieren Sie Folgendes im ST-Editor :
Deklarationsteil:
PROGRAM Simulation VAR TON_1: TON; //The temperature is decreased on a time delay, when the comepressor has been activated P_Cooling: TIME:=T#500MS; xReduceTemp: BOOL; //Signal for dereasing the temperature TON_2: TON; //The temperature is increased on a time delay P_Environment: TIME:=T#2S; //Delay time when the door is closed P_EnvironmentDoorOpen: TIME:=T#1S; //Delay time when the door is open xRaiseTemp: BOOL; //Signal for increasing the temperature timTemp: TIME; //Delay time iCounter: INT; END_VAR
Implementierungsteil:
iCounter := iCounter + 1; // No function, just for demonstration purposes. // After the compressor has been activated due to TempActual being too high, the temperature decreases. // The temperature is decremented by 0.1°C per cycle after a delay of P_Cooling IF Glob_VAR.xCompressor THEN TON_1(IN:= Glob_Var.xCompressor, PT:= P_Cooling, Q=>xReduceTemp); IF xReduceTemp THEN Glob_Var.rTempActual := Glob_Var.rTempActual-0.1; TON_1(IN:=FALSE); END_IF END_IF //If the door is open, the warming occurs faster; SEL selects P_EnvironmentDoorOpen timTemp:=SEL(Glob_Var.xDoorOpen, P_Environment, P_EnvironmentDoorOpen); //If the compressor is not in operation, then the cooling chamber becomes warmer. //The temperature is incremented by 0.1°C per cycle after a delay of tTemp TON_2(IN:= TRUE, PT:= timTemp, Q=>xRaiseTemp); IF xRaiseTemp THEN Glob_Var.rTempActual := Glob_Var.rTempActual + 0.1; TON_2(IN:=FALSE); END_IF
Tipp
Für ein komfortables Bedienen und Beobachten des gesamten Steuerungsprogramms empfiehlt sich der Einsatz einer Visualisierung. Im fertigen Beispielprojekt zum vorliegenden Tutorial, das mit der CODESYS-Standardinstallation (Verzeichnis Projekte
) bereitgestellt wird, ist eine mit CODESYS Visualization erstellte Visualisierung eingebaut. Sie können dieses Projekt auf die Steuerung laden und starten, um es zusammen mit der Visualisierung in Funktion zu sehen. Beim Start wird die Live_Visu
mit einer Darstellung des Kühlschranks gestartet, die das Arbeiten des Simulationsprogramms wiedergibt, ohne dass Sie eine Eingabe vornehmen müssen. Sie können allerdings über einen Mausklick auf den Ein/Aus-Schalter das Tür-Öffnen und Tür-Schließen herbeiführen, und auch ein Verstellen der Temperaturvorwahl über die Nadel des Drehreglers ist möglich. Wir gehen im Rahmen dieses Tutorials hier nicht auf die Erstellung der Visualisierung ein. Ein entsprechendes Tutorial im Rahmen der Hilfe zu CODESYS Visualization ist geplant.
Festlegen der auszuführenden Programme in der Taskkonfiguration
Die voreingestellte Taskkonfiguration enthält den Aufruf für das Hauptprogramm PLC_PRG
. Für unser Beispielprojekt müssen Sie noch den Aufruf für das Programm Simulation
hinzufügen.
Ziehen Sie im Gerätebaum den Eintrag
Simulation
mit der Maus aufMainTask
unter der Taskkonfiguration.Das Programm
Simulation
ist in der Taskkonfiguration eingefügt.Wenn Sie sich die Taskkonfiguration ansehen möchten, doppelklicken Sie auf den Eintrag
MainTask
, um den Editor zu öffnen.Sie sehen in der Tabelle im unteren Teil des Editors die POUs, die von der Task aufgerufen werden:
PLC_PRG
(standardmäßig eingetragen) undSimulation
. Der Aufruftyp der Task ist Zyklisch im Intervall von 20 Millisekunden. Im Onlinebetrieb wird die Task pro Zyklus 1x die beiden Bausteine abarbeiten.
Definieren der „Aktiven Applikation“ für die Kommunikation mit der SPS
Der Name der Applikation Application
ist im Fenster Geräte fett dargestellt. Das bedeutet, dass diese Applikation als „aktive Applikation“ gesetzt wurde. Die Kommunikation mit der Steuerung bezieht sich dann auf diese Applikation.
Wenn es in einem Projekt nur eine Applikation gibt, wird sie automatisch zur aktiven Applikation. Wenn Ihre Applikation noch nicht aktiv ist, aktivieren Sie sie folgendermaßen:
Klicken Sie mit der rechten Maustaste auf
Application
und wählen Sie im Kontextmenü den Befehl Aktive Applikation setzen.Die Applikation Application wird in der Ansicht Geräte jetzt fett dargestellt.
Überprüfen des Applikationsprogramms auf Fehler
Während der Eingabe von Code weist CODESYS Sie sofort durch rote Unterkringelung auf Syntaxfehler hin. Die Ergebnisse der Prüfung sehen Sie auch im Meldungsfenster. Wenn nötig, öffnen Sie das Meldungsfenster mit dem Befehl . Die Meldungen werden der Meldungskategorie Vorkompilierung angezeigt. Sie können eine Meldung selektieren und mit Taste F4 zur entsprechenden Codestelle springen. Weitere Prüfungen des Applikationsprogramms werden dann durchgeführt, wenn die Applikation auf die Steuerung geladen wird.
Nur eine fehlerfreie Applikation können Sie nachher auf die Steuerung laden.