0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

S7-1200:DB_ANY类型

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 作者:机器人及PLC自动化 2022-03-11 09:33 次阅读

TIA 博途 V12,S7-1200 V2.0开始,支持DB_ANY类型。

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所示。

bfdbaef8-9386-11ec-952b-dac502259ad0.jpg

图1 指令详情

SCL的版本,如图2所示。

bff062c6-9386-11ec-952b-dac502259ad0.jpg

图2 指令SCL版本

使用这种方式时注意:

(1) CPU编译时不检查数据类型,可能会出现如图3所示的错误。所以请一定核实数据类型。

c001efe6-9386-11ec-952b-dac502259ad0.jpg

图3 错误的数据类型

(2)不检查地址存在与否。如果调用不存在的地址,CPU会报错如图4所示的区域长度错误,所以敬请注意。

c015e3d4-9386-11ec-952b-dac502259ad0.jpg

图4 区域长度错误

(3)这种绝对地址是不支持变址,例如%DBW[x]不支持。

(4)不支持对符号名的访问,例如Input_1.Static_1不支持。

DB_ANY作为输入形参,调用参数的时候三种方式:

(1)在DB_ANY参数引脚填写DB块号,如图5所示

c026db6c-9386-11ec-952b-dac502259ad0.jpg

图5 参数为DB块号

(2)在DB_ANY参数引脚填写DB块符号名,如图6所示

c036b4ce-9386-11ec-952b-dac502259ad0.jpg

图6 参数为DB块符号名

(3)在DB_ANY参数引脚填写DB_ANY类型的变量,如图7-8所示

c0504fa6-9386-11ec-952b-dac502259ad0.jpg

图7 参数为DB_ANY类型变量

c069fec4-9386-11ec-952b-dac502259ad0.jpg

图8 DB_ANY类型变量的定义

DB_ANY作为输出、输入输出形参,调用参数的时候只能参考图7的方式。

根据(1)中的程序,计算结果都是一样的,如图9所示。

c079994c-9386-11ec-952b-dac502259ad0.jpg

图9 计算结果

2. TIA 博途 V13SP1,S7-1200 V4.0开始,如果DB_ANY指向通过PLC数据类型(UDT)或者系统数据类型(例如IEC_TIMER等)建立的DB块

此时S7-1200在SCL中提供了两个指令用于DB_ANY和Variant类型之间进行转化,如图10所示,如图11-12所示为指令参数:

c08de9b0-9386-11ec-952b-dac502259ad0.jpg

图10 指令位置

c0a56c7a-9386-11ec-952b-dac502259ad0.jpg

参数 声明 数据类型 说明
in Input DB_ANY 待读取的数据块
err Output Int 错误信息
Ret_val Return Variant Variant类型参数

图11 DB_ANY_TO_VARIANT参数

c0b59078-9386-11ec-952b-dac502259ad0.jpg

参数 声明 数据类型 说明
in Input Variant Variant类型参数
err Output Int 错误信息
Ret_val Return DB_ANY 待写入的数据块

图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所示。

c0c3e06a-9386-11ec-952b-dac502259ad0.jpg

图13 正确使用

这种用法是不正确的,输入是UDT_1类型建的DB,右边是DB_ANY类型的变量,如图14所示。

c0ef74a0-9386-11ec-952b-dac502259ad0.jpg

图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所示。

c104b7ca-9386-11ec-952b-dac502259ad0.jpg

图15 待使用的DB_ANY引用的数据块

c12066c8-9386-11ec-952b-dac502259ad0.jpg

图16 DB_ANY数组及起始值

c1326846-9386-11ec-952b-dac502259ad0.jpg

图17 用于处理UDT_1类型变量的FC22(程序略)

c14308a4-9386-11ec-952b-dac502259ad0.jpg

图18 程序详情

c1639c5e-9386-11ec-952b-dac502259ad0.jpg

图19 FC21在OB1的调用

例子2:使用在Modbus上的一个例子。

Modbus轮询时,通常多次调用Modbus_Master(或者MB_MASTER),每个Modbus_Maste使用不同的参数。也可以写成一个Modbus_Master,这需要在参数中采取变量的形式,但DATA_PTR这个变量只能采取一种结构、UDT的数组,或者二维数组。这种方法可以,但不够灵活,因为每个站点变量大小结构可能各不相同。现在的话可以通过DB_ANY的方式来做到一个完全通用的Modbus轮询程序。

前提:TIA 博途 V15,S7-1200 V4.2 版本MODBUS(RTU) V4.0版本,如果不是这些版本,某些功能需要被简化。

1. TIA 博途 V14,S7-1200 V4.2 ,则Modbus_Master的DATA_PTR只能是非优化块,程序中的Static_2只能作为InOut。

2. S7-1200 V4.0/V4.1,则Array [*] of Struct也将不支持,程序中的InOut_1需要改为Variant,处理程序需要使用MOVE_BLK_VARIANT。

例如:

每个Modbus_Master的站点,需要将其要读/写的数据结构做成UDT,并生成对应DB块。这里DB42是基于modbus_Instu 这个UDT建立,如图20所示。

c17e74c0-9386-11ec-952b-dac502259ad0.jpg

图20 modbus从站数据

DB43建立Struct的数组(最好是UDT的数组),其元素包含实际的DATA_PTR所在DB块(参考图20),以及相关的Modbus_Master参数。这个数组作为FB2的InOut,如图21所示。该数组可以根据站点个数决定数组元素个数。

c19cf63e-9386-11ec-952b-dac502259ad0.jpg

图21 所有从站的参数

FB2为modbus具体程序,InOut_1为变长数组,指向图21的数组,如图22-24所示。

c1be749e-9386-11ec-952b-dac502259ad0.jpg

图22 FB2参数

c1e81c22-9386-11ec-952b-dac502259ad0.jpg

图23 程序详情1

c207bf82-9386-11ec-952b-dac502259ad0.jpg

图24 程序详情2

c219b58e-9386-11ec-952b-dac502259ad0.jpg

图25 程序在OB1中的调用

需要注意的是,例子中使用CB1241,因为是RS485模式,所以下面MODE起始值是4,如图26所示。

c227e47e-9386-11ec-952b-dac502259ad0.jpg

图26 修改MODE

3. TIA 博途 V15开始,S7-1200 V4.2开始,增加以下指令,用于DB_ANY变量与数据类型的比较,见表1。

表1 TypeOfDB指令

LAD SCL 位置
EQ_TypeOfDB TypeOfDB 基本指令 -- 比较操作 -- 变量
NE_TypeOfDB

DB_ANY指向的数据块不限于PLC数据类型(UDT)或者系统数据类型建立的DB块,还可以是TO轴的DB块,以及FB的背景数据块,见表2。

表2 指令参数

LAD指令 操作数1 操作数2 说明
操作数1
┫EQ_TypeOfDB┣
操作数2
DB_ANY 数据类型 比较操作数1对应的DB是不是基于操作数2的数据类型建立的,是则该指令返回逻辑运算结果 (RLO)“1”。如果不是则该指令返回 RLO“0”。操作数2的数据类型包括PLC数据类型(UDT)、系统数据类型、TO轴、FB。
操作数1
┫NE_TypeOfDB┣
操作数2
DB_ANY 数据类型 较操作数1对应的DB是不是基于操作数2的数据类型建立的,不是则该指令返回逻辑运算结果 (RLO)“1”。如果是则该指令返回 RLO“0”。操作数2的数据类型包括PLC数据类型(UDT)、系统数据类型、TO轴、FB。

SCL指令:TypeOfDB(操作数),操作数是DB_ANY类型的参数,该语句输出是数据类型,在程序中只能用在IF与CASE进行比较。

用法1:IF指令,操作数对应的类型与一个变量类型的比较,例如:

IF (TypeOfDB(操作数1) = 变量类型(例如"UDT_1"))
...
END_IF;

用法2:IF指令,两个操作数对应的类型比较,例如:

IF (TypeOfDB(操作数1) = TypeOfDB(操作数2))
...
END_IF;

用法3:CASE OF指令,操作数对应的实参的类型与多个变量类型的比较,例如:

CASE (TypeOfDB(操作数)) OF
UDT_1:
...
UDT_2:
...
ELSE
...
END_CASE;

使用举例:

编写FC,检查输入DB_ANY变量类型,UDT_1则输出True,其它则输出False,如图27-28所示。

c23f87aa-9386-11ec-952b-dac502259ad0.jpg

图27 程序详情

SCL版本程序,如图28所示。

c2662ffe-9386-11ec-952b-dac502259ad0.jpg

图28 SCL版本程序

4. S7-1200 V4.2开始,DB_ANY可以开始在运动控制中使用

可以使用在形参为TO_PositioningAxis和TO_CommandTable类型的实参处,包括以下几种:

(1) 当FC/FB的输入形参数据类型为TO_PositioningAxis时,外部实参可以使用DB_ANY数据类型的变量。
(2) 在MC_MoveAbsolute/MC_MoveRelative指令的参数Axis处,实参可以直接使用DB_ANY数据类型的变量。
(3) 当FC/FB的输入形参数据类型为TO_CommandTable时,外部实参可以使用DB_ANY数据类型的变量。
(4) 在MC_CommandTable指令的参数CommandTable处,实参可以直接使用DB_ANY数据类型的变量。

与第2条对应的是其他运动控制指令的参数Axis,直接使用DB_ANY数据类型的变量,这种用法会报错误,如图29-30所示。

原因是MC_Power/MC_Reset/MC_Home指令的参数Axis,类型为TO_Axis。而MC_Halt/MC_MoveVelocity/MC_MoveJog/MC_ChangeDynamic指令的参数Axis,类型为TO_SpeedAxis。

c279bf1a-9386-11ec-952b-dac502259ad0.jpg

图29 程序详情

c2a0a666-9386-11ec-952b-dac502259ad0.jpg

图30 程序在OB1中的调用

诊断缓冲区的报错如图31所示:

c2b6f1e6-9386-11ec-952b-dac502259ad0.jpg

图31 报错信息

例子,以(1)和(3)为例,实现功能:FB6判断轴使用的命令表,FB7包含多个轴的FB6功能,如图32-34所示。

c2d1e60e-9386-11ec-952b-dac502259ad0.jpg

图32 FB6的参数设置

c2eb6e08-9386-11ec-952b-dac502259ad0.jpg

图33 程序详情

c315e99e-9386-11ec-952b-dac502259ad0.jpg

图34 FB7中循环调用FB6

最后在OB1调用FB7即可

优势:

1. 以往和轴有关的块都需要逐个调用,现在利用DB_ANY和FB的数组,可以用一个循环完成。

2.命令表的类型 TO_CommandTable只能在Input,Output以及InOut这种外部引脚上,对于需要切换命令表很麻烦,现在用DB_ANY直接在程序内部解决。

5. 隐藏指令

在SCL中有两个用于转化的指令,没有放在指令列表中:

DB_ANY_TO_UINT以及UINT_TO_DB_ANY,这是DB_ANY和UINT类型之间的转化。使用":="同样可以完成它们之间的转化。

在LAD中,如果IEC检查没有激活,用MOVE指令也可实现DB_ANY和UINT类型之间的转化。

这2个指令对DB_ANY指向的DB块没有特殊要求。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    5008

    文章

    13200

    浏览量

    462397
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13612

原文标题:S7-1200:DB_ANY类型

文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    西门子plc S7-1200/S7-1500优化的DB块与标准的DB块整体对比

    在 TIA Portal V12 中为S7-1200/S7-1500 CPU 添加一个 DB 块时,其缺省属性为优化的 DB ,优化的 DB
    的头像 发表于 07-28 19:55 4612次阅读
    西门子plc <b class='flag-5'>S7-1200</b>/<b class='flag-5'>S7</b>-1500优化的<b class='flag-5'>DB</b>块与标准的<b class='flag-5'>DB</b>块整体对比

    基于S7-1200的设备与网络组态

    本文档内容介绍了基于S7-1200的设备与网络组态,以及S7-1200的概要及功能。
    发表于 09-25 18:14 28次下载
    基于<b class='flag-5'>S7-1200</b>的设备与网络组态

    基于S7-1200的PLC的编程及扩展

    S7-1200 系列是一款可编程逻辑控制器 (PLC, Programmable Logic Controller),可以控制各种自动化应用。S7-1200设计紧凑、成本低廉且具有功能强大的指令集
    发表于 09-25 18:39 24次下载

    WinCC V7.2与S7-1200的PLC通讯

    自WinCC V7.2版本起,软件新增加了 SIMATIC S7-1200S7-1500 Channel通道,用于WinCC与 S7-1200/S7-1500 PLC之间的通信。此
    发表于 09-26 19:06 11次下载
    WinCC V7.2与<b class='flag-5'>S7-1200</b>的PLC通讯

    S7-1200运动控制的结构及原理

    CPU S7-1200 兼具可编程逻辑控制器的功能和通过脉冲接口控制步进电机和伺服电机运行的运动控制功能。 运动控制功能负责对驱动器进行监控。DC/DC/DC 型 CPU S7-1200 上配备有
    发表于 09-29 14:37 42次下载
    <b class='flag-5'>S7-1200</b>运动控制的结构及原理

    s7-1200系统手册

    S7-1200适用
    发表于 10-23 09:41 0次下载

    S7-1200入门手册

    S7-1200适用
    发表于 10-23 09:34 0次下载

    s7-1200技术规范

    S7-1200适用
    发表于 10-23 09:29 0次下载

    S7-1200S7-1200进行S7通信的详细资料说明

    S7-1200 的 PROFINET 通信口可以做 S7 通信的服务器端或客户端(CPU V2.0及以上版本)。S7-1200 仅支持 S7 单边通信,仅需在客户端单边组态连接和编程,
    的头像 发表于 08-17 10:51 2.9w次阅读
    <b class='flag-5'>S7-1200</b>和<b class='flag-5'>S7-1200</b>进行<b class='flag-5'>S7</b>通信的详细资料说明

    S7-1200DB块在PLC及触摸屏上的用法

    S7-1200DB块在PLC及触摸屏上的用法
    发表于 12-17 09:32 7次下载
    <b class='flag-5'>S7-1200</b>的<b class='flag-5'>DB</b>块在PLC及触摸屏上的用法

    S7-1200中UDT类型变量的使用方法

    今天给大家讲解一下S7-1200中UDT类型变量的使用方法,PLC数据类型我们也叫做UDT数据类型,是由多个不同数据类型元素组成的数据结构,
    的头像 发表于 04-18 11:58 3784次阅读
    <b class='flag-5'>S7-1200</b>中UDT<b class='flag-5'>类型</b>变量的使用方法

    S7-1200 PWM功能简介

    S7-1200 PWM功能简介。
    发表于 04-23 14:38 43次下载

    S7-1200开放式以太网通信实现数据交换

    1.S7-1200 CPU Clinet 将发送数据区 DB4 块中的 10 个字节的数据发送到 S7-1200 CPU server 的接收数据区 DB4 块中;
    的头像 发表于 02-03 13:40 2821次阅读

    S7-1200S7-300的选型区别

    在硬件扩展方面,S7-300的主机架多支持八个扩展模块,而S7-1200支持扩展多八个信号模块和多三个通信模块。以S7-300 CPU313C和S7-1200 CPU1214C为例,
    的头像 发表于 05-04 15:18 1669次阅读
    <b class='flag-5'>S7-1200</b>与<b class='flag-5'>S7</b>-300的选型区别

    西门子博途中DB_ANY数据类型的使用

    DB_ANY 数据类型用来标识任意数据块。对于 S7-1200/1500 系列的 CPU,可以选择访问编程期间尚不可用的数据块。为此,请在访问块的块接口中创建一个 DB_ANY 数据
    的头像 发表于 07-04 10:17 9907次阅读
    西门子博途中<b class='flag-5'>DB_ANY</b>数据<b class='flag-5'>类型</b>的使用