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 *)
LD	T_CMD_MAX	
ST	CMD_TMR.PT	(* Store an input to the TON FB *)
LD	AUTO_CMD	
AND	AUTO_MODE	
OR(	MAN_CMD	
ANDN	AUTO_MODE	
ANDN	MAN_CMD_CHK	
)		
ST	CMD	
IN	CMD_TMR	(* Invoke the TON FB *)
LD	CMD_TMR.Q	
ANDN	FDBK	
ST	ALRM_FF.S1	(* Store an input to the SR FB *)
LD	ACK	
R	ALRM_FF	(* Invoke the SR FB *)
LD	ALRM_FF.Q1	
ST    	ALRM	

END_FUNCTION_BLOCK
