etisserant@0: FUNCTION_BLOCK TRANSFER etisserant@0: VAR_INPUT etisserant@0: AUTO : BOOL ; (* 1 - track X0, 0 - ramp or hold *) etisserant@0: XIN : REAL ; (* Typically from PID Function Block *) etisserant@0: FAST_RATE, SLOW_RATE : REAL ; (* Up/down ramp slopes *) etisserant@0: FAST_UP, SLOW_UP, (* Typically pushbuttons *) etisserant@0: FAST_DOWN, SLOW_DOWN : BOOL; etisserant@0: CYCLE : TIME ; (* Sampling period *) etisserant@0: END_VAR etisserant@0: VAR_OUTPUT XOUT : REAL ; END_VAR etisserant@0: VAR XFER_RAMP : INTEGRAL ; etisserant@0: RAMP_RATE : REAL ; etisserant@0: END_VAR etisserant@0: RAMP_RATE := 0.0 ; etisserant@0: IF NOT AUTO THEN etisserant@0: IF FAST_UP THEN RAMP_RATE := FAST_RATE; END_IF; etisserant@0: IF SLOW_UP THEN RAMP_RATE := RAMP_RATE + SLOW_RATE; END_IF; etisserant@0: IF FAST_DOWN THEN RAMP_RATE := RAMP_RATE - FAST_RATE; END_IF; etisserant@0: IF SLOW_DOWN THEN RAMP_RATE := RAMP_RATE - SLOW_RATE; END_IF; etisserant@0: END_IF ; etisserant@0: XFER_RAMP (RUN := 1, CYCLE := CYCLE, R1 := AUTO, etisserant@0: XIN := RAMP_RATE, X0 := XIN) ; etisserant@0: XOUT := XFER_RAMP.XOUT; etisserant@0: END_FUNCTION_BLOCK etisserant@0: