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