Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
FUNCTION_BLOCK RAMP
VAR_INPUT
RUN : BOOL ; (* 0 - track X0, 1 - ramp to/track X1 *)
X0,X1 : REAL ;
TR : TIME ; (* Ramp duration *)
CYCLE : TIME ; (* Sampling period *)
END_VAR
VAR_OUTPUT
BUSY : BOOL ; (* BUSY = 1 during ramping period *)
XOUT : REAL := 0.0 ;
END_VAR
VAR XI : REAL ; (* Initial value *)
T : TIME := T#0s; (* Elapsed time of ramp *)
END_VAR
BUSY := RUN ;
IF RUN THEN
IF T >= TR THEN BUSY := 0 ; XOUT := X1 ;
ELSE XOUT := XI + (X1-XI) * TIME_TO_REAL(T)
/ TIME_TO_REAL(TR) ;
T := T + CYCLE ;
END_IF ;
ELSE XOUT := X0 ; XI := X0 ; T := t#0s ;
END_IF ;
END_FUNCTION_BLOCK