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 循环的计数器变量是子范围类型并且循环的计数范围退出定义的子范围,则可能发生无限循环。
VAR ui : UINT (0..10000); ... END_VAR
FOR ui:=0 TO 10000 DO ... END_FOR
程序永远不会退出 FOR 循环,因为监视器功能 CheckRangeSigned
防止 ui
设置为大于 10000 的值。
将值分配给有符号子范围类型的 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