子范围类型

概述

子范围类型是用户定义的类型,其值范围只是基本数据类型的子集。还可以使用隐式范围边界检查

您可以在 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),则会发出一条消息。

范围边界的检查函数

为了在运行期间不超出子范围类型的范围边界,必须将函数CheckRangeSignedCheckLRangeSignedCheckRangeUnsignedCheckLRangeUnsigned 添加到应用程序。关于插入函数的信息,请参阅用于隐式检查的 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

调用时,此函数将获取以下输入参数:

  • value:要分配给范围类型的值

  • lower:范围的下限

  • upper:范围的上限

只要分配的值在有效范围内,则将会用作该函数的返回值。否则,作为范围违例的响应,将返回范围的上限或下限。

现在,分配 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 值。