技术论坛

 【8】Variant的使用——从S7-300_400到S7-1500看变址寻址的改变系列故事之八

返回主题列表
作者 主题
空果仁
侠圣

经验值: 4925
发帖数: 210
精华帖: 47
楼主    2020-04-01 12:07:50
主题:【8】Variant的使用——从S7-300_400到S7-1500看变址寻址的改变系列故事之八 精华帖 

 

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看变址寻址的改变系列故事之九

汇总帖:技术Π活动故事、视频与案例分享汇总

 

 

                       

来自西门工业子技术支持 高级专家
渔明鱼工
至圣

经验值: 23880
发帖数: 2059
精华帖: 78
1楼    2020-04-01 13:50:20
主题:回复:从S7-300_400到S7-1500看变址寻址的改变-8

感谢崔工,值得学习。

网鱼能够改善伙食,还能释放工作中的压力。
CoolCool的猪
至圣

经验值: 16692
发帖数: 1307
精华帖: 2
7楼    2020-04-03 23:11:33
主题:回复:从S7-300_400到S7-1500看变址寻址的改变-8

跟着组织走 

同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。