DB_ANY 数据类型用来标识任意数据块。对于 S7-1200,可以选择访问编程期间尚不可用的数据块。为此,在访问块的块接口中创建一个 DB_ANY 数据类型的块参数。数据块名称或先前分配给数据块名称的 DB_ANY 数据类型的变量将在运行期间传送到此参数。
DB_ANY目前有4种用法以及2个隐藏指令:
1. DB_ANY指向非优化DB块,可以在程序中使用DB_ANY.%绝对地址。
这种方法LAD和SCL都可以使用,这种使用方式类似于S7-300/S7-400的BLOCK_DB,如图1-2所示。
![8cb642680dd0d90cf14dfec17ac2c165.png](https://img-blog.csdnimg.cn/img_convert/8cb642680dd0d90cf14dfec17ac2c165.png)
图1 指令详情
SCL的版本,如图2所示。
![ad7994b82a9084f9f931463a398af09f.png](https://img-blog.csdnimg.cn/img_convert/ad7994b82a9084f9f931463a398af09f.png)
图2 指令SCL版本
使用这种方式时注意:
(1) CPU编译时不检查数据类型,可能会出现如图3所示的错误。所以请一定核实数据类型。
![f5ea05eec453d96145de9ea1002316cd.png](https://img-blog.csdnimg.cn/img_convert/f5ea05eec453d96145de9ea1002316cd.png)
图3 错误的数据类型
(2)不检查地址存在与否。如果调用不存在的地址,CPU会报错如图4所示的区域长度错误,所以敬请注意。
![edc8d377c8c40f32088915f0f0d5f466.png](https://img-blog.csdnimg.cn/img_convert/edc8d377c8c40f32088915f0f0d5f466.png)
图4 区域长度错误
(3)这种绝对地址是不支持变址,例如%DBW[x]不支持。
(4)不支持对符号名的访问,例如Input_1.Static_1不支持。
DB_ANY作为输入形参,调用参数的时候三种方式:
(1)在DB_ANY参数引脚填写DB块号,如图5所示
![d7b8bea95022844ff19463313eae0377.png](https://img-blog.csdnimg.cn/img_convert/d7b8bea95022844ff19463313eae0377.png)
图5 参数为DB块号
(2)在DB_ANY参数引脚填写DB块符号名,如图6所示
![9b5bd0ea4938425ed7721b1e2b764642.png](https://img-blog.csdnimg.cn/img_convert/9b5bd0ea4938425ed7721b1e2b764642.png)
图6 参数为DB块符号名
(3)在DB_ANY参数引脚填写DB_ANY类型的变量,如图7-8所示
![f1052e547b82a7e75a2c9e49383d9e72.png](https://img-blog.csdnimg.cn/img_convert/f1052e547b82a7e75a2c9e49383d9e72.png)
图7 参数为DB_ANY类型变量
![22fd94daf4304413f6e44fa59ca6b357.png](https://img-blog.csdnimg.cn/img_convert/22fd94daf4304413f6e44fa59ca6b357.png)
图8 DB_ANY类型变量的定义
DB_ANY作为输出、输入输出形参,调用参数的时候只能参考图7的方式。
根据(1)中的程序,计算结果都是一样的,如图9所示。
![ff4d5d371198507a8e97fe0017ebe29b.png](https://img-blog.csdnimg.cn/img_convert/ff4d5d371198507a8e97fe0017ebe29b.png)
图9 计算结果
2. TIA 博途 V13SP1,S7-1200 V4.0开始,如果DB_ANY指向通过PLC数据类型(UDT)或者系统数据类型(例如IEC_TIMER等)建立的DB块,此时S7-1200在SCL中提供了两个指令用于DB_ANY和Variant类型之间进行转化,如图10所示,如图11-12所示为指令参数:
![5cb98c720a426e701f5964f9086e9079.png](https://img-blog.csdnimg.cn/img_convert/5cb98c720a426e701f5964f9086e9079.png)
图10 指令位置
![39b6662c0ce8234f01c05ae56ece9a41.png](https://img-blog.csdnimg.cn/img_convert/39b6662c0ce8234f01c05ae56ece9a41.png)
图11 DB_ANY_TO_VARIANT参数
![1434de3c0e3fa11180968f1936336fd4.png](https://img-blog.csdnimg.cn/img_convert/1434de3c0e3fa11180968f1936336fd4.png)
图12 VARIANT_TO_DB_ANY指令参数
对于这两个指令,注意:
1. DB_ANY类型实参一定是通过PLC数据类型(UDT)或者系统数据类型建立的DB块,否则指令会报错。
2. Variant类型指向的变量类型,一定要和DB_ANY指向的建立DB块的数据类型相同,否则指令会报错。
3. DB_ANY_TO_VARIANT是目前S7-1200唯一可以初始化FC/FB/OB的Temp中的Variant变量的指令,如果运行正确,则可以使用后续Variant处理指令,例如VariantGet,MOVE_BLK_VARIANT,Serialize等。
4. 同(3),VARIANT_TO_DB_ANY所使用的Variant输入,如果来自于FC/FB/OB的Temp中的Variant变量,也一定是通过DB_ANY_TO_VARIANT初始化过的才可以。
5. 如果形参类型是Variant的FC/FB/指令,在实参填写了DB块,要求该DB一定是基于UDT或者系统数据类型建立,并且FC/FB/指令将按照UDT或者系统数据类型来处理该变量,例如:
这种用法是正确的,输入是UDT_1类型建的DB,右边是UDT_1类型的变量,如图13所示。
![44c263f61fe22f68c20da00248bb1819.png](https://img-blog.csdnimg.cn/img_convert/44c263f61fe22f68c20da00248bb1819.png)
图13 正确使用
这种用法是不正确的,输入是UDT_1类型建的DB,右边是DB_ANY类型的变量,如图14所示。
![4108287f79e5682a8bce7b79975f232e.png](https://img-blog.csdnimg.cn/img_convert/4108287f79e5682a8bce7b79975f232e.png)
图14 错误使用
这种方法的使用场合:
如果每种产品有大量数据,有很多种产品,每种产品的数据都是相同结构。可以基于相同结构建立UDT,每一种产品基于UDT建立DB(也可以在一个DB中建立UDT的数组,但是从变量名处就无法分清哪种变量对应哪种产品)。然后在一个DB块内建立DB_ANY的数组,在每个DB_ANY变量的起始值处填写需要指向的DB块号。可以通过循环的方式访问每个DB_ANY,将其转化为UDT,处理后再送回该DB_ANY。
例子1:DB37-DB40均为UDT1建立的DB,如图15所示。DB36建立数据类型为Array[0..3] of DB_ANY的变量,如图16所示,起始值分别是DB37,DB38,DB39,DB40。FC22的参数InOut为UDT_1类型变量,用于数据处理,如图17所示。FC21多次调用FC22,如图18所示。
![f09a8534886ce3a2cc4520804952be5a.png](https://img-blog.csdnimg.cn/img_convert/f09a8534886ce3a2cc4520804952be5a.png)
图15 待使用的DB_ANY引用的数据块
![fcdce64004bde02cbeb3cf71f6b016ff.png](https://img-blog.csdnimg.cn/img_convert/fcdce64004bde02cbeb3cf71f6b016ff.png)
图16 DB_ANY数组及起始值
![f2f49db8c362ce38e8549f79c4e0adbe.png](https://img-blog.csdnimg.cn/img_convert/f2f49db8c362ce38e8549f79c4e0adbe.png)
图17 用于处理UDT_1类型变量的FC22(程序略)
![c6ff743b1706179f2f50b9a0ea8e4385.png](https://img-blog.csdnimg.cn/img_convert/c6ff743b1706179f2f50b9a0ea8e4385.png)
图18 程序详情
![7e1011b900c25659ce209889ed21834d.png](https://img-blog.csdnimg.cn/img_convert/7e1011b900c25659ce209889ed21834d.png)
图19 FC21在OB1的调用