Skip to main content

Beispiel: Erste Schritte

Produkt: CODESYS Application Composer

Dieses Beispiel zeigt die ersten Schritte, wie Sie Module für den CODESYS Application Composer erstellen und verwenden. Dabei werden Sie einen Raum mit Lichtern und Schaltern realisieren.

Beschreibung

In dem Beispiel wird ein kleines Szenario aus der Gebäudeautomatisierung umgesetzt: Ein Raum soll mit Lichtern und den zugehörigen Schaltern ausgestattet werden. Die Schalter können dabei auch als Dimmer verwendet werden. Weiterhin sollen die Lichter verschiedene Helligkeitsstufen annehmen können.

  1. Vorbereitende Arbeiten

    Erzeugen Sie ein neues CODESYS-Projekt aus der Vorlage Standard Projekt mit Application Composer. Wählen Sie als Bibliothek AC_ModuleBase.

    _ex_ac_img_first_steps1.png
  2. Das Toplevel-Modul Room

    Fügen Sie eine neue Moduldeklaration in den POU-Pool des Projekts ein. Geben Sie der Moduldeklaration und dem zugehörigen Funktionsbaustein den Namen Room. Der Funktionsbaustein muss zudem den Funktionsbaustein AC.Module erweitern, der in der Bibliothek AC_ModuleBase definiert ist. Der Funktionsbaustein AC.Module stellt bereits zahlreiche Methoden und Eigenschaften zur Verfügung, die nicht überschrieben werden müssen.

    _ex_ac_img_first_steps2.png

    Die Deklaration beginnt mit dem Schlüsselwort MODULE gefolgt von dem Modulnamen und dem weiteren Schlüsselwort IMPLEMENTED_BY sowie dem Funktionsbaustein, der das Modul implementiert. Dieser Funktionsbaustein ist im konkreten Fall der eben erstellte Funktionsbaustein Room. In den meisten Fällen wird nun die Sektion MetaData deklariert.

    Für detaillierte Informationen zu allen Parametern und Sektionen siehe: Moduleditor.

    Da das Modul Room in unserem Beispiel ein Toplevel-Modul ist, deklarieren Sie als nächstes die Sektion Toplevel. In dieser Sektion definieren Sie einen Namen für die globale Variablenliste, der den Instanznamen des Toplevel-Funktionsbausteins nach der Generierung enthält. Danach müssen Sie noch mindestens eine Task in der Sektion Toplevel definieren. Diese Task ist in diesem Beispiel Standard_Task. Sie ist als MEDIUM-Task definiert und enthält die Flags CREATE_IF_MISSING und UPDATE_IOS.

    _ex_ac_img_first_steps3.png

    Alle Icons und Texte, die als Platzhalter für die Beschreibungen und Icons verwendet werden (Parameter Desc, Icon_16 und Icon_32) müssen in Textlisten und Bildersammlungen abgelegt sein. Deshalb legen Sie eine entsprechende Textliste TL und eine Bildersammlung IP im POU-Pool an, die die referenzierten Icons und Texte enthalten.

  3. Das Submodul Switch

    Erstellen Sie eine Moduldeklaration und einen zugehörigen Funktionsbaustein mit dem Namen Switch. Dieses Modul stellt kein Toplevel-Modul dar und benötigt deshalb keine Sektion Toplevel. Auch der Funktionsbaustein Switch muss, wie alle Funktionsbausteine, die Module darstellen, AC.Module erweitern. Außerdem implementiert Switch die Schnittstelle ISwitch, die Sie ebenfalls erzeugen müssen. Die Schnittstelle ISwitch wiederum erweitert AC.IModule, fügt diesem allerdings keine neuen Methoden oder Eigenschaften hinzu.

    Weiterhin benötigt der Schalter ein Eingangssignal, um zu erkennen, wann er gedrückt ist. Dieses Signal deklarieren Sie in der Sektion IO, wobei Sie die Eingangsvariable xIn des Funktionsbausteins Switch verwenden. Des Weiteren benötigen Sie eine Referenzzeit, um die beiden Funktionen des Schalters zu unterscheiden: Das Drücken des Schalters für die Zeitdauer tTimer startet die Dimm-Funktion - bei einem kürzeren Drücken wird das Licht nur ein- oder ausgeschaltet. Die Eingangsvariable tTimer definieren Sie als Parameter des Moduls (Sektion Parameter). Somit können Sie die Zeit später einfach bei der Verwendung der Module einstellen.

    Die Variablen xIn und tTimer deklarieren Sie als Eingänge des Funktionsbausteins Switch, wobei Sie beim Parameter tTimer einen Initialisierungswert von 500 ms einstellen.

    _ex_ac_img_first_steps4.png

    Die Textliste und Bildersammlung müssen Sie ebenfalls erweitern, um die Beschreibungen anzeigen zu können.

  4. Das Submodul SwitchSimple

    Das zweite Schaltermodul, das Sie erstellen, ist ein einfacher Schalter mit nur zwei Zuständen: Ein oder Aus. Dazu müssen Sie eine Moduldeklaration und einen Funktionsbaustein erzeugen, die sich vom bereits vorhandenen Schalter nur in folgenden Punkten unterscheiden: Der Parameter und die Variable tTimer werden nicht benötigt. Außerdem implementieren Sie nicht ISwitch sondern ISwitchSimple, das ebenfalls AC.IModule erweitert.

    _ex_ac_img_first_steps5.png
  5. Das Submodul Light

    Wie zuvor für die Schalter müssen Sie auch für das Licht eine Moduldeklaration Light mit Funktionsbaustein Light und Schnittstelle ILight angelegen.

    Damit Sie das Modul Light unterhalb eines Raums einfügen können, müssen Sie die Moduldeklaration von Light um die Sektion Slots erweitern. In dieser Sektion deklarieren Sie eine Untersektion Slot_Multi, die Sie Lights nennen und die die Module des Typs ILight aufnehmen kann. Die Anzahl der Lichter, die zu einem Raum hinzugefügt werden müssen oder können, geben Sie durch Cardinality an. Weiterhin definieren Sie die Variablen Variable und Var_Count und verknüpfen diese mit der Moduldeklaration pLights(POINTER TO ILight) und uiNumberOfLights (UINT). Somit gewährleisten Sie, dass nur Module zum Slot Lights hinzugefügt werden können, deren Funktionsbausteine die Schnittstelle ILight implementieren.

    _ex_ac_img_first_steps6.png

    Beim Modul Light definieren Sie ebenfalls einen Slot, an dem ein Schalter eingefügt werden kann. Somit müssen Sie der Moduldeklaration von Light einen Slot Switch hinzufügen. Die zusätzlichen Parameter des Moduls Light sind die Geschwindigkeit des Dimmers rSpeed und die maximale Helligkeit uiMaxValue. Abschließend müssen Sie noch einen Ausgang definieren, der die Helligkeit des Lichts repräsentiert. Alle Parameter, Slots und Ausgänge müssen Sie auch als Variablen zum Funktionsbaustein Light hinzufügen.

    _ex_ac_img_first_steps7.png
  6. Das Submodul LightSimple

    Als letztes Modul erstellen Sie ein vereinfachtes Licht, das mit dem einfachen Schalter arbeitet. Dazu benötigen Sie eine Moduldeklaration und einen Funktionsbaustein LightSimple, der AC.Module erweitert und die bereits vorhandene Schnittstelle ILight implementiert. Die Unterschiede zum Modul Light sind Folgende: Der Ausgang soll vom Typ BOOL sein und den Namen xSwitchedOn haben. Außerdem wird der Parameter rSpeed nicht benötigt.

    _ex_ac_img_first_steps8.png
  7. Implementierung

    Für die Implementierung der Funktion für das Modul Switch verwenden Sie die Methode CallPrioMediumStart von AC.Module und überschreiben diese mit einer eigenen Implementierung. Diese Funktion wird gewählt, da das Toplevel-Modul Room eine Task MEDIUM deklariert. Das bedeutet, dass die Methode CallPrioMediumStart des Funktionsbausteins Switch automatisch in jedem Zyklus der Task aufgerufen wird. Die Hauptfunktion des Schalters ist die Unterscheidung zwischen Schalten und Dimmen. Nach dem Drücken des Schalters startet ein Timer mit einer Zeit, die durch Anwenderparameter vorgegeben werden kann. Wenn der Timer abgelaufen ist und der Schalter immer noch gedrückt ist, wird die Dimmerfunktion verwendet, was durch die Variable xPushLong angezeigt wird. Die Variable xPush wird TRUE, wenn der Schalter nur kurz gedrückt wird. Für beide Variablen xPushLong und xPush werden sowohl im Funktionsbaustein Switch als auch in der Schnittstelle Eigenschaften hinzugefügt, so dass sie vom Eltern-Lichtfunktionsbaustein benutzt werden können.

    Auch der Funktionsbaustein Light überschreibt die Methode CallPrioMediumStart. Abhängig vom Wert der zugehörigen Eingangsvariablen wird das Licht auf „An" oder „Aus" gedimmt oder einfach nur geschaltet. Für den Dimmer wird der Geschwindigkeitswert des deklarierten Parameters rSpeed verwendet. Nach Erreichen des Maximum oder Minimum des Dimmwerts wird das Dimmen beendet. Wenn das Licht in einem gedimmten Zustand ist und der Schalter gedrückt wird, wird das Licht ausgeschaltet.

    Eine mögliche Implementierung können Sie dem Beispielprojekt entnehmen.

  8. Das Konfektionieren

    Das Erstellen des Modulbaums nehmen Sie in der Ansicht Module vor. Dazu fügen Sie, nach dem Einlesen der Module, zunächst das Toplevel-Modul Room zum Modulbaum hinzu. Im Slot Lights fügen Sie je ein Light und ein LightSimple hinzu, denen Sie jeweils einen Switch oder ein SwitchSimple zuordnen. Danach können Sie die Parameter und E/As der Modulinstanzen einstellen. Zum Testen bietet es sich an, die Ein- und Ausgänge mit Variablen einer globalen Variablenliste zu verknüpfen.

    Zum Schluss erzeugen Sie das Projekt mit dem Befehl ComposerErzeugen. Nach dem Download auf ein Gerät können Sie das Beispiel nach Belieben testen. Hierbei können Sie auch die Zusammenstellung des Raums variieren, ohne dass der Code oder die Module angefasst werden müssen. Und auch die Werte der Parameter der Modulinstanzen können Sie ändern und deren Auswirkungen überprüfen. Das Ändern der Parameterwerte kann sowohl offline als auch online erfolgen.

    _ex_ac_img_first_steps9.png

Systemvoraussetzungen und Einschränkungen

Programmiersystem

CODESYS Development System Version 3.5.17.0 oder höher

Laufzeitsystem

CODESYS Control Win Version 3.5.17.0

Zusatzkomponenten

CODESYS Application Composer

Hinweis

_example_icon.png DOWNLOAD Projekte