modbus-rtu及modbus-tcp协议实例详解

  以下结合综科智控公司ZKA/ZKB/ZKD系列开关量、模拟量模块以及网关产品对MODBUS-RTU/TCP协议进行实例详解

 

版本历史

版本

修订日期

修订人

修订内容

1.0

2013-10-25

综科智控

初稿发布

1.1

2014-1-05

综科智控

修正文字错误

1.2

2019-11-05

综科智控

将复杂的协议介绍简单化

 

 

 

 

 

版权声明

  1. 深圳市综科智控科技开发有限公司保留对该产品进行改进、完善的权利,所以我们不能保证本手册与您所购买的产品完全一致,但我们会定期对本手册进行审查并修订。
  2. 本手册的内容如有任何修订,恕不另行通知。
  3. 本手册所有的产品注册商标及公司名称皆属本公司所有,未经本公司的同意和书面授权,不得复制,使用或提供给其他地方印制。
  4. 本手册及产品中的信息为商业机密,版权归本公司所有。

本公司对本手册保留最终解释权。

 

 

 

 

                                                               目录

一、         MODBUS协议简介... 4

1.      什么是MODBUS协议... 4

2.      MODBUS协议格式... 5

2.1       MODBUS-RTU报文模型(用于串口通讯). 5

2.2       MODBUS-TCP报文模型(用于网络TCP/IP通信). 5

3.      MODBUS的功能码及寄存器介绍... 5

3.1        功能码... 5

3.2        寄存器分类说明... 6

3.3        寄存器地址说明... 6

二、         MODBUS-RTU协议详解... 7

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

三、         MODBUS-TCP协议详解... 24

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

 

 

  1. 什么是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的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。

 

  1. MODBUS协议格式
    1. MODBUS-RTU报文模型(用于串口通讯)

设备地址

功能码

数据

CRC校验L

CRC校验H

1BYTE

1BYTE

N*BYTE

1BYTE

1BYTE

    1. MODBUS-TCP报文模型(用于网络TCP/IP通信)

传输标识符TID

协议标识符PID

后面要传输的字节数

设备地址

功能码

数据

2BYTE

2BYTE

2BYTE

1BYTE

1BYTE

N*BYTE

 

注意:

Modbus-RTU一般用于串口RS232/RS485/RS422通讯

Modbus-TCP一般用于网口、WIFITCP/UDP通讯

 

  1. MODBUS的功能码及寄存器介绍
    1. 功能码

下表列出 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

字操作

单个/多个

 

    1. 寄存器分类说明

寄存器种类

说明

DI寄存器

只读,主要用于读模块的DI离散量输入信号的 ON/OFF状态。

DO寄存器

可读/可写,主要用于控制相应DO输出,例如:Y点的开关状态。也可以用于控制某些功能的启动或停止、打开或关闭,例如:PWM的输出/停止,计数的清空等。

AI寄存器

只度,主要用于读取模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等,或者X输入脉冲计数值等。

AO寄存器

可读/可写,主要用于存放的用户下发的参数,例如AO模拟量输出值、PWM输出频率、占空比等。

 

    1. 寄存器地址说明
  1. 寄存器信息地址(PLC地址):

寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触

摸屏,或是文本显示器。例如 4x0001、3x0002等,这些地址一般使用十进制描述。

 

  1. 寄存器寻址地址(协议地址):

寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址

0x0000,40002对应寻址地址  0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址  0002,信息寄存器 30003对应寻址地址  0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。

 

 

 

  1. X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
  1. 描述

读模块的X输入口输入信号的 ON/OFF状态。

 

  1. 例子:读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校验

 

 

 

  1. 例子:读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校验

 

  1. 例子:读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校验

 

  1. X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
  1. 描述

读模块的X输入口的脉冲计数值。

  1. 例子:读当前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

解释:

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值