Correctly identify errors when parsing erroneous code (make sure flex goes back to INITIAL state when code contains errors that do not allow determining whether ST or IL is being parsed)
FUNCTION_BLOCK AVERAGE
VAR_INPUT
RUN : BOOL ; (* 1 = run, 0 = reset *)
XIN : REAL ; (* Input variable *)
N : INT ; (* 0 <= N < 128 or manufacturer- *)
END_VAR (* specified maximum value *)
VAR_OUTPUT XOUT : REAL ; END_VAR (* Averaged output *)
VAR SUM : REAL := 0.0; (* Running sum *)
FIFO : DELAY ; (* N-Element FIFO *)
END_VAR
SUM := SUM - FIFO.XOUT ;
FIFO (RUN := RUN , XIN := XIN, N := N) ;
SUM := SUM + FIFO.XOUT ;
IF RUN THEN XOUT := SUM/N ;
ELSE SUM := N*XIN ; XOUT := XIN ;
END_IF ;
END_FUNCTION_BLOCK