草稿没保持,重新记录的。
1、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指针的声明
Variant 类型的声明
在函数( FC)的接口区,可以将Variant指针类型应用于函数的各种类型参数号及临时变量,对于函数块( FB ) ,则只能在 lN 、 IN/OUT 类型参数及临时变量中应用 Variant 指针类型。Variant指针的声明对FC 或 FB 块的优化访问特性无特殊要求。
注意!
Variant类型的单个元素只能声明为形参或临时变量。因此,不能在数据块或函数块的块接口静态部分中声明。
3、Variant指针的参数化
Variant 类型的参数化
在调用块并为 VARIANT 类型参数赋值实参时,可以使用绝对寻址及符号寻址方式指向任意数据类型的实参变量,但不能赋值为另外的 VARIANT 指针参数。即不能嵌套”使用 Variant指针参数,这一限制需要在程序的嵌套调用过程中加以注意。
根据 VARIANT 指针类型的特点,建议规划数据结构将实参的数据类型整合为数组,才能更好地发挥Variant指针的优势。
4、Variant指令
Variant类型的指令
博图平台为用户提供了专用的指令用于处理与Variant指针类型相关的对象,这些指令大体上可以分为三种类型:
- 数据类型判定指令
- ARRAY元素求值指令
- Variant变量读写操作指令
1)数据类型判定指令
Variant指针的数据类型判断指令,包含在任务卡的指令--基本指令--比较器运算文件夹中。在被调用程序块内部,可以利用数据类型判定指令对Variant指针传递的实参的类型信息进行访问,并以布尔量状态给出类型判定的结果。
2)ARRAY元素求值指令
对ARRAY元素求值,可以通过指令检查Variant变量指向的数据类型是否为数组。如果确定指向为数组类型,则可以使用相应指令获取数组中的ARRAY元素的个数。进一步地,在某些循环语句中,可以将获取的元素个数用于控制循环进行的次数,比如数据库的搜索过程。
3)Variant变量读写操作指令
读取Variant指向的数据
为了能够使用数据,必须在一个中间步骤中将该数据移到变量中,因为无法直接处理该数据。
将数据分配给Variant变量
无法使用该指令来初始化Variant变量。因此,在将数据返回到变量时必须已经初始化Variant变量。请勿使用未初始化的临时Variant变量。
4)处理动态ARRAY结构
- 数组之间的移动操作、
借助于Variant指针,可以使用MOVE_BLK_VARIANT指令将源端存储区的数据移动到目的端存储区。可以将一个完整的数组复制到另一个数据类型相同的数组中,也可以复制数组中的一个或多个数组元素。指令中的参数SRC_INDEX和DEST_INDEX始终将从下限0开始计数,与数组元素的索引编号声明无关。
- 数组与非数组之间的移动操作
借助Variant指针,使用MOVE_BLK_VARIANT指令也可以实现数组与其他数据类型之间的移动操作,完成数组内元素的循环读写访问。
5)MOVE_BLK_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指令的一般使用过程
程序模板: