子集类型

子集类型是一个 用户定义类型 其值域是只有一个子集的基本数据类型。注意使用 隐藏域边界检查

声明可以在 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 在声明事例顶端显示),一个错误信息将被发布。

域边界的检查函数

为了在运行过程中检查域的限制,函数CheckRangeSignedCheckRangeUnsigned必须在应用中可用。因此通过添加对象 隐藏检查POUS 到应用中。使用 添加对象 对话框,标记与CheckRangeSigned 或 CheckRangeUnsigned 类型相关的复选框,选择一种执行语言并通过 “打开”确认设置, 选择部分的独立是预设的并且不得修改除了添加更多的本地变量! 一个建议的默认实现的函数可能被修改在ST编辑器中。

此检查功能的目的是恰当的子集违规处理(如设置一个检测到的错误旗帜或改变值)。当一个变量的子集类型被确认后这个功能将被隐藏访问。

小心!

为了保持检查的功能且不改变隐含的检查功能的声明部分!

例子:

属于分配的子集类型变量的分配涉及隐式调用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

 

当访问这个功能时得到以下输入参数:

  • 值:域类型被分配的值
  • 低:域的下限
  • 高:域的上限

如果被分配的值是在有效的域内,他将作为功能中的返回值被使用。否则—对应范围内违反—要么上限或下边界的范围将被返回。

 

分配 i:=10*y 将被隐性替代为

i := CheckRangeSigned(10*y, -4095, 4095);

如果y的值为 '1000',变量i 将不会分配到原始执行提供的 10*1000=10000 , 但上边界范围为4095

 

相同地应用在函数CheckRangeUnsigned上。

提示!

如果函数 CheckRangeSigned 或 CheckRangeUnsigned 都不存在,则在运行过程中没有子集类型发生! 此时变量 i 获得值 –32768 和32767 直接的任意值!

小心!

使用CheckRangeSigned指令和CheckRangeUnsigned的功能,可能会导致在一个无限循环,例如,如果一个子界类型被用作循环不匹配子范围的增量。

无限循环例子:

VAR

 ui : UINT (0..10000);

END_VAR

 

FOR ui:=0 TO 10000 DO

...

END_FOR

FOR循环将永远不会离开作为检查功能可以防止变量ui分配值大于10000。