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:
![]() |
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:
SubjectModuleundPupilModule.TeacherModulekann ohne Veränderung als Modul im Modulbaum eingehängt werden und bedarf keiner weiteren Konfiguration.
Ablauf
Die Initialisierungsphase läuft folgendermaßen ab:
![]() |
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 vonSubjectModuleundPupilModulean (Register(THIS^)). Damit ist das Grundgerüst errichtet, mit welchem die Module untereinander kommunizieren.SubjectModule: Jedes dieser Module vergibt sich eine eindeutigeSubjectID(UDINT).PupilModule: Jedes Modul muss dieSubjectIDs, die es lernen können soll, überAddSubjectID(UDINT) bei sich selbst registrieren.
Das Anlernen läuft folgendermaßen ab:
![]() |
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 erlernbarenSubjectIDLearn(): Diese Methode muss überschrieben werden. Zu Beginn ist dann die Basisimplementierung aufzurufen:IF SUPER^.Learn(itfSubjectToLearn := itfSubjectToLearn) = ACMT.ERROR.NO_ERROR THENWenn das erfolgreich war, kann das Subject erlernt werden. Ansonsten ist das Subject nicht erlernbar und kann ignoriert werden.
END_IFForgetAll(): 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 derSubjectIDCallPrioMediumStart(): Aufruf vonReportTeacher, 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
DOWNLOAD Projekt
Nach der Installation des Package finden Sie das Beispielprojekt im Verzeichnis C:\Users\<user>\CODESYS Examples\AC Module Teaching Example.


