子集类型是一个 ⇘ 用户定义类型 其值域是只有一个子集的基本数据类型。注意使用 ⇘ 隐藏域边界检查。
声明可以在 ⇘ 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> |
是一个常数,它必须是兼容的基本类型,并设置范围类型的上边界。上边界本身包含在该基本类型。 |
带有子集类型的一个变量的直接声明
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR
如果一个值被分配到一个子集类型(在声明中或在执行中),但是与这个域不匹配(例如i:=5000 在声明事例顶端显示),一个错误信息将被发布。
为了在运行过程中检查域的限制,函数CheckRangeSigned或CheckRangeUnsigned必须在应用中可用。因此通过添加对象 ⇘ 隐藏检查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上。