.
“CheckLRangeUnsigned”POU
.
.

监视DINT类型的子范围类型的范围限制的函数。

.

此监视功能负责适当处理违反范围限制的情况。违反行为的示例包括设置错误标志和更改值。当将值分配给子范围类型变量时,隐式调用这些函数。

小心!

要获得用于监视函数的功能,请勿编辑声明部分。但是,您可以添加局部变量。

.调用函数时,它将接收以下输入参数:

  •  应该分配给子范围类型变量的值
  • lower:  范围下限
  • upper:  范围上限

返回值是赋值,只要它在有效范围内即可。如果不是,则返回上限或下限,具体取决于违反了哪个阈值。

例如,赋值i := 10*yi := CheckRangeSigned(10*y, -4095, 4095);隐式替换。

如果y“1000”,则不会像原始代码中那样将“10 * 1000 = 10000”分配给i。而是指定范围上限“ 4095”。

CheckRangeUnsigned函数也是如此。

提示!

如果函数不可用,则不会在运行时检查子范围的各个变量。在这种情况下,可以将-2147483648和+2147483648之间(或0和4294967295之间)的任何值分配给子范围类型DINT / UDINT的变量。您可以将-9223372036854775808和+9223372036854775807之间(或0和18446744073709551615)之间的任何值分配给子范围类型LINT / ULINT的变量。

小心!

链接区域监视功能可能导致无限循环。例如,如果FOR循环的计数器变量是子范围类型,并且该循环的计数范围超出了定义的子范围,则可能会发生无限循环。

.

.

.无穷循环的示例:


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

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

该程序永远不会退出FOR循环,因为CheckRangeSigned监视功能可防止将ui设置为大于10000的值。

.
.

.CheckRangeSigned的示例

将值分配给带符号子范围类型的DINT变量是自动调用CheckRangeSigned的条件。此函数将赋值限制为变量声明中定义的子范围。ST中该功能的默认实现如下:

声明部分:


// This is automatically generated code: DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
    value, lower, upper: DINT;
END_VAR
 

实现:


// This automatically generated code is a suggested implementation.
IF (value < lower) THEN
    CheckRangeSigned := lower;
    ELSEIF(value > upper) THEN
    CheckRangeSigned := upper;    
ELSE
    CheckRangeSigned := value;
END_VAR