Skip to main content

POU:CheckRangeSigned

用于监视 DINT 类型的子范围类型的范围限制的功能

监测范围限制

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

小心

要获得监控功能的特性,请不要编辑声明部分。但是,您可以添加局部变量。

. 调用该函数时,它接收以下输入参数:
  • value:应该分配给子范围类型变量的值

  • lower:范围下限

  • upper:范围上限

只要在有效范围内,返回值就是赋值值。如果不是,则返回上限或下限,具体取决于违反的阈值。

例如,赋值 i := 10*y 被隐式替换为 i := 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 循环的计数器变量是子范围类型并且循环的计数范围退出定义的子范围,则可能发生无限循环。

533. 无限循环示例:
VAR
        ui : UINT (0..10000);
 ...
END_VAR
FOR ui:=0 TO 10000 DO
        ...
END_FOR

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



534. CheckRangeSigned 示例

将值分配给有符号子范围类型的 DINT 变量是自动调用 CheckRangeSigned.该函数将赋值限制在变量声明中定义的子范围内。 ST中函数的默认实现如下:

声明部分:

// Automatisch erzeugter Code : NICHT EDITIEREN
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
        value, lower, upper: DINT;
END_VAR

执行:

// Automatisch erzeugter Code : Es handelt sich hierbei um einen Implementierungsvorschlag.
IF (value < lower) THEN
        CheckRangeSigned := lower;
        ELSEIF(value > upper) THEN
        CheckRangeSigned := upper;
ELSE
        CheckRangeSigned := value;
END_VAR