分享

Modbus RTU V4及以上版本新功能

 工控库吧 2021-12-08
【导读】博途V15版本开始,Modbus(RTU)指令集更新到V4.0及以上版本,S7-1200固件至少需要V4.2版本,本文主要阐述Modbus RTU V4及以上版本的新功能。

S7-1200 运动控制实例下载 

S7-1500模拟量模块接线图

PLC手动和自动程序编程方法 

很实用的西门子常用编程技巧

(一)概述

以V16为例,如图1所示,Modbus (RTU)指令集为V4.4版本,该版本的 Modbus RTU指令有以下重要功能的更新。

图1 Modbus RTU V4 指令集
1、Modbus_Master指令变化:
  • DATA_PTR 接口的DB可以支持"优化块访问"
2、Modbus_Slave指令变化:
  • MB_HOLD_REG 接口的DB可以支持"优化块访问"
  • 可以选择对输入输出过程映像区的读访问限制
  • 可以自定义访问DB中的数据区域,而不是默认的IQ区与MB_HOLD_REG

(二)优化块的支持

DATA_PTR 参数指向要写入或读取的 DB 或 M 地址。如果使用数据块,则必须创建一个全局数据块为读写 Modbus 从站提供数据存储位置。
1、自指令版本V4.0起:
该参数可以指向优化的DB数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt或 WChar。MB_HOLD_REG指向Modbus RTU保持寄存器,可以是M存储区或者DB数据块。
2、自指令版本V4.0起:
该参数可以指向优化的DB数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt或 WChar。
3、举例说明:
使用V16博途软件,1215CPU配置CM1241 RS422/485模块作为Modbus RTU主站,1214CPU配置CM1241 RS422/485模块作为Modbus RTU从站。
(1)1215CPU在OB1中编写Modbus主站的程序,创建优化DB数据块DB3-Master,DATA_PTR填写该优化的DB块区域:

图2 1215CPU主站Modbus编程

图3 优化的数据块DB3-Master
(2)1214CPU在OB1中编写Modbus从站的程序,创建优化的DB数据块DB8,MB_HOLD_REG填写该优化的DB块区域:

图4 1214CPU从站Modbus编程

图5 优化的数据块DB8
(3)主站Master的REQ管脚触发,主站读取从站的保持性寄存器40001,长度为5个字,读取结果如图所示:

图6 主站Master读取到的数据

(二)Modbus Slave指令的使用

1、Modbus_Slave V4 背景DB的数据内容如下图7所示:

图7 Modbus_Slave V4 背景数据块
2、用户程序可以修改图7中圈出的变量:
(1)红色为Modbus RTU V4 指令集中 Modbus_Slave 增加的变量,要求的版本是博途V15及其以上,CPU版本 V4.2及其以上。
  • QB_Read_Start
  • QB_Read_Count
  • IB_Read_Start
  • IB_Read_Count
  • Data_Area_Array
(2)黑色为Modbus_Slave V3指令集中 Modbus_Slave V3增加的变量,要求的版本是博途V14SP1及其以上,CPU版本 V4.1.1及其以上。
  • QB_Start
  • QB_Count
(3)蓝色为Modbus_Slave V3指令集中 Modbus_Slave V2的变量(即初始版本),要求的版本是博途 V13SP1及其以上,CPU版本 V4.1.1以及其上。
  • HR_Start_Offset
  • Extended_Addressing

(三)过程映像读写访问限制

1、过程映像中写入区域的定义:
QB_Start:CPU 可写入的输出字节的起始地址
QB_Count:CPU 可写入的输出字节的字节数。如果 QB_Count = 0,则CPU 的输出字节均无法写入。
默认是QB_Start为0,QB_Count为65535,即所有输出字节区域均可以写访问。
示例:要想只允许 QB10 到 QB17 可写入,则 QB_Start = 10且 QB_Count = 8。
2、过程映像中读取区域的定义:
QB_Read_Start:CPU 可读取的输出字节的起始地址
QB_Read_Count:CPU 可读取的输出字节的字节数。如果 QB_Read_Count = 0,则CPU 的输出字节均无法读取。
默认是QB_Read_Start为0,QB_Read_Count为65535,即所有输出字节区域均可以读访问。
示例:要想只允许 QB10 到 QB17 可读取,则 QB_Read_Start = 10 且 QB_Read_Count = 8。
IB_Read_Start:CPU 可读取的输入字节的起始地址
IB_Read_Count:CPU 可读取的输入字节的字节数。如果 IB_Read_Count = 0,CPU 的输入字节均无法读取。
默认是IB_Read_Start为0,IB_Read_Count为65535,即所有输入字节区域均可以读访问。
示例:要想只允许 IB10 到 IB17 可读取,则 IB_Read_Start = 10 且 IB_Read_Count = 8。

(四)访问DB中的数据区域而不是直接访问Modbus地址

Modbus_Slave 指令版本 V4.0 以及 S7-1200 CPU 固件 (FW) 版本 V4.2 起,用户可访问数据块中的数据区域,而不用直接访问过程映像和保持寄存器。为此,在全局 DB 属性页中,必须取消选中"仅存储在装载存储器中和"优化块访问复选框。
1、如果 MODBUS 请求到达时,尚未定义相应功能代码的 MODBUS 数据类型的数据区域,请求会按之前的指令版本处理,即直接访问过程映像和保持性寄存器。
2、如果 MODBUS 请求到达时,已定义功能代码的 MODBUS 数据类型的数据区域,则 Modbus_Slave 指令会对此数据区域执行读写操作。具体是读操作还是写操作取决于作业类型。
3、单个 MODBUS 请求只能对一个数据区域进行读写操作。如果要读取覆盖多个数据区域的保持性寄存器,则需要多个 MODBUS 请求。
4、数据区域的定义规则如下:
  • 最多可以定义8个数据区,位于Data_Area_Array[1..8]中。
  • 数据区数组元素定义必须连续,如果中间某数组元素定义无效,则后面的区域不生效。
  • 如果在数据区定义了保持寄存器,则MB_HOLD_REG映射失效,如果在数据区定义了过程映像输出,则对应的Q区映射失效,如果在数据区定义了过程映像输入,则对应的I区映射失效,如果在数据区定义了输入寄存器,则对应的AI区映射失效。也就是说,如果在数据区内没有定义哪个区域,则原有的映射依然保留。
  • 单个MODBUS 请求只能对恰好一个数据区域进行读写操作。
  • 每个字段元素 Data_Area_Array[x](其中 1 <= x <= 8)都是 MB_DataArea 类型的UDT,结构参见表1:
参数数据
含义
data_typeUInt

映射到此数据区域的 MODBUS 数据类型的标识符:
· 0:空字段元素或未使用数据区域的标识符。此时,db、start和length的值无效。
· 1:过程映像输出(与功能代码 1、5 和 15 一起使用)
· 2:过程映像输入(与功能代码 2 一起使用)
· 3:保持寄存器(与功能代码 3、6 和 16 一起使用)
· 4:输入寄存器(与功能代码 4 一起使用)

dbUInt

映射的数据区编号,该DB必须是非优化DB

startUInt

映射到数据块中的首个 MODBUS 地址,从0开始

lengthUInt

Bool数(对于data_type 1或者2),Word数(data_type 3或者4)

表1 Data_Area_Array数组的元素及其含义
4、举例说明:
本例中,使用V16博途软件,1215CPU配置CM1241 RS422/485模块作为Modbus RTU主站,1214CPU配置CM1241 RS422/485模块作为Modbus RTU从站,主站访问从站的数据块 (DB) 中的数据区域:
(1)主站配置:在OB1中,拖入Modbus_Comm_Load 指令和Modbus_Master 指令,MODE=0,DATA_ADDR=40006,DATA_LEN=5,如图8所示:

图8 主站调用Master指令
(2)从站配置:在OB1中,拖入Modbus_Comm_Load 指令和Modbus_Slave指令,参考图4所示,从站的背景DB中Data_Area_Array进行如图9配置:

图9 1214CPU Modbus_Slave背景DB中Data_Area_Array
Data_Area_Array[1]:data_type = 3,db = 3,start = 0,length = 5,,即DB3.DBW0-DB3.DBW8对应40001-40005。
Data_Area_Array[2]:data_type = 3,db = 4,start = 5,length = 5,,即DB4.DBW0-DB4.DBW8对应40006-40010。
Data_Area_Array[3]:data_type = 3,db = 5,start = 10,length = 5,,即DB5.DBW0-DB5.DBW8对应40011-40015。
Data_Area_Array[4]:data_type = 0,db = 0,start = 0,length = 0。
Data_Area_Array[5]:data_type = 3,db = 6,start = 15,length = 5,即DB6.DBW0-DB6.DBW8对应40016-40020,由于Data_Area_Array[4]参数为空,所以Data_Area_Array[5]参数失效。
(3)在1214CPU创建4个非优化DB块,DB3/DB4/DB5/DB6,如图11所示:

图11 1214CPU创建数据块
(4)1215CPU的Master块读取40006-40010地址,对应1214CPU的DB4块中的DB4.DBW0-DB4.DBW8内容,Master块读取到内容如图12所示:

图12 主站CPU读取到的数据
(5)如果主站Master读取从站Modbus地址40016,数据长度5,如图13所示:

图13 主站调用Master指令
(6)由于从站1214CPU没有40016-40020地址对应的数据区域,所以Master指令执行之后报错,如图14所示,16#8383:请求帧中的数据地址无效。

图14 Master指令执行报错

(五)HR_Start_Offset

1、HR_Start_Offset 用于指定 Modbus 保持寄存器的起始地址,存储在Modbus_Slave 背景数据块中,默认是0。
2、Modbus 保持寄存器地址从 40001 或 400001 开始。这些地址与保持寄存器的 PLC 存储器起始地址对应。通过组态"HR_Start_Offset"变量,可以将 Modbus 保持寄存器的起始地址定义为除 40001 或 400001 之外的其它值。
(1)例如,如果保持寄存器被组态为起始于 MW100 并且长度为 100 个字(即MB_HOLD_REG设置为P#M100.0 WORD 100)。偏移量 20 可指定保持寄存器的起始地址为 40021 而不是 40001。低于 40021 和高于 400119 的任何地址都将导致寻址错误。
HR_Start_Offset地址最小值最大值
0Modbus地址4000140099
S7-1200地址MW100MW298
20Modbus地址4002140119
S7-1200地址MW100MW298

(2)例如,将 Modbus_Slave 放入 LAD 程序段后,可以切换到先前的程序段,分配HR_Start_Offset 值。该值必须在执行 Modbus_Slave 前分配,如图6所示:

图15 从站的Slave编程
注意:使用Data_Area_Array修改保持寄存器区域,不建议修改HR_Start_Offset。

(六)Extended_Addressing

Modbus 从站寻址可组态为单字节(Modbus 标准方式)或双字节。扩展寻址用于对单一网络内陆址超过 247 进行寻址。选择扩展寻址后,最多可以对 65535 个地址进行寻址。
1、Extended_Addressing 为FALSE(默认设置):1 字节地址,地址范围0 到 247。
2、Extended_Addressing 为TRUE :2 字节地址,地址范围0 到 65535。


大家都在看




【视频】德国工程师是如何制作PLC柜的?

【视频】德国威图电气柜是如何生产出的?

【视频】德国工程师的办公环境是怎样的?

【视频】PROFINET为何比PROFIBUS更牛?

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多