[PLC]Modbus RTU V1 - V2 版本指令介绍(S7-1200 作为Modbus RTU 从站)
Modbus RTU V1 - V2 版本指令介绍(S7-1200 作为Modbus RTU 从站)
S7-1200 支持Modbus RTU通信模式的模块可作为Modbus RTU从站。以下以 CPU1215C DC/DC/DC和CM1241 RS485为例,介绍S7-1200 Modbus RTU 从站通信组态及编程步骤。
硬件和软件需求及所完成的通信任务:
硬件:
① CPU1215C
DC/DC/DC (订货号: 6ES7
215-1AG31-0XB0)
② CM1241
RS485 (订货号:6ES7
241-1CH30-0XB0)
③ PS
307电源(订货号:6ES7307-1KA02-0AA0)
④ PC(带以太网卡)
⑤ TP以太网电缆
软件:
① STEP
7 V11 Professional SP2 UPD4 +HSP
② ModScan(该软件是第三方软件,可以从 Internet 网络下载)
所完成的通信任务:
将Modbus RTU从站CPU1215C中地址从DB1.DBW0开始的5 个字中的数据,分别读取到Modbus RTU主站ModScan中Modbus地址从40001开始的5个字中。
1.组态Modbus RTU 通信模块
在硬件目录里找到“通信模块”→“点到点”→“CM1241(RS485)”,双击或拖拽此模块至CPU左侧即可,如下图1所示:
图1 组态通信模块
接下来,在“设备视图”中用鼠标选中CM1241(RS485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数。如下图2所示:
以下以传输率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,停止位=1,其它保持默认设置为例。
图2 RS485 端口设置
最后在“硬件标识符”里确认一下硬件标识符为271,如下图3所示:
图3 硬件标识符
2.添加启动OB
在项目树下选择“CPU1215C DC/DC/DC”→“程序块”→“添加新块”,在弹出的窗口中选择“OB 组织块”→ “Startup”,添加启动OB 100,如下图4所示:
图4 添加启动OB
3.调用MB_COMM_LOAD指令
为使端口一启动就被设置为Modbus RTU通信模式,可在OB 100中调用“MB_COMM_LOAD”指令。调用“MB_COMM_LOAD”指令时会自动弹出创建相应背景数据块的界面,如下图5所示:
图5 调用MB_COMM_LOAD指令
点击“确认”为该指令创建背景数据块后,为各输入/输出引脚分配地址。尤其需注意MB_DB输入引脚需指向“MB_SLAVE”指令的背景数据块,如下图6所示:
注意:“MB_COMM_LOAD”指令输入位“REQ”需使用上升沿触发。由于OB 100只在S7-1200启动时执行一次,因此,此例中将“REQ”设为“TRUE”。
图6 MB_COMM_LOAD指令
MB_COMM_LOAD指令参数意义如下表1所示:
引脚 |
说明 |
EN |
使能端 |
REQ |
在上升沿执行该指令 |
PORT |
通信端口的硬件标识符 |
BAUD |
波特率选择:3600,6000,12000,2400,4800,9600,19200,38400,57600,76800,115200 (注意:所有其它值均无效) |
PARITY |
奇偶检验选择:0-无;1-奇校验;2-偶校验 |
FLOW_CTRL |
流控制选择:0-(默认值)无流控制 |
RTS_ON_DLY |
RTS延时选择:0-(默认值) |
RTS_OFF_DLY |
RTS关断延时选择:0-(默认值) |
RESP_TO |
响应超时: 默认值 = 1000 ms。MB_MASTER 允许用于从站响应的时间(以毫秒为单位)。 |
MB_DB |
对 MB_MASTER 或 MB_SLAVE 指令所使用的背景数据块。 |
DONE |
完成位:指令执行完成且未出错置1 |
ERROR |
错误位:0-未检测到错误;1-检测到错误。在参数STATUS中输出错误代码。 |
STATUS |
表1 MB_COMM_LOAD指令参数意义
4.创建MB_HOLD_REG数据块
通过“程序块”→ “添加新块”,选择“数据块(DB)”创建 DB 块,选择“标准与S7- 300/400兼容” ,点击“确认”键,定义数据区为5个字的数组,如下图7所示:
注意:MB_HOLD_REG使用的DB访问类型必须是标准与S7- 300/400兼容。
图7 创建MB_HOLD_REG数据块
5.调用MB_SLAVE指令
在OB1中调用MB_SLAVE指令, 调用该指令时会自动弹出创建相应背景数据块的界面,如下图8所示:
图8 调用MB_SLAVE指令
点击“确认”为该指令创建背景数据块后,并为各输入/输出引脚分配地址,如下图9所示:
S7-1200作为Modbus RTU从站,MB_HOLD_REG指向Modbus保持寄存器数据块的指针。设置如下所示:MB_HOLD_REG=P#DB3.DBX0.0 WORD 5。
对应关系如下表2所示:
Modbus RTU主站Modbus地址 |
Modbus RTU从站CPU1215C 数据缓冲区地址 |
40001 |
DB3.DBW0 |
40002 |
DB3.DBW2 |
40003 |
DB3.DBW4 |
40004 |
DB3.DBW6 |
40005 |
DB3.DBW8 |
表2 Modbus地址对应关系
图9 MB_SLAVE指令
引脚 |
说明 |
EN |
使能端 |
MB_ADDR |
Modbus 从站的站地址 。默认地址范围: 0 至 247;扩展地址范围: 0 至 65535 |
MB_HOLD_REG |
指向 Modbus 保持寄存器数据块的指针。 必须使用“标准 - 与 S7-300/400 兼容”访问类型创建该数据块。 |
NDR |
新数据就绪:0-无新数据;1-表示Modbus主站已写入新的数据 |
DR |
数据读取:0-无数据读取;1-表示Modbus主站已读取新的数据 |
ERROR |
错误位 |
STATUS |
表3 MB_SLAVE指令参数意义
MB_SLAVE Modbus功能 |
S7-1200 | ||||
代码 |
功能 |
数据区 |
地址范围 |
数据区 |
CPU地址 |
01 |
读位 |
输出 |
1到8192 |
输出过程映像区 |
Q0.0到Q1023.7 |
02 |
读位 |
输入 |
10001到18192 |
输入映像区 |
I0.0到I1023.7 |
04 |
读字 |
输入 |
30001到30512 |
输入映像区 |
IW0到IW1022 |
05 |
写位 |
输出 |
1到8192 |
输出过程映像区 |
Q0.0到Q1023.7 |
15 |
写位 |
输出 |
1到8192 |
输出过程映像区 |
Q0.0到Q1023.7 |
表4 Modbus地址到过程映象区的映射
MB_SLAVE Modbus功能 |
S7-1200 | ||||
代码 |
功能 |
数据区 |
地址范围 |
CPU DB数据区 |
CPU地址 |
03 |
读字 |
保持寄存器 |
40001到49999 |
MB_HOLD_REG |
字1到字9999 |
400001到465535 |
字1到字65535 | ||||
06 |
写字 |
保持寄存器 |
40001到49999 |
MB_HOLD_REG |
字1到字9999 |
400001到465535 |
字1到字65535 | ||||
16 |
写字 |
保持寄存器 |
40001到49999 |
MB_HOLD_REG |
字1到字9999 |
400001到465535 |
字1到字65535 |
表5 Modbus地址到CPU存储区的映射
6. Modbus 主站软件设置
注意:客户机采用ModScan软件测试,该软件是第三方软件,可以从 Internet 网络上下载。
首先在打开的ModScan软件中建立连接,并设置RTU模式的参数:波特率Baud=9600,数据位Data=8,停止位Stop=1,校验Parity=NONE,如下图10所示:
图10 建立ModScan连接
选择“File”→“New” 打开ModScan通信界面,设置Modbus RTU从站的地址Device Id=1,数据开始地址Address=0001,数据长度Length=5,Modbus数据类型功能码03,如下图11所示:
注意:Device Id设置必须与“MB_SLAVE”指令中输入引脚“MB_ADDR”设置的地址一致。
图11 设置ModScan
7.Modbus RTU测试结果
在STEP 7 V11 Professional SP2 UPD4软件中打开该项目CPU1215 DC/DC/DC的“监控表”,对DB3.DBW0写入数值21,DB3.DBW2写入数值22,DB3.DBW4写入数值23,DB3.DBW6写入数值24,DB3.DBW8写入数值25。ModScan主站将S7-1200 Modbus RTU从站地址DB3.DBW0的数值21,DB3.DBW2的数值22,DB3.DBW4的数值23,DB3.DBW6的数值24,DB3.DBW8的数值25,分别读取到了地址40001,40002,40003,40004,40005中。如下图12所示:
图12 Modbus RTU测试结果
MB_COMM_LOAD和MB_SLAVE指令STATUS错误代码
STATUS(W#16#) |
说明 |
0000 |
端口无错误 |
8180 |
端口ID值无效 |
8181 |
波特率值无效 |
8182 |
奇偶校验值无效 |
8183 |
流控制值无效 |
8184 |
响应超时值无效 |
8185 |
MB_DB参数不是MB_MASTER或MB_SLAVE的背景数据块 |
表6 MB_COMM_LOAD指令STATUS错误代码
STATUS(W#16#) |
说明 |
0000 |
无错误 |
80D1 |
接收方发出了暂停主动传输的流控制请求并且在指定的等待时间内未重新激活该传输 |
80D2 |
传送请求终止 |
80E0 |
因接收缓冲区满,消息被终止 |
80E1 |
因出现奇偶校验错误,消息被终止 |
80E2 |
因组帧错误,消息被终止 |
80E3 |
因出现超限错误,消息被终止 |
80E4 |
因指定长度超出总缓冲区大小,消息被终止 |
8180 |
无效端口ID值或MB_COMM_LOAD指令出错 |
8186 |
Modbus站地址无效 |
8187 |
指向MB_HOLD_REG指针无效 |
818C |
指向M存储器或DB(DB区域允许符号地址和直接地址)的MB_HOLD_REG指针无效 |
表7 MB_SLAVE指令STATUS参数意义(通信和组态错误)
STATUS(W#16#) |
从站的响应代码 |
说明 |
8380 |
无响应 |
CRC错误 |
8381 |
01 |
不支持功能代码或者在广播中不支持功能代码 |
8382 |
03 |
数据长度错误 |
8383 |
02 |
数据地址错误或地址超出DATA_PTR取的有效范围 |
8384 |
03 |
数据值错误 |
8385 |
03 |
不支持此数据诊断代码值 |
表8 MB_SLAVE指令STATUS参数意义(Modbus协议错误)
常问问题:
为什么触发“MB_SLAVE”指令出错,输出位“ERROR”=1,输出状态字“STATUS”=16#8187?
输出状态字”STATUS“=16#8187表示指向MB_HOLD_REG指针无效。以下两种情况会造成如上错误:
· 程序中不存在“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块。
· 在创建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块时选择了“仅符号寻址”。
解决方法分别如下:
· 新建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块。
· 创建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块时只能选择了“标准与S7-300/400兼容”。