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