PROGRAM GRAVEL (* Gravel measurement and loading system *) VAR_INPUT OFF_PB : BOOL ; ON_PB : BOOL ; FILL_PB : BOOL ; SIREN_ACK : BOOL ; LOAD_PB : BOOL ; (* Load truck from bin *) JOG_PB : BOOL ; LAMP_TEST : BOOL ; TRUCK_ON_RAMP : BOOL ; (* Optical sensor *) SILO_EMPTY_LS : BOOL ; BIN_EMPTY_LS : BOOL ; SETPOINT : BYTE ; (* 2-digit BCD *) END_VAR VAR_OUTPUT CONTROL_LAMP : BOOL ; TRUCK_LAMP : BOOL ; SILO_EMPTY_LAMP : BOOL ; CONVEYOR_LAMP : BOOL ; CONVEYOR_MOTOR : BOOL ; SILO_VALVE : BOOL ; BIN_VALVE : BOOL ; SIREN : BOOL ; BIN_LEVEL : BYTE ; END_VAR VAR BLINK_TIME : TIME; (* BLINK ON/OFF time *) PULSE_TIME : TIME; (* LEVEL_CTR increment interval *) RUNOUT_TIME: TIME; (* Conveyor running time after loading *) RUN_IN_TIME: TIME; (* Conveyor running time before loading *) SILENT_TIME: TIME; (* Siren silent time after SIREN_ACK *) OK_TO_RUN : BOOL; (* 1 = Conveyor is allowed to run *) (* Function Blocks *) BLINK: TON; (* Blinker OFF period timer / ON output *) BLANK: TON; (* Blinker ON period timer / blanking pulse *) PULSE: TON; (* LEVEL_CTR pulse interval timer *) SIREN_FF: RS; SILENCE_TMR: TP; (* Siren silent period timer *) END_VAR VAR RETAIN LEVEL_CTR : CTU ; END_VAR (* Program body *) (* Major operating states *) INITIAL_STEP START : END_STEP TRANSITION FROM START TO FILL_BIN := FILL_PB & CONTROL.X ; END_TRANSITION STEP FILL_BIN: SILO_VALVE(N); END_STEP TRANSITION FROM FILL_BIN TO START := NOT FILL_PB OR NOT CONTROL.X ; END_TRANSITION TRANSITION FROM FILL_BIN TO LOAD_WAIT := LEVEL_CTR.Q ; END_TRANSITION STEP LOAD_WAIT : END_STEP TRANSITION FROM LOAD_WAIT TO RUN_IN := LOAD_PB & OK_TO_RUN ; END_TRANSITION STEP RUN_IN : END_STEP TRANSITION FROM RUN_IN TO LOAD_WAIT := NOT OK_TO_RUN ; END_TRANSITION TRANSITION FROM RUN_IN TO DUMP_BIN := RUN_IN.T > RUN_IN_TIME; END_TRANSITION STEP DUMP_BIN: BIN_VALVE(N); END_STEP TRANSITION FROM DUMP_BIN TO LOAD_WAIT := NOT OK_TO_RUN ; END_TRANSITION TRANSITION FROM DUMP_BIN TO RUNOUT := BIN_EMPTY_LS ; END_TRANSITION STEP RUNOUT : END_STEP TRANSITION FROM RUNOUT TO LOAD_WAIT := NOT OK_TO_RUN ; END_TRANSITION TRANSITION FROM RUNOUT TO START := RUNOUT.T >= RUNOUT_TIME ; END_TRANSITION (* Control state sequencing *) INITIAL_STEP CONTROL_OFF: END_STEP TRANSITION FROM CONTROL_OFF TO CONTROL := ON_PB & NOT OFF_PB ; END_TRANSITION STEP CONTROL: CONTROL_ACTION(N); END_STEP ACTION CONTROL_ACTION: BLINK(EN:=CONTROL.X & NOT BLANK.Q, PT := BLINK_TIME) ; BLANK(EN:=BLINK.Q, PT := BLINK_TIME) ; OK_TO_RUN := CONTROL.X & TRUCK_ON_RAMP ; CONVEYOR_MOTOR := OK_TO_RUN & OR(JOG_PB, RUN_IN.X, DUMP_BIN.X, RUNOUT.X); END_ACTION TRANSITION FROM CONTROL TO CONTROL_OFF := OFF_PB ; END_TRANSITION (* Monitor Logic *) INITIAL_STEP MONITOR: MONITOR_ACTION(N); END_STEP ACTION MONITOR_ACTION: CONVEYOR_LAMP := CONVEYOR_MOTOR & BLINK.Q ; CONTROL_LAMP := CONTROL.X OR LAMP_TEST ; TRUCK_LAMP := TRUCK_ON_RAMP OR LAMP_TEST ; SILO_EMPTY_LAMP := BLINK.Q & SILO_EMPTY_LS OR LAMP_TEST ; SILENCE_TMR(IN:=SIREN_ACK, PT:=SILENT_TIME) ; SIREN_FF(S:=SILO_EMPTY_LS, R1:=SILENCE_TMR.Q) ; SIREN := SIREN_FF.Q1 ; PULSE(IN:=FILL_BIN.X & NOT PULSE.Q, PT:=PULSE_TIME) ; LEVEL_CTR(R := BIN_EMPTY_LS, CU := PULSE.Q, PV := BCD_TO_INT(SETPOINT)) ; BIN_LEVEL := INT_TO_BCD(LEVEL_CTR.CV) ; END_ACTION END_PROGRAM CONFIGURATION GRAVEL_CONTROL RESOURCE PROC1 ON PROC_TYPE_Y PROGRAM G : GRAVEL (* Inputs *) (OFF_PB := %I0.0 , ON_PB := %I0.1 , FILL_PB := %I0.2 , SIREN_ACK := %I0.3 , LOAD_PB := %I0.4 , JOG_PB := %I0.5 , LAMP_TEST := %I0.7 , TRUCK_ON_RAMP := %I1.4 , SILO_EMPTY_LS := %I1.5 , BIN_EMPTY_LS := %I1.6 , SETPOINT := %IB2 , (* Outputs *) CONTROL_LAMP => %Q4.0, TRUCK_LAMP => %Q4.2, SILO_EMPTY_LAMP => %Q4.3, CONVEYOR_LAMP => %Q5.3, CONVEYOR_MOTOR => %Q5.4, SILO_VALVE => %Q5.5, BIN_VALVE => %Q5.6, SIREN => %Q5.7, BIN_LEVEL => %B6) ; END_RESOURCE END_CONFIGURATION