CheckRangeSigned : DINT

CheckRangeSigned : DINT 1:

To check for observance of range boundaries at runtime, the functions CheckRangeSigned must be introduced. In these, boundary violations can be captured by the appropriate method and means (e.g. the value can be cut out or an error flag can be set.). They are implicitly called as soon as a variable is written as belonging to a subrange type constructed from a signed type.

VAR_INPUT
    value, lower, upper: DINT;
END_VAR

Example:

In the case of a variable belonging to a signed subrange type, the function CheckRangeSigned is called; it could be programmed as follows to trim a value to the permissible range:

FUNCTION CheckRangeSigned : DINT
VAR_INPUT
    value, lower, upper: DINT;
END_VAR

IF (value < lower) THEN
    CheckRangeSigned := lower;
ELSIF(value > upper) THEN
    CheckRangeSigned := upper;
ELSE
    CheckRangeSigned := value;
END_IF

In calling up the function automatically, the function name CheckRangeSigned is obligatory, as is the interface specification: return value and three parameters of type DINT
When called, the function is parameterized as follows:

value

the value to be assigned to the range type

lower

the lower boundary of the range

upper

the upper boundary of the range

Return value

the value that is assigned to the range type

An assignment i:=10*y implicitly produces the following in this example:
i := CheckRangeSigned(10*y, -4095, 4095);
Even if y for example has the value 1000, then i still has only the value 4095 after this assignment.

Notice

Value of variable/continuous loop

If neither of the functions CheckRangeSigned or CheckRangeUnsigned is present, no type checking of subrange types occurs during runtime! The variable i could then take on any value between –32768 and 32767 at any time!
If a function CheckRangeSigned or CheckRangeUnsigned is is implemented as shown above, a continuous loop can develop with the use subrange types in a FOR loop. This occurs exactly if the area indicated for the FOR loop is just as large or larger than that subrange types!

Example:

VAR
    ui : UINT (0..10000);
END_VAR

FOR ui:=0 TO 10000 DO
...
END_FOR

The FOR loop is not left, because ui cannot became larger than 10000. Likewise, the contents of the CheckRange functions are to be considered when using increment values in the FOR loop!