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 TeacherModul
e, 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
undPupilModule
.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:
![]() |
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 vonSubjectModule
undPupilModule
an (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 erlernbarenSubjectID
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 derSubjectID
CallPrioMediumStart()
: 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
.