[三菱] Modbus RTU V4及以上版本新功能

[复制链接]
查看74987 | 回复0 | 2024-4-14 23:40:55 | 显示全部楼层 |阅读模式
【导读】博途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_StartQB_Read_CountIB_Read_StartIB_Read_CountData_Area_Array
(2)黑色为Modbus_Slave V3指令集中 Modbus_Slave V3增加的变量,要求的版本是博途V14SP1及其以上,CPU版本 V4.1.1及其以上。
    QB_StartQB_Count
(3)蓝色为Modbus_Slave V3指令集中 Modbus_Slave V2的变量(即初始版本),要求的版本是博途V13SP1及其以上,CPU版本 V4.1.1以及其上。
    HR_Start_OffsetExtended_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_ArrayData_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更牛?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则