CAA_Callback.Library

 

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 Lauf­zeitsystem verfügt über eine interne Liste registrierter Callback-Defini­tionen. Bei jedem auftretenden Ereignis überprüft das Laufzeitsystem seine Liste der Callback-Definitionen und ruft gegebenenfalls eine Call­back-Funktion auf.

Eine Callback-Definition besteht aus:

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 Call­back-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„“ parametri­siert sein!

Einem Ereignis können mehrere Callbacks zugeordnet werden. Ein Call­back (Ereignis, -klasse, -quelle, Funktionsindex) kann allerdings nur ein einziges Mal registriert werden. Wird versucht einen identischen Call­back 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 Program­mierer muss sich dessen bewusst sein, dass dies ähnliche Probleme bereiten kann, wie sie in Multitask-Systemen bekannt sind (Datenkon­sistenz, usw.). Darüber hinaus muss die Laufzeit einer Callback-Funk­tion 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 regis­triert sind, nicht klar, welcher Rückgabewert Vorrang genießt.