热门搜索:
西门子AS-I总线控制产品
上海朕锌电气设备有限公司
西门子销售部 cpu plc s7-200
s7-300 s7 400 s7 1200 s7 1500
mm440 mm430 mm420 g120 变频器 V90变频器
s7 288模块 伺服电机 触摸屏
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