【导读】博途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指令有以下重要功能的更新。
- DATA_PTR 接口的DB可以支持"优化块访问"
- MB_HOLD_REG 接口的DB可以支持"优化块访问"
- 可以自定义访问DB中的数据区域,而不是默认的IQ区与MB_HOLD_REG)
(二)优化块的支持DATA_PTR 参数指向要写入或读取的 DB 或 M 地址。如果使用数据块,则必须创建一个全局数据块为读写 Modbus
从站提供数据存储位置。该参数可以指向优化的DB数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt或
WChar。MB_HOLD_REG指向Modbus RTU保持寄存器,可以是M存储区或者DB数据块。该参数可以指向优化的DB数据块,在优化数据块中,允许使用以下数据类型的单个元素或者数组:Bool、Byte、Char、Word、Int、DWord、DInt、Real、USInt、UInt、UDInt、SInt或
WChar。使用V16博途软件,1215CPU配置CM1241 RS422/485模块作为Modbus
RTU主站,1214CPU配置CM1241 RS422/485模块作为Modbus RTU从站。(1)1215CPU在OB1中编写Modbus主站的程序,创建优化DB数据块DB3-Master,DATA_PTR填写该优化的DB块区域:
 (2)1214CPU在OB1中编写Modbus从站的程序,创建优化的DB数据块DB8,MB_HOLD_REG填写该优化的DB块区域:
 (3)主站Master的REQ管脚触发,主站读取从站的保持性寄存器40001,长度为5个字,读取结果如图所示:
(二)Modbus Slave指令的使用1、Modbus_Slave V4 背景DB的数据内容如下图7所示: (1)红色为Modbus RTU V4 指令集中 Modbus_Slave 增加的变量,要求的版本是博途V15及其以上,CPU版本
V4.2及其以上。(2)黑色为Modbus_Slave V3指令集中 Modbus_Slave V3增加的变量,要求的版本是博途V14SP1及其以上,CPU版本
V4.1.1及其以上。(3)蓝色为Modbus_Slave V3指令集中 Modbus_Slave V2的变量(即初始版本),要求的版本是博途
V13SP1及其以上,CPU版本 V4.1.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。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 请求。- 最多可以定义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数组的元素及其含义本例中,使用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所示: (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所示: (4)1215CPU的Master块读取40006-40010地址,对应1214CPU的DB4块中的DB4.DBW0-DB4.DBW8内容,Master块读取到内容如图12所示: (5)如果主站Master读取从站Modbus地址40016,数据长度5,如图13所示: (6)由于从站1214CPU没有40016-40020地址对应的数据区域,所以Master指令执行之后报错,如图14所示,16#8383:请求帧中的数据地址无效。
(五)HR_Start_Offset1、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 | 地址 | 最小值 | 最大值 |
---|
0 | Modbus地址 | 40001 | 40099 |
---|
S7-1200地址 | MW100 | MW298 | 20 | Modbus地址 | 40021 | 40119 |
---|
S7-1200地址 | MW100 | MW298 |
(2)例如,将 Modbus_Slave 放入 LAD 程序段后,可以切换到先前的程序段,分配HR_Start_Offset 值。该值必须在执行
Modbus_Slave 前分配,如图6所示:  注意:使用Data_Area_Array修改保持寄存器区域,不建议修改HR_Start_Offset。(六)Extended_AddressingModbus 从站寻址可组态为单字节(Modbus 标准方式)或双字节。扩展寻址用于对单一网络内陆址超过 247 进行寻址。选择扩展寻址后,最多可以对
65535 个地址进行寻址。 1、Extended_Addressing 为FALSE(默认设置):1 字节地址,地址范围0 到 247。2、Extended_Addressing 为TRUE :2 字节地址,地址范围0 到 65535。
|