code学习

博图学习---间接寻址(3)——Variant指针

作者:陈磊生活随记

草稿没保持,重新记录的。

1、Variant指针

博图学习---间接寻址(3)——Variant指针

Variant

Variant数据类型的参数是一个指针或引用,可指向各种不同数据类型的变量。

Variant指针可指向各种不同数据类型的变量。既可以是基本数据类型(例如, INT或 REAL )的对象;亦可以是复杂的 STRING 、 DTL 、 STRUCT 类型的 ARRAY , UDT , UDT 类型的 ARRAY 。

VARIANT 类型是一个参数数据类型。使用 VARIANT 数据类型,可为各种数据类型创建通用的标准函数块(FB )或函数( FC )。例如:如果函数的块参数为 Variant数据类型,那么整数数据类型的变量可以在程序中的一个点处传递,而 UDT 类型的变量可以在程序中的另一个点处传递。借助 vA R 1 A NT 指令,函数可以随时正确响应这种情况,而不会出错。

在程序运行过程中, VARIANT 指针可以识别结构,并指向各个结构元素。因此 Variant指针不仅可以向被调程序块传递实参的‘地址信息”(即指针),同时还可以传递实参的”类型信息’’。在被调程序块内部,借助于 VARIANT 指针类型以及专用的指令,可以简化对复杂数据类型实参的访问过程。

Variant 指针既可以指向标准存储区,也可以指向优化存储区。

VARIANT 数据类型的操作数不占用背景数据块或工作存储器中的空间。但是,将占用 CPU 上的存储空间。

2、Variant指针的声明

博图学习---间接寻址(3)——Variant指针

Variant 类型的声明

在函数( FC)的接口区,可以将Variant指针类型应用于函数的各种类型参数号及临时变量,对于函数块( FB ) ,则只能在 lN 、 IN/OUT 类型参数及临时变量中应用 Variant 指针类型。Variant指针的声明对FC 或 FB 块的优化访问特性无特殊要求。

注意!

Variant类型的单个元素只能声明为形参或临时变量。因此,不能在数据块或函数块的块接口静态部分中声明。

3、Variant指针的参数化

博图学习---间接寻址(3)——Variant指针

Variant 类型的参数化

在调用块并为 VARIANT 类型参数赋值实参时,可以使用绝对寻址及符号寻址方式指向任意数据类型的实参变量,但不能赋值为另外的 VARIANT 指针参数。即不能嵌套”使用 Variant指针参数,这一限制需要在程序的嵌套调用过程中加以注意。

根据 VARIANT 指针类型的特点,建议规划数据结构将实参的数据类型整合为数组,才能更好地发挥Variant指针的优势。

4、Variant指令

博图学习---间接寻址(3)——Variant指针

Variant类型的指令

博图平台为用户提供了专用的指令用于处理与Variant指针类型相关的对象,这些指令大体上可以分为三种类型:

  • 数据类型判定指令
  • ARRAY元素求值指令
  • Variant变量读写操作指令
博图学习---间接寻址(3)——Variant指针
博图学习---间接寻址(3)——Variant指针

1)数据类型判定指令

博图学习---间接寻址(3)——Variant指针

Variant指针的数据类型判断指令,包含在任务卡的指令--基本指令--比较器运算文件夹中。在被调用程序块内部,可以利用数据类型判定指令对Variant指针传递的实参的类型信息进行访问,并以布尔量状态给出类型判定的结果。

博图学习---间接寻址(3)——Variant指针

2)ARRAY元素求值指令

博图学习---间接寻址(3)——Variant指针

对ARRAY元素求值,可以通过指令检查Variant变量指向的数据类型是否为数组。如果确定指向为数组类型,则可以使用相应指令获取数组中的ARRAY元素的个数。进一步地,在某些循环语句中,可以将获取的元素个数用于控制循环进行的次数,比如数据库的搜索过程。

博图学习---间接寻址(3)——Variant指针

3)Variant变量读写操作指令

博图学习---间接寻址(3)——Variant指针

读取Variant指向的数据

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

博图学习---间接寻址(3)——Variant指针

将数据分配给Variant变量

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

博图学习---间接寻址(3)——Variant指针

4)处理动态ARRAY结构

博图学习---间接寻址(3)——Variant指针
  • 数组之间的移动操作、

借助于Variant指针,可以使用MOVE_BLK_VARIANT指令将源端存储区的数据移动到目的端存储区。可以将一个完整的数组复制到另一个数据类型相同的数组中,也可以复制数组中的一个或多个数组元素。指令中的参数SRC_INDEX和DEST_INDEX始终将从下限0开始计数,与数组元素的索引编号声明无关。

博图学习---间接寻址(3)——Variant指针
  • 数组与非数组之间的移动操作

借助Variant指针,使用MOVE_BLK_VARIANT指令也可以实现数组与其他数据类型之间的移动操作,完成数组内元素的循环读写访问。

博图学习---间接寻址(3)——Variant指针

5)MOVE_BLK_VARIANT的使用说明

博图学习---间接寻址(3)——Variant指针

在使用MOVE_BLK_VARIANT指令的过程中,需注意:

  • 指令参数SRC,DEST的数据类型为Variant,可以使用绝对寻址及符号寻址方式指向任意数据类型的实参变量(基本类型或复杂类型的直接地址均可),也可以通过定义Variant类型的指针参数间接指向一个实际地址。
  • 如果参数SRC中直接或间接未指定数组,则必须将参数SRC_INDEX赋值为0,;同样,如果参数DEST中直接或间接未指定的任何数组,则必须将参数DEST_INDEX赋值为0。
  • 只要参数SRC或者DEST中任意一个指定的不是数组类型的实际地址,则参数COUNT只能等于1.
  • 源端SRC的数据类型不能为布尔量和由布尔量组成的数组。
  • 目的端DEST通常指向被调程序块内事先声明的临时变量,如果指向被调程序块的参数,则只能是IN/OUT类型的参数。

6)Variant指令的一般使用过程

博图学习---间接寻址(3)——Variant指针

程序模板:

博图学习---间接寻址(3)——Variant指针

继续阅读