- {{item.name}}
Modbus RTU V4 及以上版本新功能
- 0
- 533
Modbus RTU V4 及以上版本新功能介绍
TIA Portal V15 版本开始,Modbus (RTU)指令集更新到 V4.0 及以上版本:
注意:S7-1200 固件至少需要 V4.2 版本
以 V16 为例,如图 1 所示,Modbus (RTU)指令集为 V4.4 版本。
图 1. Modbus RTU V4 指令集
V4 版本的 Modbus RTU 指令有以下重要功能的更新。
Modbus_Master 指令变化:
- DATA_PTR 接口的 DB 可以支持"优化块访问"
Modbus_Slave 指令变化:
- MB_HOLD_REG 接口的 DB 可以支持"优化块访问"
- 可以选择对输入输出过程映像区的读访问限制
- 可以自定义访问 DB 中的数据区域,而不是默认的 IQ 区与 MB_HOLD_REG
本文档仅介绍相比指令集 V3.0 基础功能的新变化。
优化块的支持
DATA_PTR 参数指向要写入或读取的 DB 或 M 地址。如果使用数据块,则必须创建一个全局数据块为读写 Modbus 从站提供数据存储位置。
自指令版本 V4.0 起:
该参数可以指向优化的 DB 数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt或 WChar。
MB_HOLD_REG 指向 Modbus RTU 保持寄存器,可以是 M 存储区或者 DB 数据块。
自指令版本 V4.0 起:
该参数可以指向优化的 DB 数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt 或 WChar。
例:使用 TIA Portal V16,CPU1215C 配置 CM1241 RS422/485 模块作为 Modbus RTU 主站,CPU1215C 配置 CM1241 RS422/485 模块作为 Modbus RTU 从站
CPU1215C 在 OB1 中编写 Modbus 主站的程序,创建优化 DB 数据块 DB3-Master,DATA_PTR 填写该优化的 DB 块区域:
图 2. CPU1215C 主站 Modbus 编程
图 3. 优化的数据块 DB3-Master
CPU1214C 在 OB1 中编写 Modbus 从站的程序,创建优化的 DB 数据块 DB8,MB_HOLD_REG 填写该优化的 DB 块区域:
图 4. CPU1214C 从站 Modbus 编程
图 5. 优化的数据块 DB8
主站 Master 的 REQ 管脚触发,主站读取从站的保持性寄存器 40001,长度为 5 个字,读取结果如图 6 所示:
图 6. 主站 Master 读取到的数据
Modbus Slave 指令的使用
Modbus_Slave V4 背景 DB 的数据内容
如图 7 所示:
图 7. Modbus_Slave V4 背景数据块
用户程序可以修改图 7 中圈出的变量:
红色为 Modbus RTU V4 指令集中 Modbus_Slave 增加的变量,要求的版本是 TIA PORTAL V15 及其以上,CPU版本 V4.2 及其以上
- QB_Read_Start
- QB_Read_Count
- IB_Read_Start
- IB_Read_Count
- Data_Area_Array
黑色为 Modbus_Slave V3 指令集中 Modbus_Slave V3 增加的变量,要求的版本是 TIA PORTAL V14SP1 及其以上,CPU版本 V4.1.1 及其以上
- QB_Start
- QB_Count
蓝色为 Modbus_Slave V3 指令集中 Modbus_Slave V2 的变量(即初始版本),要求的版本是 TIA PORTAL V13SP1 及其以上,CPU版本 V4.1.1 以及其上
- HR_Start_Offset
- Extended_Addressing
下面将介绍这些可修改变量
过程映像读写访问限制
过程映像中写入区域的定义:
QB_Start:CPU 可写入的输出字节的起始地址
QB_Count:CPU 可写入的输出字节的字节数。如果 QB_Count = 0,则 CPU 的输出字节均无法写入。
默认是 QB_Start 为 0,QB_Count 为65535,即所有输出字节区域均可以写访问。
示例:要想只允许 QB10 到 QB17 可写入,则 QB_Start = 10且 QB_Count = 8。
过程映像中读取区域的定义:
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。
访问数据块中的数据区域,而不是直接访问 Modbus 地址
Modbus_Slave 指令版本 V4.0 以及 S7-1200 CPU 固件版本 V4.2 起,用户可访问数据块中的数据区域,而不用直接访问过程映像和保持寄存器。为此,在全局 DB 属性页中,必须取消选中"仅存储在装载存储器中和"优化块访问复选框。
如果 MODBUS 请求到达时,尚未定义相应功能代码的 MODBUS 数据类型的数据区域,请求会按之前的指令版本处理,即直接访问过程映像和保持性寄存器。
如果 MODBUS 请求到达时,已定义功能代码的 MODBUS 数据类型的数据区域,则 Modbus_Slave 指令会对此数据区域执行读写操作。具体是读操作还是写操作取决于作业类型。
单个 MODBUS 请求只能对一个数据区域进行读写操作。如果要读取覆盖多个数据区域的保持性寄存器,则需要多个 MODBUS 请求。
数据区域的定义规则如下:
- 最多可以定义 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_type | UInt | 映射到此数据区域的 MODBUS 数据类型的标识符: • 0:空字段元素或未使用数据区域的标识符。此时,db、start 和 length 的值无效。 • 1:过程映像输出(与功能代码 1、5 和 15 一起使用) • 2:过程映像输入(与功能代码 2 一起使用) • 3:保持寄存器(与功能代码 3、6 和 16 一起使用) • 4:输入寄存器(与功能代码 4 一起使用) |
db | UInt | 映射的数据区编号,该 DB 必须是非优化 DB |
start | UInt | 映射到数据块中的首个 MODBUS 地址,从 0 开始 |
length | UInt | Bool 个数(对于data_type 1 或者 2),Word 个数(data_type 3 或者 4) |
表 1. Data_Area_Array 数组的元素及其含义
本例中,使用 TIA Portal V16,CPU1215C 配置 CM1241 RS422/485 模块作为 Modbus RTU 主站,CPU1214C 配置 CM1241 RS422/485 模块作为 Modbus RTU 从站,主站访问从站的数据块中的数据区域:
主站配置:在 OB1 中,拖入 Modbus_Comm_Load 指令和 Modbus_Master 指令,MODE=0,DATA_ADDR=40006,DATA_LEN=5,如图 8 所示:
图 8. 主站调用 Master 指令
从站配置:在 OB1 中,拖入 Modbus_Comm_Load 指令和 Modbus_Slave 指令,参考图 4 所示:
从站的背景 DB 中 Data_Area_Array 进行如图 9 所示配置:
图 9. CPU1214C 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] 参数失效。
在 CPU1214C 创建 4 个非优化 DB 块,DB3/DB4/DB5/DB6,如图 10 所示:
图 10.CPU1214C 创建数据块
CPU1215C 的 Master 块读取 40006-40010 地址,对应 CPU1214C 的 DB4 块中的 DB4.DBW0-DB4.DBW8 内容,Master 块读取到内容如图 11 所示:
图 11. 主站 CPU 读取到的数据
如果主站 Master 读取从站 Modbus 地址 40016,数据长度 5,如图 12 所示:
图 12. 主站调用 Master 指令
由于从站 CPU1214C 没有 40016-40020 地址对应的数据区域,所以 Master 指令执行之后报错,如图 13 所示:
16#8383:请求帧中的数据地址无效。.
图 13. Master 指令执行报错
HR_Start_Offset
HR_Start_Offset 用于指定 Modbus 保持寄存器的起始地址,存储在 Modbus_Slave 背景数据块中,默认是 0。
Modbus 保持寄存器地址从 40001 或 400001 开始。这些地址与保持寄存器的 PLC 存储器起始地址对应。通过组态"HR_Start_Offset"变量,可以将 Modbus 保持寄存器的起始地址定义为除 40001 或 400001 之外的其它值。
例如,如果保持寄存器被组态为起始于 MW100 并且长度为 100 个字(即 MB_HOLD_REG 设置为 P#M100.0 WORD 100)。偏移量 20 可指定保持寄存器的起始地址为 40021 而不是 40001。低于 40021 和高于 40120 的任何地址都将导致寻址错误。
HR_Start_Offset | 地址 | 最小值 | 最大值 |
0 | Modbus 地址 | 40001 | 40100 |
S7-1200 地址 | MW100 | MW298 | |
20 | Modbus 地址 | 40021 | 40120 |
S7-1200 地址 | MW100 | MW298 |
例如,将 Modbus_Slave 放入程序段后,可以切换到先前的程序段,分配 HR_Start_Offset 值。该值必须在执行 Modbus_Slave 前分配,如图 14 所示:
图 14. 从站的 Slave 编程
使用 Data_Area_Array 修改保持寄存器区域,不建议修改 HR_Start_Offset。
Extended_Addressing
Modbus 从站寻址可组态为单字节(Modbus 标准方式)或双字节。扩展寻址用于对单一网络内地址超过 247 进行寻址。选择扩展寻址后,最多可以对 65535 个地址进行寻址。
Extended_Addressing 为 FALSE(默认设置):1 字节地址,地址范围 0 到 247。
Extended_Addressing 为 TRUE:2 字节地址,地址范围 0 到 65535。
剩余80%未阅读,请登录查看大全章节内容
- 评论
-
分享
扫码分享
- 收藏 收藏
- 点赞 点赞
- 纠错 纠错
{{item.nickName}}