说明
VARIANT 数据类型的参数是一个指针或引用,可指向各种不同数据类型的变量。VARIANT 指针无法指向实例,因此不能指向多重实例或多重实例的 ARRAY。VARIANT 指针可以是基本数据类型(例如,INT 或 REAL)的对象。还可以是 STRING、DTL、STRUCT 类型的 ARRAY、UDT、UDT 类型的 ARRAY。VARIANT 指针可以识别结构,并指向各个结构元素。VARIANT 数据类型的操作数不占用背景数据块或工作存储器中的空间。但是,将占用 CPU 上的存储空间。
VARIANT 类型的变量不是一个对象,而是对另一个对象的引用。在函数的块接口中的 VAR_IN、VAR_IN_OUT 和 VAR_TEMP 部分中,VARIANT 类型的单个元素只能声明为形参。因此,不能在数据块或函数块的块接口静态部分中声明,例如,因为各元素的大小未知。所引用对象的大小可以更改。
使用 VARIANT 数据类型时,可为各种数据类型创建通用的标准函数块 (FB) 或函数 (FC)。为此,可使用所有编程语言中的各种指令。在程序创建过程中,可指定该块可处理数据类型。在此,可使用 VARIANT 数据类型对各种变量进行互连。之后,再根据这些变量在块中的数据类型进行响应。调用某个块时,可以将该块的参数连接到任何数据类型的变量。调用某个块时,除了传递变量的指针外,还会传递变量的类型信息。块代码随后可以根据运行期间传递的变量类型来执行。
例如,如果函数的块参数为 VARIANT 数据类型,那么整数数据类型的变量可以在程序中的一个点处传递,而 PLC 数据类型的变量可以在程序中的另一个点处传递。借助 VARIANT 指令,函数随后可以正确响应这种情况,而不会出错。
说明 如果一个数据块最初的数据类型为用户自定义的数据类型 (UDT),那么只能指向完整的数据块。 |
说明 访问 I/O 只有 S7-1500 模块的 CPU 才能直接读写 I/O 输出或输出中的信号。(<操作数>:P) |
下表列出了 VARIANT 指针的属性:
长度(字节) | 表示法 | 格式 | 输入值示例 |
---|---|---|---|
0 | 符号 | 操作数 | "TagResult" |
数据块名称.操作数名称.元素 | "Data_TIA_Portal".StructVariable.FirstComponent | ||
绝对 | 操作数 | %MW10 | |
数据块编号.操作数 类型长度 (仅对可标准访问的块有效) |
P#DB10.DBX10.0 INT 12 1) | ||
NULL 指针 | NULL | ||
1) 如果使用前缀 P#,则只能指向“标准”访问模式的存储区。 |
数据类型的编码
如果通过 P# 使用绝对寻址,则允许使用以下数据类型:
十六进制代码 | 数据类型 | 说明 |
---|---|---|
B#16#00 | NIL | Null 指针 |
B#16#01 | BOOL | 位 |
B#16#02 | BYTE | 字节,8 位 |
B#16#03 | CHAR | 8 位字符 |
B#16#04 | WORD | 16 位字 |
B#16#05 | INT | 16 位整数 |
B#16#06 | DWORD | 32 位字 |
B#16#07 | DINT | 32 位整数 |
B#16#08 | REAL | 32 位浮点数 |
B#16#0B | TIME | 持续时间 |
B#16#0C | S5TIME | 持续时间 |
B#16#09 | DATE | 日期 |
B#16#0A | TOD | 日期和时间 |
B#16#0E | DT | 日期和时间 |
B#16#13 | STRING | 字符串 |
B#16#17 | BLOCK_FB | 函数块 |
B#16#18 | BLOCK_FC | 函数 |
B#16#19 | BLOCK_DB | 数据块 |
B#16#1A | BLOCK_SDB | 系统数据块 |
B#16#1C | COUNTER | 计数器 |
B#16#1D | TIMER | 定时器 |
示例
以下示例说明了 VARIANT 使用 STL 指令“MOVE:移动值”的工作原理:
STL | 说明 |
---|---|
CALL MOVE | // 调用指令。 |
value_type := VARIANT | // 参数 IN 和 OUT 的数据类型 |
IN := "Data_TIA_Portal".StructVariable.FirstComponent | // 从“Data_TIA_Portal”数据块移动操作数“FirstComponent”中的数据。 |
OUT := "MotorDB".StructResult.TagResult | // 从“MotorDB”数据块传送到“TagResult”操作数中。 |
编程示例
在此编程示例中,将移动在生产班次期间为示例收集的数据值以作进一步处理。收集的数据放在 ARRAY 中。通过“MOVE_BLK_VARIANT:移动块”(Move block) 指令,可以动态或以类型安全方式移动整个 ARRAY 或个别 ARRAY 元素。可以为源和目标 ARRAY 自由选择 ARRAY 限值,这些限值不必匹配。但是,要移动的数据值的数据类型必须匹配。该指令在所有编程语言中都可用。
通过 VARIANT 数据类型,也可以使用已创建的程序代码并通过在块调用中指定不同的源和目标区域来移动另一个生产班次的数据。
骤
使用 SCL 编程语言创建函数并将其命名为“FC_PartialArrayCopy”。 按如下方式声明块接口: 按如下方式创建 SCL 程序代码: 可以找到以下程序代码作为模板。 创建 PLC 数据类型“UDT_MyStruct”: 创建全局数据块“DB_WithArrays”: 在组织块(例如 OB1)中调用“FC_PartialArrayCopy”函数,并使用 DB_WithArrays 数据块初始化参数。输入指定的常量: 也可以使用第三个和第四个 ARRAY(数据类型为 REAL)来代替使用前两个 ARRAY (数据类型为 UDT_MyStruct)。 |
结果
在程序周期中调用“FC_PartialArrayCopy”块后,会将从第四个元素开始的两个数据值立即从“DB_WithArrays”全局数据块的第一个 ARRAY 复制到该数据块的第二个 ARRAY 中。复制的数据值将插入到第二个 ARRAY 中(从第四个元素开始)。
用于复制的 SCL 程序代码:
SCL |
---|
IF IS_ARRAY(#SourceArray) AND TypeOfElements(#SourceArray) = TypeOfElements(#DestinationArray) THEN |
#Error := MOVE_BLK_VARIANT(COUNT := #Count, SRC := #SourceArray, SRC_INDEX := #SourceIndex, |
DEST => #DestinationArray, DEST_INDEX := #DestinationIndex); |
END_IF; |
#FC_PartialArrayCopy := #Error; |
全部0条评论
快来发表一下你的评论吧 !