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 FWD_REV_MON
VAR_INPUT AUTO : BOOL ;(* Enable automated commands *)
ACK : BOOL ; (* Acknowledge/cancel all alarms *)
AUTO_FWD : BOOL ; (* Automated forward command *)
MAN_FWD : BOOL ; (* Manual forward command *)
MAN_FWD_CHK : BOOL ; (* Negated MAN_FWD for debouncing *)
T_FWD_MAX : TIME ; (* Maximum time from FWD_CMD to FWD_FDBK *)
FWD_FDBK : BOOL ; (* Confirmation of FWD_CMD completion *)
(* by operative unit *)
AUTO_REV : BOOL ; (* Automated reverse command *)
MAN_REV : BOOL ; (* Manual reverse command *)
MAN_REV_CHK : BOOL ; (* Negated MAN_REV for debouncing *)
T_REV_MAX : TIME ; (* Maximum time from REV_CMD to REV_FDBK *)
REV_FDBK : BOOL ; (* Confirmation of REV_CMD completion *)
END_VAR (* by operative unit *)
VAR_OUTPUT KLAXON : BOOL ; (* Any alarm active *)
FWD_REV_ALRM : BOOL; (* Forward/reverse command conflict *)
FWD_CMD : BOOL ; (* "Forward" command to operative unit *)
FWD_ALRM : BOOL ; (* T_FWD_MAX expired without FWD_FDBK *)
REV_CMD : BOOL ; (* "Reverse" command to operative unit *)
REV_ALRM : BOOL ; (* T_REV_MAX expired without REV_FDBK *)
END_VAR
VAR FWD_MON : CMD_MONITOR; (* "Forward" command monitor *)
REV_MON : CMD_MONITOR; (* "Reverse" command monitor *)
FWD_REV_FF : SR ; (* Forward/Reverse contention latch *)
END_VAR
(* Function Block body *)
LD AUTO (* Load common inputs *)
ST FWD_MON.AUTO_MODE
ST REV_MON.AUTO_MODE
LD ACK
ST FWD_MON.ACK
ST REV_MON.ACK
ST FWD_REV_FF.R
LD AUTO_FWD (* Load inputs to FWD_MON *)
ST FWD_MON.AUTO_CMD
LD MAN_FWD
ST FWD_MON.MAN_CMD
LD MAN_FWD_CHK
ST FWD_MON.MAN_CMD_CHK
LD T_FWD_MAX
ST FWD_MON.T_CMD_MAX
LD FWD_FDBK
ST FWD_MON.FDBK
CAL FWD_MON (* Activate FWD_MON *)
LD AUTO_REV (* Load inputs to REV_MON *)
ST REV_MON.AUTO_CMD
LD MAN_REV
ST REV_MON.MAN_CMD
LD MAN_REV_CHK
ST REV_MON.MAN_CMD_CHK
LD T_REV_MAX
ST REV_MON.T_CMD_MAX
LD REV_FDBK
ST REV_MON.FDBK
CAL REV_MON (* Activate REV_MON *)
LD FWD_MON.CMD (* Check for contention *)
AND REV_MON.CMD
S1 FWD_REV_FF (* Latch contention condition *)
LD FWD_REV_FF.Q
ST FWD_REV_ALRM (* Contention alarm *)
LD FWD_MON.CMD (* "Forward" command and alarm *)
ANDN FWD_REV_ALRM
ST FWD_CMD
LD FWD_MON.ALRM
ST FWD_ALRM
LD REV_MON.CMD (* "Reverse" command and alarm *)
ANDN FWD_REV_ALRM
ST REV_CMD
LD REV_MON.ALRM
ST REV_ALRM
OR FWD_ALRM (* OR all alarms *)
OR FWD_REV_ALRM
ST KLAXON
END_FUNCTION_BLOCK