loveplc

 找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 216|回复: 0

S71200硬件数据类型

[复制链接]

284

主题

317

帖子

986

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
986
发表于 2019-10-1 12:36:50 | 显示全部楼层 |阅读模式
硬件数据类型
硬件数据类型:硬件数据类型由 CPU 提供。 可用硬件数据类型的数目取决于 CPU。
根据硬件配置中设置的模块存储特定硬件数据类型的常量。 在用户程序中插入用于控制或激活已组态模块的指令时,可将这些可用常量用作参数。
数据类型
基本数据类型
说明
REMOTE
ANY
用于S7通信PUT/GET指令中指定远程CPU的数据地址,必须以P#指针的形式作为实参
例如P#DB1.DBX0.0 BYTE 10
HW_ANY
UINT
任何硬件组件(如模块)的标识。
HW_DEVICE
HW_ANY
DP 从站/PROFINET IO 设备的标识
例如:在ModuleStates指令中使用
HW_DPSLAVE
HW_DEVICE
DP 从站的标识
例如:在ModuleStates、DPNRM_DG指令中使用
HW_IO
HW_ANY
CPU 或接口的标识号,该编号在 CPU 或硬件配置接口的属性中自动分配和存储
例如:在LED、DPRD_DAT、RDREC指令中使用
HW_IOSYSTEM
HW_ANY
PN/IO 系统或 DP 主站系统的标识
例如:在DeviceStates指令中使用
HW_SUBMODULE
HW_IO
重要硬件组件的标识
例如:在GETIO指令中使用
HW_INTERFACE
HW_SUBMODULE
接口组件的标识
HW_IEPORT
HW_SUBMODULE
端口的标识 (PN/IO)
HW_HSC
HW_SUBMODULE
高速计数器的标识
例如:在CTRL_HSC、CTRL_HSC_EXT指令中使用
HW_PWM
HW_SUBMODULE
脉冲宽度调制标识
例如:在CTRL_PWM指令中使用
HW_PTO
HW_SUBMODULE
脉冲发生器标识
例如:在CTRL_PTO指令中使用
AOM_IDENT
DWORD
AS 运行系统中对象的标识
EVENT_ANY
AOM_IDENT
用于标识任意事件
EVENT_ATT
EVENT_ANY
用于指定动态分配给硬件中断 OB 的事件
例如,在ATTACH、DETACH指令中使用
EVENT_HWINT
EVENT_ATT
用于指定硬件中断事件
OB_ANY
INT
用于指定任意组织块
例如,在时间错误OB启动信息中出现
OB_DELAY
OB_ANY
指定调用的延时中断OB
例如,用于SRT_DINT、CAN_DINT、QRY_DINT指令
OB_TOD
OB_ANY
指定调用的时间中断OB
例如,用于SET_TINT、CAN_TINT、ACT_TINT、QRY_TINT指令
OB_CYCLIC
OB_ANY
指定调用的循环中断OB
例如,用于SET_CINT、QRY_CINT指令
OB_ATT
OB_ANY
用于指定动态分配给事件的硬件中断OB
例如,用于ATTACH、DETACH指令
OB_PCYCLE
OB_ANY
用于指定循环OB事件类别事件的组织块
OB_HWINT
OB_ATT
用于指定发生硬件中断时调用的组织块
OB_DIAG
OB_ANY
用于指定发生诊断中断时调用的组织块
OB_TIMEERROR
OB_ANY
用于指定发生时间错误时调用的组织块
OB_STARTUP
OB_ANY
用于指定发生启动事件时调用的组织块
PORT
HW_SUBMODULE
用于指定通信端口
例如,用于自由口、Modbus RTU指令
RTM
UINT
用于指定运行小时计数器值
例如,用于RTM指令
CONN_ANY
WORD
用于指定任意连接。
CONN_OUC
CONN_ANY
用于指定通过工业以太网进行开放式通信的连接
例如,用于TCON、TSEND_C指令
DB_WWW
DB_ANY
通过自定义 Web 应用生成的 DB 号该数据类型在Temp区域中的长度为 0
例如,用于WWW指令
DB_DYN
DB_ANY
用户程序生成的DB编号
例如,用于CREAT_DB指令

DB_ANY
从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所示。
图1 指令详情
SCL的版本,如图2所示。
图2 指令SCL版本
使用这种方式时注意:
(1) CPU编译时不检查数据类型,可能会出现如图3所示的错误。所以请一定核实数据类型。
图3 错误的数据类型
(2)不检查地址存在与否。如果调用不存在的地址,CPU会报错如图4所示的区域长度错误,所以敬请注意。
图4 区域长度错误
(3)这种绝对地址是不支持变址,例如%DBW[x]不支持。
(4)不支持对符号名的访问,例如Input_1.Static_1不支持。
DB_ANY作为输入形参,调用参数的时候三种方式:
(1)在DB_ANY参数引脚填写DB块号,如图5所示
图5 参数为DB块号
(2)在DB_ANY参数引脚填写DB块符号名,如图6所示
图6 参数为DB块符号名
(3)在DB_ANY参数引脚填写DB_ANY类型的变量,如图7-8所示
图7 参数为DB_ANY类型变量
图8 DB_ANY类型变量的定义
DB_ANY作为输出、输入输出形参,调用参数的时候只能参考图7的方式。
根据(1)中的程序,计算结果都是一样的,如图9所示。
图9 计算结果
2. TIA 博途 V13SP1,S7-1200 V4.0开始,如果DB_ANY指向通过PLC数据类型(UDT)或者系统数据类型(例如IEC_TIMER等)建立的DB块此时S7-1200在SCL中提供了两个指令用于DB_ANY和Variant类型之间进行转化,如图10所示,如图11-12所示为指令参数:
图10 指令位置
参数
声明
数据类型
说明
in
Input
DB_ANY
待读取的数据块
err
Output
Int
错误信息
Ret_val
Return
Variant
Variant类型参数
图11 DB_ANY_TO_VARIANT参数
参数
声明
数据类型
说明
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所示。
图13 正确使用
这种用法是不正确的,输入是UDT_1类型建的DB,右边是DB_ANY类型的变量,如图14所示。
图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所示。
图15 待使用的DB_ANY引用的数据块
图16 DB_ANY数组及起始值
图17 用于处理UDT_1类型变量的FC22(程序略)
图18 程序详情
图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所示。
    图20 modbus从站数据
    DB43建立Struct的数组(最好是UDT的数组),其元素包含实际的DATA_PTR所在DB块(参考图20),以及相关的Modbus_Master参数。这个数组作为FB2的InOut,如图21所示。该数组可以根据站点个数决定数组元素个数。
    图21 所有从站的参数
    FB2为modbus具体程序,InOut_1为变长数组,指向图21的数组,如图22-24所示。
    图22 FB2参数
    图23 程序详情1
    图24 程序详情2
    图25 程序在OB1中的调用
    需要注意的是,例子中使用CB1241,因为是RS485模式,所以下面MODE起始值是4,如图26所示。
    图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所示。
    图27 程序详情
    SCL版本程序,如图28所示。
    图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。
    图29 程序详情
    图30 程序在OB1中的调用
    诊断缓冲区的报错如图31所示:
    图31 报错信息
    例子,以(1)和(3)为例,实现功能:FB6判断轴使用的命令表,FB7包含多个轴的FB6功能,如图32-34所示。
    图32 FB6的参数设置
    图33 程序详情
    图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块没有特殊要求。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    京ICP备17066637号-1|京公网安备|手机版|Archiver|小黑屋|loveplc

    GMT+8, 2025-12-6 13:57 , Processed in 0.024421 second(s), 18 queries .

    Powered by Discuz! Comsenz Inc.

    © 2019 技高志远.

    快速回复 返回顶部 返回列表