Es treten unterschiedliche Ereignisse im Laufzeitsystem auf. Jedes Ereignis kann einer Ereignisklasse zugeordnet werden. Des Weiteren wird jedes Ereignis von einer bestimmten Quelle verursacht. Das Laufzeitsystem verfügt über eine interne Liste registrierter Callback-Definitionen. Bei jedem auftretenden Ereignis überprüft das Laufzeitsystem seine Liste der Callback-Definitionen und ruft gegebenenfalls eine Callback-Funktion auf.
Eine Callback-Definition besteht aus:
Ereignis (Event)
Ereignisklasse (Event class)
Ereignisquelle (Event source)
Index der Funktion, die aufgerufen werden soll, sobald das Ereignis auftritt.
Ereignis e der Klasse c von Quelle s veranlasst den Callback (e, c, s), wenn
(e = e OR e = CB.ALL_EVENTS) AND
((c AND c) > 0 OR c = CB.ALL_CLASSES) AND
(s = s OR s = CB.ALL_SOURCES)
Eine Funktion, die als Callback-Funktion verwendet werden soll, muss folgende Schnittstelle aufweisen:
FUNCTION Callback<Name> : BOOL
VAR_INPUT
dwSpec : DWORD; (* CB.Event and CB.EventClass *)
dwParam : DWORD; (* Application specific Parameter *)
dwSource : DWORD; (* CB.EventSource *)
END_VAR
Die Datentypen sind DWORDs um mit CODESYS V2.3 kompatibel zu sein. Diese verweisen allerdings auf die in Klammern spezifizierten Aufzählungen. dwSpec Parameter können mit Hilfe der Funktionen CB.DecodeEvent und CB.DecodeClass in zwei Variablen der Typen CB.Event und CB.EventClass zerlegt werden. Die dwSource Parameter können in den CB.EventSource Datentyp mit Hilfe der DWORD_TO_INT Konvertierung umgewandelt werden.
Anmerkungen zum Aufbau und zur Verwendung von Callback-Funktionen:
Der Name der Funktion muss ein Präfix „Callback“ aufweisen.
Die Funktion darf keine lokalen Variablen enthalten.
Die Funktion darf nicht mit Haltepunkten überprüft werden. ...
Die Funktion muss mit einem eigenen Enable system call„“ parametrisiert sein!
Einem Ereignis können mehrere Callbacks zugeordnet werden. Ein Callback (Ereignis, -klasse, -quelle, Funktionsindex) kann allerdings nur ein einziges Mal registriert werden. Wird versucht einen identischen Callback zuzuordnen, wird CB.RegisterCallback einen Fehler ausgeben.
Nach dem Zurücksetzen der SPS werden alle registrierten Callbacks sofort im Register gelöscht. Callbacks, die möglicherweise auf das Ereignis AFTER_RESET registriert wurden (siehe CB.Event), werden einmal vor der automatischen Registerlöschung aufgerufen.
Beachten Sie, dass Callback-Funktionen unmittelbar nach Auftreten des Ereignisses aufgerufen werden können. Dabei kann ein in der Ausführung befindlicher IEC-Task unterbrochen werden. Der Programmierer muss sich dessen bewusst sein, dass dies ähnliche Probleme bereiten kann, wie sie in Multitask-Systemen bekannt sind (Datenkonsistenz, usw.). Darüber hinaus muss die Laufzeit einer Callback-Funktion so kurz wie möglich sein, da sie das gesamte System blockiert.
Der Rückgabewert der Callback-Funktion ist bedeutungslos [1].
[1] Erklärung: Wenn der Rückgabewert Bedeutung hätte, dann wäre im Falle mehrerer Callback-Funktionen, die auf demselben Ereignis registriert sind, nicht klar, welcher Rückgabewert Vorrang genießt.