201 lines
6.4 KiB
XML
201 lines
6.4 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4022.6">
|
|
<POU Name="FB_ExtSimpleEventLog" Id="{715e4e5f-ea7f-48d3-986e-f1a58d16fa50}" SpecialFunc="None">
|
|
<Declaration><![CDATA[///****************************************************************************************
|
|
///Name: FB_ExtSimpleEventLog
|
|
///Date: 13.10.2004
|
|
///Author: Dirk Nordberg (BECKHOFF INDUSTRIE ELEKTRONIK)
|
|
///
|
|
///Description: Function block to control the EventLogger
|
|
/// Messages can be activated or deactivated through an array of bool.
|
|
/// The subscription of the array is equivalent to EventID from EventLogger.
|
|
/// Funtion block will be initialized with Init flag, then the busy flag is set true.
|
|
///
|
|
/// Revision: 2.0
|
|
/// History: 13.10.2004 Ng start coding
|
|
/// 17.04.2005 MK runtime optimized
|
|
/// 06.09.2005 MiB extended version (renamed to FB_ExtSimpleEventLog)
|
|
/// 30.05.2017 TV messages with format parameters
|
|
///****************************************************************************************
|
|
FUNCTION_BLOCK FB_ExtSimpleEventLog
|
|
VAR_INPUT
|
|
/// Rising flag starts the initialization
|
|
Init: BOOL;
|
|
SourceId: UINT;
|
|
/// Alarm error class
|
|
Class: UINT;
|
|
/// Activate or deaktivate confirmation
|
|
QuitRequired: BOOL;
|
|
/// Adress of the array for the messages
|
|
adrAlarmArray: POINTER TO BOOL;
|
|
/// ...with constant boundaries ARRAY_LBOUND to ARRAY_UBOUND for array size
|
|
adrQuitArray: POINTER TO BOOL;
|
|
/// ...with constant boundaries ARRAY_LBOUND to ARRAY_UBOUND for array size
|
|
adrEventData: POINTER TO ST_EventData;
|
|
/// Format String for message
|
|
sFormatString: STRING := '';
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
Busy: BOOL;
|
|
Err: BOOL;
|
|
ErrId: UDINT;
|
|
END_VAR
|
|
VAR CONSTANT
|
|
ARRAY_LBOUND: UDINT := FIRST_MESSAGE;
|
|
ARRAY_UBOUND: UDINT := LAST_MESSAGE;
|
|
TCEVENTDATAFORMATSTRING: STRING(80) := ' ';
|
|
STATE_INIT: INT := 0;
|
|
STATE_IDLE: INT := 1;
|
|
STATE_RESET_EVENT: INT := 2;
|
|
STATE_QUIT_EVENT: INT := 3;
|
|
STATE_RESET_END: INT := 4;
|
|
STATE_WAIT: INT := 5;
|
|
END_VAR
|
|
VAR
|
|
state: INT;
|
|
///{flag nowatch on }
|
|
bReady: BOOL;
|
|
nMsgHasChanged: DINT;
|
|
bEvtState: ARRAY[ARRAY_LBOUND..ARRAY_UBOUND] OF BOOL;
|
|
event: ARRAY[ARRAY_LBOUND..ARRAY_UBOUND] OF ADSLOGEVENT;
|
|
idx: UDINT;
|
|
CfgEvent: TcEvent;
|
|
bWait: BOOL;
|
|
ptAlarm: POINTER TO BOOL;
|
|
ptQuit: POINTER TO BOOL;
|
|
RT_Init: R_TRIG;
|
|
ptData: POINTER TO ST_EventData;
|
|
stDummy: ST_EventData;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><;
|
|
END_FOR;
|
|
State := STATE_IDLE;
|
|
|
|
STATE_IDLE:
|
|
(* nothing to do *)
|
|
IF nMsgHasChanged = 0 AND NOT RT_Init.Q THEN
|
|
RETURN;
|
|
END_IF
|
|
|
|
IF adrAlarmArray <> 0 THEN
|
|
ptAlarm := adrAlarmArray;
|
|
ptData := adrEventData;
|
|
IF ptData <> 0 THEN
|
|
sFormatString := '%d%s';
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
event[idx].EventConfigData.DataFormatStrAddress := ADR(sFormatString);
|
|
event[idx].EventConfigData.SourceId := SourceId;
|
|
event[idx].EventDataAddress := ptData ;
|
|
event[idx].EventDataLength := SIZEOF(stDummy);
|
|
event[idx]();
|
|
ptData := ptData + SIZEOF(stDummy);
|
|
END_FOR
|
|
END_IF
|
|
IF CfgEvent.bQuitRequired AND adrQuitArray <> 0 THEN
|
|
ptQuit := adrQuitArray;
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
event[idx](Event:=ptAlarm^, EventQuit:=ptQuit^);
|
|
ptAlarm := ptAlarm + 1;
|
|
ptQuit := ptQuit + 1;
|
|
END_FOR;
|
|
ELSE
|
|
bReady := TRUE;
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
event[idx](Event:=ptAlarm^);
|
|
ptAlarm := ptAlarm + 1;
|
|
IF (NOT(event[idx].Event = TRUE (* event is set *)
|
|
AND event[idx].Quit = FALSE
|
|
AND event[idx].EventState = TCEVENTSTATE_SIGNALED)
|
|
AND NOT(event[idx].Event = FALSE (* event is reset *)
|
|
AND event[idx].Quit = TRUE
|
|
AND event[idx].EventState = TCEVENTSTATE_INVALID)) THEN
|
|
bReady := FALSE;
|
|
END_IF
|
|
END_FOR;
|
|
|
|
(* copy the status *)
|
|
IF bReady THEN
|
|
MEMCPY(ADR(bEvtState), adrAlarmArray, SIZEOF(bEvtState));
|
|
END_IF
|
|
|
|
END_IF
|
|
END_IF
|
|
|
|
IF RT_Init.Q THEN
|
|
Busy := TRUE;
|
|
State := STATE_RESET_EVENT;
|
|
END_IF
|
|
|
|
STATE_RESET_EVENT:(*---------------------------------- clear messages ----------------------------------------*)
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
IF event[idx].EventState = TCEVENTSTATE_SIGNALED THEN
|
|
event[idx](Event:=FALSE, EventQuit:= FALSE, FbCleanup:= FALSE, TMOUT:= t#1s);
|
|
IF event[idx].Err THEN
|
|
Err := TRUE;
|
|
ErrId := event[idx].ErrId;
|
|
IF event[idx].ErrId = 1282 THEN (* Message Router: mailbox full *)
|
|
event[idx](Event:=FALSE, EventQuit:= FALSE, FbCleanup:= FALSE);
|
|
RETURN;
|
|
END_IF
|
|
END_IF
|
|
END_IF;
|
|
END_FOR;
|
|
State := STATE_QUIT_EVENT;
|
|
|
|
STATE_QUIT_EVENT:(*---------------------------------- quit messages ----------------------------------------*)
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
IF event[idx].EventState = TCEVENTSTATE_SIGNALED THEN
|
|
event[idx](Event:=FALSE, EventQuit:= TRUE, FbCleanup:= FALSE, TMOUT:= t#1s);
|
|
IF event[idx].Err THEN
|
|
Err := TRUE;
|
|
ErrId := event[idx].ErrId;
|
|
IF event[idx].ErrId = 1282 THEN (* Message Router: mailbox full *)
|
|
event[idx](Event:=FALSE, EventQuit:= FALSE, FbCleanup:= FALSE);
|
|
RETURN;
|
|
END_IF
|
|
END_IF
|
|
END_IF;
|
|
END_FOR;
|
|
State := STATE_RESET_END;
|
|
|
|
STATE_RESET_END:
|
|
bWait := FALSE;
|
|
FOR idx := ARRAY_LBOUND TO ARRAY_UBOUND BY 1 DO
|
|
event[idx](Event:=FALSE, EventQuit:= FALSE, FbCleanup:= FALSE);
|
|
IF event[idx].EventState = TCEVENTSTATE_SIGNALED THEN
|
|
bWait := TRUE;
|
|
END_IF
|
|
END_FOR;
|
|
IF NOT bWait THEN
|
|
State := STATE_INIT;
|
|
END_IF
|
|
|
|
END_CASE]]></ST>
|
|
</Implementation>
|
|
<LineIds Name="FB_ExtSimpleEventLog">
|
|
<LineId Id="285" Count="121" />
|
|
<LineId Id="2" Count="0" />
|
|
</LineIds>
|
|
</POU>
|
|
</TcPlcObject> |