Start to move enumeration declaration checking to its own class.
FUNCTION_BLOCK CMD_MONITOR
VAR_INPUT AUTO_CMD : BOOL ; (* Automated command *)
AUTO_MODE : BOOL ; (* AUTO_CMD enable *)
MAN_CMD : BOOL ; (* Manual Command *)
MAN_CMD_CHK : BOOL ; (* Negated MAN_CMD to debounce *)
T_CMD_MAX : TIME ; (* Max time from CMD to FDBK *)
FDBK : BOOL ; (* Confirmation of CMD completion
by operative unit *)
ACK : BOOL ; (* Acknowledge/cancel ALRM *)
END_VAR
VAR_OUTPUT CMD : BOOL ; (* Command to operative unit *)
ALRM : BOOL ; (* T_CMD_MAX expired without FDBK *)
END_VAR
VAR CMD_TMR : TON ; (* CMD-to-FDBK timer *)
ALRM_FF : SR ; (* Note over-riding S input: *)
END_VAR (* Command must be cancelled before
"ACK" can cancel alarm *)
(* Function Block Body *)
CMD := AUTO_CMD & AUTO_MODE
OR MAN_CMD & NOT MAN_CMD_CHK & NOT AUTO_MODE ;
CMD_TMR (IN := CMD, PT := T_CMD_MAX);
ALRM_FF (S1 := CMD_TMR.Q & NOT FDBK, R := ACK);
ALRM := ALRM_FF.Q1;
END_FUNCTION_BLOCK