4.2 VARIANT与DB_ANY
4.1章节的示例程序在调用时只能赋值一个固定的类型,例如PZD8_IN或者PZD10_IN,一些应用需要赋值的参数也要根据要求变换,例如MES系统向PLC发送一组物料信息,PLC系统接收到数据后进行判断然后处理,MES系统可以向PLC发送不同的物料信息,每种物料信息的属性可以是不一样的,如果按照上面示例的方式,必须调用程序块多次,然后赋值给参数不同的物料信息,使用DB_ANY变量可以解决这样的问题,可以将PLC数据类型存储在数据块中,然后转换为VARIANT变量,最后对VARIANT变量进行分析判断从而得到需要处理的物料类型,参考下面的应用示例。
例如一个应用要处理3个不同的物料,物料信息由MES发送到PLC,在PLC中需要判断物料的类型,然后分别处理。
建立3个PLC数据类型Material_A 、Material_B 和Material_C代表3个物料类型 ,然后以这3个数据类型建议3个数据块 DB_ Material_A 、DB_ Material_B 和 DB_ Material_C。
创建一个FC块,接口声明和程序代码如图23所示。
图 23
指令DB_ANY_TO_VARIANT可以将输入的参数DB_ANY转换为VARIANT,DB_ANY的使用是有要求的,必须是格式固定的,参考下表(TIA博途的在线帮助)中的加粗标记。
程序中将DB_ANY类型转换为VARIANT类型,然后判断输入的PLC数据类型的格式,分别执行处理物料A、B和C的程序。
程序块在主程序中调用,如图24所示。
图 24
调用程序块时可以使用INT类型赋值DB ANY,例如“Tag_2”,“Tag_2”在变量表中定义的数据类型为DB ANY,“Tag_2”值与数据块的号相对应,例如值为3,表示输入的数据块为DB3。
有一个小问题,好像PLC系统并不能解析存储于数据块中的数据类型,调用DB_ANY_TO_VARIANT可能会得到输出错误代码 #8155,下面是TIA博途在线帮助中列出的原因和解决办法:
声明了一个 PLC 数据类型 (UDT1) 并创建了一个数据类型为“UDT1”的数据块 (例如DB2)。变量表中创建一个数据类型为 DB_ANY 的变量 (例如Tag_2)。随后,在主程序中调用了指令“DB_ANY_TO_VARIANT”并在 IN 参数中赋值变量 Tag_2。执行时,指令“DB_ANY_TO_VARIANT”返回错误代码 16#8155。
通过以下步骤消除该错误代码:
1)创建函数 (FC5) 并在 InOut 接口中声明数据类型为 VARIANT 的变量。
2)创建另一函数 (FC6),在 FC6 中的 Temp 接口中创建数据类型为“UDT1”的变量(例如Tag_1),然后调用 FC5,为 FC5 的 InOut 接口赋值变量Tag_1。
3)编译函数块(FC5 和 FC6)并下载到 CPU 中。在用户程序中无需调用这些块(FC5 和 FC6)。其实就是让系统先识别一下PLC数据类型,然后再调用就没有问题了,无语了。
4.3 VARIANT与数组DB
数组DB也是一个固定格式,就是在创建数据块时选择数组DB,参考图25。
图 25
数组DB与在全局DB中建立一个数组有什么区别呢?通常在全局数据块中包含一个或者多个数组,可能还有其它的变量,也就是说数组DB格式固定,可以与VARIANT进行转换。下面看一看数组DB的应用场合。
例如有一个应用,将接收到的物料信息(包括物料号、名称、数量、单位)存放到一个数据块中(堆栈操作)。如果存放满了,将覆盖最先进入的信息。函数、函数块的开发者面临的难题是不知道程序块使用者(开发与使用分开)赋值物料信息的格式和存储的个数(数据块的大小),这时使用VARIANT和数组DB将使开发过程变得非常容易,下面介绍实现的过程。
首先创建一个PLC数据类型“Mess_queue”,格式如图26所示。
图 26
然后创建一个函数,例如FC_Enqueue(堆栈操作),函数的接口声明如图27所示。
图 27
编写的代码如图28所示。
图 28
使用者需要创建物料的PLC数据类型“Material”和数组DB “materialBuffer”,并定义数组的长度,数组DB如图29所示。
图 29
然后创建一个PLC数据类型(Mess_queue)的DB,名称为“Material_DB”,并在启
动OB中初始化,如图30所示。
图 30
注意这里非常重要,将数组DB“materialBuffer”赋值给一个DB_ANY变量。在主程序中调用FC_Enqueue并赋值,如图31所示。
图 31
输入变量“material_input”为PLC数据类型“Material”,在变量表中定义,开始地址为I100.0。 在这个示例中,程序的开发者在编写堆栈程序块FC_Enqueue时,使用VARIANT指针替代了未知的物料信息,使用DB_ANY替代了物料堆栈的存储空间。使用者创建物料堆栈的存储空间,必须是数组DB,然后通过DB_ANY传递给指令“WriteToArrayDB”,数组DB的使用在这里起到了至关重要的作用。
4.4 VARIANT与数组
VARIANT还可以指向一个数组,得到数组的类型、元素的类型和长度信息,主要用于数
据格式的比较。下面以示例方式介绍VARIANT与数组的使用。与介绍Any指针的应用相同,给定一个数组,如果数组元素的数据类型为浮点,求这个数组所有元素的平均值(接《从S7-300_400到S7-1500看变址寻址的改变-6》,3.6 节 的第三种方法)。首先创建一个FC,例如名称为AVERAGE,接口声明如图32所示。
图 32
函数AVERAGE的代码如图33所示。
图 33
代码说明:
通过形参“vaule”判断赋值的实参数据类型是否为数组、数组元素的数据类型是否为浮点,如果满足上述要求,使用指令“countofElements”得到数组的个数。数组的个数用于循环累加的次数。使用指令“MOVE_BLK_VARIANT”每次将数组一个元素(索引从0开始,与赋值数组的索引无关)的值存储到临时变量“temp_value”,然后进行累加运算,将累加的结果存储到临时变量“temp_valueadd”中,最后输出平均值到输出参数“value_out”中。
-----------------------------------------------------------------------------------------------------------
上一篇:【7】Variant数据类型指针——从S7-300_400到S7-1500看变址寻址的改变系列故事之七
下一篇:【9】引用(终结)——从S7-300_400到S7-1500看变址寻址的改变系列故事之九
汇总帖:技术Π活动故事、视频与案例分享汇总