Eventmechanismus
Das Laufzeitsystem verwendet „Events“, um Ereignisse wie den Start/Stopp/Reset der SPS, das Auftreten einer Exception etc. mitzuteilen. Mit dem „Eventmechanismus“ ist es möglich, eine Nachricht zu erhalten, sobald ein ausgewähltes Ereignis ausgelöst wurde.
Folgende applikationsbezogene Events werden weitergeleitet:
EVT_StartDoneEVT_StopDoneEVT_ResetDoneEVT_ExitDoneEVT_AllBootprojectsLoadedEVT_CmpApp_ExceptionEVT_StateChangedEVT_CmpDevice_InteractiveLoginEVT_CmpMgr_LicenseStateSysGraphic_EVT_OpenKeyboardSysGraphic_EVT_CloseKeyboard
Das mitgelieferte Beispiel uds_events.py bietet die Klasse CODESYS_EventHandler, welche das Registrieren auf ein Ereignis implementiert.
Diese Klasse benötigt die eventid sowie die componentid des zu registrierenden Ereignisses, welche in der Liste liEvents hinterlegt sind:
liEvents = {
"CmpApp_EVT_StartDone" : (0x00000002, 0x10000 + 2),
"CmpApp_EVT_StopDone" : (0x00000002, 0x10000 + 4),
"CmpApp_EVT_ResetDone" : (0x00000002, 0x10000 + 6),
"CmpApp_EVT_ExitDone" : (0x00000002, 0x10000 + 15),
"CmpApp_EVT_AllBootprojectsLoaded" : (0x00000002, 0x10000 + 25),
"CmpApp_EVT_CmpApp_Exception" : (0x00000002, 0x00080000 + 28),
"CmpApp_EVT_StateChanged" : (0x00000002,0x10000 + 43),
"CmpDevice_EVT_CmpDevice_InteractiveLogin" : (0x0000000E, 0x00010000+ 1),
"CmpMgr_EVT_LicenseState" : (0x00000001, 0x00010000 + 9),
"SysGraphic_EVT_OpenKeyboard" : (0x00000142, 0x00010000 + 1),
"SysGraphic_EVT_CloseKeyboard" : (0x00000142, 0x00010000 + 2,
}Außerdem muss eine Callback-Funktion angegeben werden, die beim Eintreffen des Ereignisses aufgerufen wird:
def callbackfunction_start(componentid, eventid):
print("Start event occured")Innerhalb von Main wird wie folgt auf ein Ereignis registriert und die nötige Callback-Funktion angegeben:
componentid, eventid = liEvents["CmpApp_EVT_StartDone"] myEventHandler_Start = CODESYS_EventHandler(componentid, eventid, callbackfunction_start) myEventHandler_Start.start()
Nun wird die Callback-Funktion callbackfunction_start aufgerufen, sobald das Laufzeitsystem in Start gewechselt hat.
Mit dem bereitgestellten Beispiel, das das Ereignis EVT_CmpDevice_InteractiveLogin registriert, kann im CODESYS-Entwicklungsdialog ein Winken ausgelöst werden und das entsprechende Ereignis wird an das Beispielskript weitergeleitet. Wenn dieses Ereignis nicht registriert ist, erscheint die übliche Fehlermeldung "Winken fehlgeschlagen [...]“.
Wenn das Ereignis EVT_CmpDevice_InteractiveLogin wie im Beispiel registriert ist, wird das Wink-Signal an das Python-Skript weitergeleitet und der Benutzer kann eine eigene Funktionalität dafür implementieren. Das Beispiel gibt lediglich die Meldung "Wink-Ereignis aufgetreten" aus.
Mit dem Ereignis CmpApp_EVT_StateChanged kann eine Status-LED implementiert werden. Dieses Ereignis sendet eine Nachricht, die den Namen der Anwendung und den Anwendungsstatus (RUN, STOP usw.) enthält. Das bereitgestellte Beispiel gibt diesen Namen der Anwendung und den aktuellen Status der Anwendung aus. "Anwendung: Anwendung Status: STOP"
Wichtig
Dieses Ereignis wird nur bei einer Statusänderung gesendet. Wenn das Beispiel-Python-Skript also nach der SPS-Anwendung gestartet wird, ist der Anfangsstatus unbekannt.
Der zugrundeliegende Mechanismus ist in der folgenden Abbildung gezeigt:

Verwendung der Schnittstelle nur als Mitglied der Linux-Benutzergruppe | JA |
Prozesstrennung | JA |