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 INTEGRAL
VAR_INPUT
RUN : BOOL ; (* 1 = integrate, 0 = hold *)
R1 : BOOL ; (* Overriding reset *)
XIN : REAL ; (* Input variable *)
X0 : REAL ; (* Initial value *)
CYCLE : TIME ; (* Sampling period *)
END_VAR
VAR_OUTPUT
Q : BOOL ; (* NOT R1 *)
XOUT : REAL ; (* Integrated output *)
END_VAR
Q := NOT R1 ;
IF R1 THEN XOUT := X0 ;
ELSIF RUN THEN XOUT := XOUT + XIN * TIME_TO_REAL(CYCLE);
END_IF ;
END_FUNCTION_BLOCK