以下结合综科智控公司ZKA/ZKB/ZKD系列开关量、模拟量模块以及网关产品对MODBUS-RTU/TCP协议进行实例详解
版本历史 |
|||
版本 |
修订日期 |
修订人 |
修订内容 |
1.0 |
2013-10-25 |
综科智控 |
初稿发布 |
1.1 |
2014-1-05 |
综科智控 |
修正文字错误 |
1.2 |
2019-11-05 |
综科智控 |
将复杂的协议介绍简单化 |
|
|
|
|
版权声明
- 深圳市综科智控科技开发有限公司保留对该产品进行改进、完善的权利,所以我们不能保证本手册与您所购买的产品完全一致,但我们会定期对本手册进行审查并修订。
- 本手册的内容如有任何修订,恕不另行通知。
- 本手册所有的产品注册商标及公司名称皆属本公司所有,未经本公司的同意和书面授权,不得复制,使用或提供给其他地方印制。
- 本手册及产品中的信息为商业机密,版权归本公司所有。
本公司对本手册保留最终解释权。
目录
2.2 MODBUS-TCP报文模型(用于网络TCP/IP通信). 5
1. X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02) 7
2. X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04) 9
3. X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F) 12
4. Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F) 14
5. Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01) 16
6. AI模拟量采集读取(读取:AI寄存器,命令号:0x04) 18
7. AO模拟量输出写入(写入:AO寄存器,命令号:0x10) 20
8. AO模拟量输出读取(读取:AO寄存器,命令号:0x03) 22
1. X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02) 24
2. X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04) 27
3. X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F) 30
4. Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F) 33
5. Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01) 36
6. AI模拟量采集读取(读取:AI寄存器,命令号:0x04) 39
7. AO模拟量输出写入(写入:AO寄存器,命令号:0x10) 42
8. AO模拟量输出读取(读取:AO寄存器,命令号:0x03) 45
- MODBUS协议简介
Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议,按其格式可分为MODBUS-RTU,MODBUS-ASCII,MODBUS-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而MODBUS-TCP主要应用于基于以太网TCP/IP通信的控制网络中。
通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口。其通信遵循以下的过程:
● 主设备向从设备发送请求
● 从设备分析并处理主设备的请求,然后向主设备发送结果
● 如果出现任何差错,从设备将返回一个异常功能码
Modbus协议具有以下几个特点:
(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。
- MODBUS协议格式
- MODBUS-RTU报文模型(用于串口通讯)
设备地址 |
功能码 |
数据 |
CRC校验L |
CRC校验H |
1BYTE |
1BYTE |
N*BYTE |
1BYTE |
1BYTE |
-
- MODBUS-TCP报文模型(用于网络TCP/IP通信)
传输标识符TID |
协议标识符PID |
后面要传输的字节数 |
设备地址 |
功能码 |
数据 |
2BYTE |
2BYTE |
2BYTE |
1BYTE |
1BYTE |
N*BYTE |
注意:
Modbus-RTU一般用于串口RS232/RS485/RS422通讯
Modbus-TCP一般用于网口、WIFI的TCP/UDP通讯
下表列出 MODBUS支持的部分功能代码:以十进制表示
功能码 (十进制) |
作用 |
信息地址 |
位操作/字操作 |
操作数量 |
01 |
读单个/多个DO寄存器 |
00001-09999 |
位操作 |
单个/多个 |
02 |
读单个/多个DI寄存器 |
10001-19999 |
位操作 |
单个/多个 |
03 |
读单个/多个AO寄存器 |
40001-49999 |
字操作 |
单个/多个 |
04 |
读单个/多个AI寄存器 |
30001-39999 |
字操作 |
单个/多个 |
05 |
写单个DO寄存器 |
00001-09999 |
位操作 |
单个 |
06 |
写单个AO寄存器 |
40001-49999 |
字操作 |
单个 |
15 |
写单个/多个DO寄存器 |
00001-09999 |
位操作 |
单个/多个 |
16 |
写单个/多个AO寄存器 |
40001-49999 |
字操作 |
单个/多个 |
寄存器种类 |
说明 |
DI寄存器 |
只读,主要用于读模块的DI离散量输入信号的 ON/OFF状态。 |
DO寄存器 |
可读/可写,主要用于控制相应DO输出,例如:Y点的开关状态。也可以用于控制某些功能的启动或停止、打开或关闭,例如:PWM的输出/停止,计数的清空等。 |
AI寄存器 |
只度,主要用于读取模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等,或者X输入脉冲计数值等。 |
AO寄存器 |
可读/可写,主要用于存放的用户下发的参数,例如AO模拟量输出值、PWM输出频率、占空比等。 |
- 寄存器信息地址(PLC地址):
寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触
摸屏,或是文本显示器。例如 4x0001、3x0002等,这些地址一般使用十进制描述。
- 寄存器寻址地址(协议地址):
寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址
0x0000,40002对应寻址地址 0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址 0002,信息寄存器 30003对应寻址地址 0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。
- MODBUS-RTU协议详解
- X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
- 描述
读模块的X输入口输入信号的 ON/OFF状态。
- 例子:读X1当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 01 B9 CA
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
B9 CA:CRC校验
响应:
//X1 输入ON(1)时的回复
01 02 01 01 60 48
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
60 48:CRC校验
//X1 输入OFF(0)时的回复
01 02 01 00 A1 88
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
A1 88:CRC校验
- 例子:读X1-X8当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 08 79CC
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 08:要读多少路十六进制0x0008=十进制8,读取8路
79CC:CRC校验
响应:
//X1,X8输入ON(1)时,其他都输入OFF(0)时的回复
01 02 01 81 61 E8
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
61 E8:CRC校验
- 例子:读X1-X24当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 18 78 00
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 18:要读多少路十六进制0x0018=十进制24,读取24路
78 00:CRC校验
响应:
//X1,X2,X9,X24 输入ON(1)时,其他都输入OFF(0)时的回复
01 02 03 03 01 80 88 7E
解释:
01:子站地址
02:指令号,02读DI
03:后面跟的数据字节数
03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF,1=ON
80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF,1=ON
88 7E:CRC校验
- X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
- 描述
读模块的X输入口的脉冲计数值。
- 例子:读当前X1输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 18 00 02 F1 CC
解释:
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2
F1 CC:CRC校验
响应:
接收数据(HEX): 01 04 04 00 00 27 10 E1 B8
解释: