子范围类型是用户定义的类型,其值范围只是基本数据类型的子集。还可以使用隐式范围边界检查。
您可以在 DUT 对象中进行声明,但也可以直接通过子范围类型来声明变量。
作为 DUT 对象进行声明的语法:
TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;
<name> |
有效的 IEC 标识符 |
<inttype> |
以下数据类型中的一种:SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD) |
<ug> |
与基本类型兼容的常量,设置范围类型的下限 此范围中包含下限。 |
<og> |
与基本类型兼容的常量,设置范围类型的上限。 此基本类型中包含上限。 |
TYPE
SubInt : INT (-4095..4095);
END_TYPE
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR
如果为某个子范围类型分配了一个值(在声明中或者在实现中),但是与此范围不匹配(例如,以上所显示的声明示例中的 i:=5000),则会发出一条消息。
为了在运行期间不超出子范围类型的范围边界,必须将函数CheckRangeSigned、CheckLRangeSigned 或 CheckRangeUnsigned、CheckLRangeUnsigned 添加到应用程序。关于插入函数的信息,请参阅用于隐式检查的 POU 函数的说明。
此检查函数的目的是正确处理子范围违例(例如,通过设置错误标志或更改值)。将在分配子范围类型的变量后隐式调用此函数。
|
意外的设备操作 |
请勿更改隐式检查函数的声明部分。 |
不遵循上述说明可能导致人员伤亡或设备损坏。 |
分配属于某个已签名子范围类型的变量会涉及到隐式调用 CheckRangeSigned。该函数的默认实现(将某个值修建为允许的范围)按如下所示提供:
声明部分:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR
实现部分:
// Implicitly generated code : Only an Implementation suggestion
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF
调用时,此函数将获取以下输入参数:
ovalue:要分配给范围类型的值
olower:范围的下限
oupper:范围的上限
只要分配的值在有效范围内,则将会用作该函数的返回值。否则,作为范围违例的响应,将返回范围的上限或下限。
现在,分配 i:=10*y 将被隐式替换为
i := CheckRangeSigned(10*y, -4095, 4095);
例如,如果 y 具有值 1000,则变量 i 将不会被分配给 10*1000=10000(如由原始实现提供),而是分配给范围的上限(即,4095)。
同样情况还适用于函数 CheckRangeUnsigned。
注意: 如果函数均不可用,则在运行期间,不会对子范围类型进行类型检查。在这种情况下,您可以为子范围类型 DINT/UDINT 的变量分配任意 DINT/UDINT 值。您可以为子范围类型 LINT/ULINT 的变量分配任意 LINT/ULINT 值。