博途新变量:有关VARIANT的基本信息

描述

说明

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)
长度(字节) 表示法 格式 输入值示例
0 符号 操作数 "TagResult"
数据块名称.操作数名称.元素 "Data_TIA_Portal".StructVariable.FirstComponent
绝对 操作数 %MW10
数据块编号.操作数 类型长度 P#DB10.DBX10.0 INT 12 1)
NULL 指针 NULL

数据类型的编码

如果通过 P# 使用绝对寻址,则允许使用以下数据类型:

BOOL

BYTE

CHAR

WORD

INT

DWORD

DINT

REAL

TIME

S5TIME

DATE

TOD

DT

示例

以下示例说明了 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”操作数中。

  VARIANT 指令的应用方式

简介

在下一章中,您将了解可用于 VARIANT 指令的应用选项。

对 VARIANT 指向的变量的数据类型求值

在下表中,您将看到可使用哪些指令来对 VARIANT 指向的变量的数据类型求值:

函数 指令 说明
确定数据类型 TypeOf():检查 VARIANT 变量的数据类型
(该指令仅适用于 SCL,且只能与 IF 或 CASE 指令一起使用。)
可使用该指令将 VARIANT 变量指向的数据类型与任何其它变量的数据类型进行比较。也可以与 PLC 数据类型作比较。
TypeOfElements():扫描 VARIANT 变量 ARRAY 元素的数据类型
(该指令仅适用于 SCL,且只能与 IF 或 CASE 指令一起使用。)
可使用该指令将 VARIANT 变量指向的数据类型与任何其它变量的数据类型进行比较。也可以与 PLC 数据类型作比较。如果 VARIANT 变量的数据类型为 ARRAY,则将比较 ARRAY 元素的数据类型。
EQ_Type:比较数据类型与变量数据类型是否“相等”
NE_Type:比较数据类型与变量数据类型是否“不相等”
可使用该指令将 VARIANT 变量指向的数据类型与任何其它变量的数据类型进行比较。也可以与 PLC 数据类型作比较。
EQ_ElemType:比较 ARRAY 元素数据类型与变量数据类型是否“相等”
NE_ElemType:比较 ARRAY 元素数据类型与变量数据类型是否“不相等”
可使用该指令将 VARIANT 变量指向的数据类型与任何其它变量的数据类型进行比较。也可以与 PLC 数据类型作比较。如果 VARIANT 变量的数据类型为 ARRAY,则将比较 ARRAY 元素的数据类型。
对 ARRAY 元素求值 IS_ARRAY:检查 ARRAY 可使用该指令检查 VARIANT 变量指向的数据类型是否为 ARRAY。
CountOfElements:获取 ARRAY 元素个数 可使用该指令读出该变量中 VARIANT 变量指向了多少个 ARRAY 元素。

可以在信息系统的“基本指令 > 对应编程语言”(Basic instructions > Respective programming language) 下找到有关各种指令的其它信息。

读取 VARIANT 指向的数据

为了能够使用数据,您必须在一个中间步骤中将该数据移到变量中,因为无法直接处理该数据。

指令 说明 示例 结果
VARIANT 指向 目标数据类型
VariantGet:读取 VARIANT 变量值 可使用该指令将单个变量的值移到另一个变量中。这两个变量的数据类型必须匹配。 UDT_1 UDT_1 已执行该指令。
REAL REAL
DINT DWORD 该指令未执行。

将数据分配给 VARIANT 变量

无法使用该指令来初始化 VARIANT 变量。因此,在将数据返回到变量时必须已经初始化 VARIANT 变量。请勿使用未初始化的临时 VARIANT 变量。

指令 说明 示例 结果
源数据类型 VARIANT 指向:
VariantPut:写入 VARIANT 变量值 可使用该指令将单个变量的值移到另一个变量中。这两个变量的数据类型必须匹配。 UDT_1 UDT_1 已执行该指令。
REAL REAL
DINT DWORD 将不执行该指令,因为数据类型不同。

处理动态 ARRAY 结构

对 ARRAY 元素求值 TypeOfElements():扫描 VARIANT 变量 ARRAY 元素的数据类型
(该指令仅适用于 SCL,且只能与 IF 或 CASE 指令一起使用。)
可使用该指令将 VARIANT 变量指向的数据类型与任何其它变量的数据类型进行比较。也可以与 PLC 数据类型作比较。如果 VARIANT 变量的数据类型为 ARRAY,则将比较 ARRAY 元素的数据类型。
IS_ARRAY:检查 ARRAY 可使用该指令检查 VARIANT 变量指向的数据类型是否为 ARRAY。
CountOfElements:获取 ARRAY 元素个数 可使用该指令读出该变量中 VARIANT 变量指向了多少个 ARRAY 元素。
MOVE_BLK_VARIANT:块移动 可使用该指令移动动态和类型安全(集成类型测试)ARRAY。可以为源和目标 ARRAY 自由选择限值。ARRAY 元素的数据类型必须匹配。
说明
MOVE、MOVE_BLK 和 MOVE_BLK_VARIANT 之间的区别
可使用“MOVE”指令来复制完整的结构。
可使用“MOVE_BLK”指令来移动具有已知数据类型的 ARRAY 的部分。
仅在您想要移动其数据类型仅在程序运行时期间已知的 ARRAY 的部分时,才需要使用 MOVE_BLK_VARIANT 指令。

   

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分