Skip to main content

Beispiel: AC Module Teaching

Produkt: CODESYS Application Composer

Dieses Beispiel zeigt die Erstellung und Verwendung von anlernbaren Modulen am Beispiel einer einfachen Lichtsteuerung.

Beschreibung

Der CODESYS Application Composer bietet die Möglichkeit zur modularen Konfiguration einer Applikation. Wenn die Struktur einmal im Modulbaum festgelegt ist, wird daraus eine statische IEC-Applikation generiert. Dabei werden die Module direkt mit ihren Submodulen verbunden und können so zur Laufzeit nicht geändert werden.

Dieses Beispiel zeigt, wie aus einem Pool von losen Modulen eine dynamische Konfiguration zur Laufzeit erzeugt werden kann.

Zusätzlich wird diese Konfiguration persistent abgespeichert, damit bei jedem neuen Start der Applikation die zuletzt eingestellte Konfiguration geladen wird.

Sie können die beiliegende Bibliothek ohne Änderungen verwenden, während das Projekt lediglich einen möglichen Anwendungsfall dieser Bibliothek aufzeigt. Alle nötigen Anpassungen wurden im Code durch Kommentare mit dem Stichwort AC_ModuleTeaching markiert.

Weitere Informationen

Architektur

Die Idee der anlernbaren Module basiert auf dem Schüler – Schulfach – Lehrer Prinzip.

Schüler können dabei Fächer erlernen, die ihnen ein Lehrer beibringt. Die Entscheidung, ob ein Schüler ein bestimmtes Fach erlernen kann, obliegt ihm dabei selbst. Eine funktionierende Modulkonfiguration muss daher immer aus einem Lehrer, mindestens einem Schüler und mindestens einem Fach bestehen.

Betrachtet man die Architektur der Bibliothek AC_ModuleTeaching , ergibt sich folgendes Design:

_example_img_ac_module_teaching1.png

Die Funktionsbausteine TeacherModule, SubjectModule und PupilModule (oder TeacherRegistration) leiten vom Funktionsbaustein AC.Module ab. Dadurch lassen sich diese 3 Modultypen in einem Modulbaum konfigurieren.

Für die Umsetzung anlernbarer Module selbst sind dabei nur zwei Funktionsbausteine relevant:

  • SubjectModule und PupilModule.

  • TeacherModule kann ohne Veränderung als Modul im Modulbaum eingehängt werden und bedarf keiner weiteren Konfiguration.

Ablauf

Die Initialisierungsphase läuft folgendermaßen ab:

_example_img_ac_module_teaching2.png

Init() wird aus dem Basis-Application-Composer Kontext im ersten SPS-Zyklus aufgerufen.

  • TeacherModule: Dieses Modul durchwandert alle Modulinstanzen und meldet sich bei jeder Instanz von SubjectModule und PupilModule an (Register(THIS^)). Damit ist das Grundgerüst errichtet, mit welchem die Module untereinander kommunizieren.

  • SubjectModule: Jedes dieser Module vergibt sich eine eindeutige SubjectID (UDINT).

  • PupilModule: Jedes Modul muss die SubjectIDs, die es lernen können soll, über AddSubjectID(UDINT) bei sich selbst registrieren.

Das Anlernen läuft folgendermaßen ab:

_example_img_ac_module_teaching3.png

Durch ein beliebiges Event (beispielsweise ein Klick auf die Schaltfläche „Lernen“ in einer Visualisierung), meldet sich eine Instanz von SubjectModule über den Aufruf von ReportTeacher() bei einem TeacherModule. In ReportTeacher() wird implizit Report(THIS^) des TeacherModules aufgerufen. Das TeacherModule gibt mit der Schnittstelle vom SubjectModule über Learn(ISubject) allen Instanzen von PupilModule die Möglichkeit, das SubjectModule zu erlernen. Erlernen eines SubjectModule bedeutet, dass das PupilModule das SubjectModule gegebenenfalls casten und selbst merken muss (beispielsweise durch Abspeichern in einer Member-Variablen).

Anwendung

Für eine konkrete Anwendung muss zunächst überlegt werden, wer die Rolle der "Subjects" und wer die Rolle der "Pupils" einnimmt. "Subjects" können beispielsweise durch Sensoren, "Pupils" durch Aktoren vertreten sein. Im Beispiel wird für ein "Subject" ein Lichttaster und für ein "Pupil" ein Licht verwendet. Das Licht kann dabei erlernen auf verschiedene Taster zu hören, oder diese auch wieder zu vergessen.

Bei der Implementierung ist dabei folgendes zu beachten:

  • Light EXTENDS ACMT.Pup

    Init(): Hinzufügen der erlernbaren SubjectID

    Learn(): Diese Methode muss überschrieben werden. Zu Beginn ist dann die Basisimplementierung aufzurufen:

    IF SUPER^.Learn(itfSubjectToLearn := itfSubjectToLearn) = ACMT.ERROR.NO_ERROR THEN

    Wenn das erfolgreich war, kann das Subject erlernt werden. Ansonsten ist das Subject nicht erlernbar und kann ignoriert werden.

    END_IF

    ForgetAll(): Diese Methode sollte ebenfalls überschrieben werden und dabei die lokal gespeicherten Subjects wieder entfernt werden.

  • SwitchPush EXTENDS ACMT.SubjectModule // indirekt über Vererbungskette SwitchOnOff SwitchBase

    Init(): Definieren der SubjectID

    CallPrioMediumStart(): Aufruf von ReportTeacher, wenn der Taster länger als 3s gedrückt wurde.

  • Persistence Manager

    Durch das Hinzufügen des Persistence Managers können die gelernten Subjects speichern werden. Dadurch wird beim Neustart der Applikation der letzte Stand wiederhergestellt.

Systemvoraussetzungen und Einschränkungen

Programmiersystem

CODESYS Development System Version 3.5.5.0 oder höher

Laufzeitsystem

CODESYS Control Win Version 3.5.5.0

Zusatzkomponenten

CODESYS Application Composer

Hinweis

_example_icon.png DOWNLOAD Projekt

Nach der Installation des Package finden Sie das Beispielprojekt im Verzeichnis C:\Users\<user>\CODESYS Examples\AC Module Teaching Example.