Requirement
- Create a "Standard project" and select CODESYS Control Win V3 as the device.
- Define the target system by means of the Network scan.
- Open the Library Manager and add the following libraries:
CmpApp
CmpEventMgr
StringUtils
SysTypes2 Interfaces
Creating the EventHandler
- Create a new FB named FB_EventHandler and implement the interface CmpEventMgr.ICmpEventCallback.
The method EventCallback is created automatically with the FB: Add the following variables to the FB_EventHandler:
Section Column width 7 Declaration
Column width 93 Code Block theme Confluence FUNCTION_BLOCK FB_EventHandler IMPLEMENTS ICmpEventCallback VAR_OUTPUT udiStartDone : UDINT; udiStopDone : UDINT; udiLogin : UDINT; END_VAR VAR hEventStart : SysTypes.RTS_IEC_HANDLE; hEventStop : SysTypes.RTS_IEC_HANDLE; hInterfaceStart : SysTypes.RTS_IEC_HANDLE; hInterfaceStop : SysTypes.RTS_IEC_HANDLE; iecResult : SysTypes.RTS_IEC_RESULT; itfEvtCallback : CmpEventMgr.ICmpEventCallback; hEventLogin : SysTypes.RTS_IEC_HANDLE; hInterfaceLogin : SysTypes.RTS_IEC_HANDLE; _dwStopReason : DWORD; _sAppName : STRING; END_VAR
Adapt the method EventCallback as follows:
Section Column width 7 Declaration
Column width 93 Code Block theme Confluence METHOD EventCallback : CmpEventMgr.RTS_IEC_RESULT VAR_INPUT (*Pointer to the event parameters, see Struct EventParam*) pEventParam : POINTER TO CmpEventMgr.EventParam; END_VAR VAR pStartParam : POINTER TO EVTPARAM_CmpApp; pStopParam : POINTER TO EVTPARAM_CmpAppStop; pLoginParam : POINTER TO EVTPARAM_CmpAppComm; END_VAR
Section Column width 7 Implementation
Column width 93 Code Block theme Confluence CASE pEventParam^.EventId OF CmpApp.EventIDs.EVT_StartDone: pStartParam := pEventParam^.pParameter; IF pStartParam <> 0 THEN StrCpyA(ADR(_sAppName), SIZEOF(_sAppName), ADR(pStartParam^.pApp^.szName)); END_IF udiStartDone := udiStartDone + 1; CmpApp.EventIDs.EVT_PrepareStop: pStopParam := pEventParam^.pParameter; IF pStopParam <> 0 THEN _dwStopReason := pStopParam^.ulStopReason; END_IF udiStopDone := udiStopDone + 1; CmpApp.EventIDs.EVT_Login: pLoginParam := pEventParam^.pParameter; udiLogin := udiLogin + 1; END_CASE
Add the method FB_Init to the FB_EventHandler and adapt the code as follows:
Section Column width 7 Declaration
Column width 93 Code Block theme Confluence METHOD FB_Init: BOOL VAR_INPUT bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold) bInCopyCode : BOOL; // TRUE: the instance will be copied to the copy code afterward (online change) END_VAR
Section Column width 7 Implementation
Column width 93 Code Block theme Confluence itfEvtCallback := This^; hEventStart := EventOpen(CmpApp.EventIds.EVT_StartDone, CmpApp.EventIds.CMPID_CmpApp, iecResult); hEventStop := EventOpen(CmpApp.EventIds.EVT_PrepareStop, CmpApp.EventIds.CMPID_CmpApp, iecResult); hEventLogin := EventOpen(CmpApp.EventIds.EVT_Login , CmpApp.EventIds.CMPID_CmpApp, iecResult); hInterfaceStart := EventRegisterCallback(hEventStart, itfEvtCallback, iecResult); hInterfaceStop := EventRegisterCallback(hEventStop, itfEvtCallback, iecResult); hInterfaceLogin := EventRegisterCallback(hEventLogin, itfEvtCallback, iecResult);
Add the method FB_Exit to the FB_EventHandler and adapt the code as follows:
Section Column width 7 Declaration
Column width 93 Code Block theme Confluence METHOD FB_Exit: BOOL VAR_INPUT bInCopyCode: BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change). END_VAR
Section Column width 7 Implementation
Column width 93 Code Block theme Confluence EventUnregisterCallback(hEventStart, hInterfaceStart); EventUnregisterCallback(hEventStop, hInterfaceStop); EventUnregisterCallback(hEventLogin, hInterfaceStop); EventClose2(hEventStart); EventClose2(hEventStop); EventClose2(hEventLogin);
Instantiating the event handler and test the functionality
Adapt the POU PLC_PRG as follows:
Section Column width 7 Declaration
Column width 93 Code Block theme Confluence VAR udiCntStart : UDINT; udiCntStop : UDINT; udiCntLogin : UDINT; fbEventHandler : FB_EventHandler; END_VAR
Section Column width 7 Implementation
Column width 93 Code Block theme Confluence fbEventHandler(udiStartDone => udiCntStart, udiStopDone => udiCntStop, udiLogin => udiCntLogin);
- Download the project to the controller and start it.
When logging in/out and starting the project, the counters are incremented.