一文读懂Modbus协议----彻底明白

Modbus遵循主从方式进行通信,一个主机可以连接多个从机,主机可以主动发送数据给从机,但是从机不可以主动发送数据给主机。

通信协议
  1. Modbus RTU,RTU是最常用的

  2. Modbus ASCII

  3. Modbus TCP/IP

  4. Modbus UDP/IP

存储区

Modbus规定存储区最大范围为65536。绝对地址范围等于区号+相对地址,比如400001,表示的输入寄存器的第一个寄存器,而在读取时的开始位置应该是 0x00 0x00。 

输出线圈

可读可写,操作Bit。存储区代号1区。绝对地址范围100001-165536。

读取功能码0x01

写入单个线圈功能码0x05

写入多个连续的线圈0x0F

输入线圈

可读可写,操作Bit。存储区代号0区。绝对地址范围000001-065536。

读取功能码0x02

输出寄存器

只读不可写,操作Byte。存储区代号3区。绝对地址范围300001-365536。

读取功能码0x03

写入单个寄存器0x06

写入多个连续的寄存器0x10

输入寄存器

可读可写,操作Byte。存储区代号4区。绝对地址范围400001-465536。

读取功能码0x04

ModbusRtu

ModbusRtu是Modbus中最常用的一种通信协议。

01功能码

01功能码主要用来读取输出线圈。

发送格式:01 01 00 00 00 0A BC 0D

响应格式:01 01 02 11 00 B5 AC

发送格式解析:01 从站地址、 01 功能码、 00 00 读取线圈的起始地址、  00 0A 读取长度、 BC 0D CRC校验

响应格式解析:01 从站地址、 01 功能码、 02 返回字节数量、 11 00 数据、 B5 AC CRC校验

02功能码

02 功能码主要用来读取输入线圈,02功能码和01功能码请求和响应格式基本一致,只有功能码不一样。

发送格式:01 02 00 00 00 08 79 CC

响应格式:01 02 01 1C A0 41

发送格式解析:01 从站地址、 02 功能码、 00 00 读取线圈起始地址、 00 08 读取长度、  79 CC CRC校验

响应格式解析:01 从站地址、 02 功能码、 01 返回字节数量、1C 数据、A0 41 CRC校验

03功能码

主要用来读取输出寄存器。

发送格式:01 03 00 00 00 0A C5 CD

响应格式:01 03 14 00 00 00 0C 00 00 00 00 00 00 00 63 00 00 00 0B 00 00 00 58 7E AD

发送格式解析:01 从站地址、 03 功能码、 00 00 读取寄存器地址 、00 0A 读取寄存器长度、C5 CD CRC校验

响应格式解析: 01  从站地址、03 功能码、14 返回字节数量(是读取的2倍 00 0A)、00 00 00 0C 00 00 00 00 00 00 00 63 00 00 00 0B 00 00 00 58 数据、7E AD CRC校验

04功能码

主要用来读取输入寄存器,04和03功能码请求和响应格式基本相同,只有功能码不一样。

发送格式:01 04 00 00 00 0A 70 0D

响应格式:01 04 14 00 00 00 02 00 00 00 00 00 01 00 00 00 00 00 00 00 07 00 00 81 DC

发送格式解析:01 从站地址、04 功能码、 00 00 读取寄存器地址 、00 0A 读取寄存器的长度、70 0D CRC校验

响应格式解析:01 从站地址、04 功能码、14 返回字节数量(是读取的2倍 00 0A)、00 00 00 02 00 00 00 00 00 01 00 00 00 00 00 00 00 07 00 00 数据、81 DC CRC校验

05功能码

主要用来写入单个线圈。

发送格式:01 05 00 02 FF 00 2D FA

响应格式:01 05 00 02 FF 00 2D FA

如果写入成功那么发送和响应的数据格式是一致的。

格式解析:01 从站地址、05 功能码、00 02 线圈地址、FF 00 写入值、 2D FA CRC校验

06功能码

主要用来写入单个寄存器。

发送格式:01 06 00 00 00 0B C8 0D

响应格式:01 06 00 00 00 0B C8 0D

如果写入成功那么发送和响应的数据格式是一致的。

格式解析:01 从站地址、06 功能码、00 00 寄存器地址、 00 0B写入值、C8 0D CRC校验

0F功能码

主要用来写入多个连续的线圈。

发送格式:01 0F 00 00 00 03 01 07 CE 95

响应格式:01 0F 00 00 00 03 15 CA

发送格式解析:01 从站地址、0F 功能码 、 00 00 写入起始地址、00 03 写入数量、01 07 写入值、CE 95 CRC校验

响应格式解析:01 从站地址、0F 功能码 、 00 00 写入起始地址、00 03 写入数量、15 CA CRC校验

10功能码

主要用来写入多个连续的寄存器。

发送格式:01 10 00 00 00 03 06 00 01 00 02 00 03 3A 81

响应格式:01 10 00 00 00 03 80 08

发送格式解析:01 从站地址、10 功能码、 00 00 写入起始地址、00 03 写入寄存器数量、06 写入字节数量(是写入寄存器的数量的2倍)、00 01 00 02 00 03 数据、3A 81 CRC校验

响应格式解析:01 从站地址、10 功能码、00 00 写入起始地址、00 03 写入寄存器数量、80 08 CRC校验

Modbus TCP
ModbusTCP和Modbus RTU发送格式比较

RTU:01 01 00 00 00 0A BC 0D

TCP:3A EE 00 00 00 06 01 01 00 00 00 0A

3A EE 事务处理标识符 每次发送递增 发送和接收的事务标识符是一致的

00 00 协议传输符

00 06 后面的字节数量

01 单元标识符,就是串口中从站的地址,但是因为是通过TCP进行的数据传输,可以根据IP确定设备,所以单元标识符就不那么重要了

01 功能码 

00 00  其实线圈地址

00 0A  读取数量

其中 3A EE 00 00 00 06 01 被称为MBAP 报文头,一共7个字节,相比RTU TCP去掉了 CRC检验并添加了MBAP报文头。

ModbusTCP和Modbus RTU接收格式比较

RTU:01 01 02 11 00 B5 AC

TCP:3A EF 00 00 00 05 01 01 02 0B 00

3A EF 事务处理标识符,发送和接收的事务标识符是一致的

00 00 协议标识符

00 05 后面的字节数量

01 单元标识符

01 功能码 

02 数据字节数量 

0B 00 返回数据数量

3A EF 00 00 00 05 01 被称为MBAP报文头,一共7个字节

01功能码

发送报文格式:3E F0 00 00 00 06 01 01 00 00 00 0A

响应报文格式:3E F0 00 00 00 05 01 01 02 0F 00

发送报文格式解析:3E F0 00 00 00 06 01 为报文头、01为功能码、00 00为读取地址、00 0A为读取长度

响应报文格式解析:3E F0 00 00 00 05 01为报文头、01为功能码、02为返回字节长度、0F 00为读取数据

02功能码

02与01功能码类似

发送报文格式:4E CF 00 00 00 06 01 02 00 00 00 0A

响应报文格式:4E CF 00 00 00 05 01 02 02 29 00

发送报文格式解析:4E CF 00 00 00 06 01 为报文头、02为功能吗、 00 00 为读取地址、00 0A为读取长度

响应报文格式解析:4E CF 00 00 00 05 01 为报文头、02为功能码、02返回字节长度、29 00为读取数据

03功能码

发送报文格式:00 2F 00 00 00 06 01 03 00 00 00 05

响应报文格式:00 2F 00 00 00 0D 01 03 0A 00 01 00 02 00 03 00 00 00 00

发送报文格式解析:00 2F 00 00 00 06 01为报文头,03为功能码、00 00 为读取起始地址,00 05为读取寄存器的数量

响应报文格式解析:00 2F 00 00 00 0D 01为报文头,03 为功能码,0A返回字节数量(是读取寄存器数量的2倍,),00 01 00 02 00 03 00 00 00 00 为读取数据

04功能码

 发送报文格式:00 3A 00 00 00 06 01 04 00 00 00 05

响应报文格式:00 3A 00 00 00 0D 01 04 0A 00 05 00 04 00 01 00 00 00 00

04功能码发送和响应报文的数据格式都是一样的,只有功能码不一样

05功能码

发送报文格式:02 38 00 00 00 06 01 05 00 00 FF 00响应报文格式:02 38 00 00 00 06 01 05 00 00 FF 00

报文解析:02 38 00 00 00 06 01为报文头,05为功能码,00 00为写入地址,FF 00为写入值

如果写入成功,响应和发送报文是一致的。

06功能码

发送报文格式:04 61 00 00 00 06 01 06 00 00 00 05

响应报文格式:04 61 00 00 00 06 01 06 00 00 00 05

报文解析:04 61 00 00 00 06 01 为报文头,06为功能码,00 00为写入地址,00 05为写入值

如果写入成功,响应和发送报文是一致的。

0F功能码

发送报文格式:05 61 00 00 00 08 01 0F 00 00 00 04 01 0F

响应报文格式:05 61 00 00 00 06 01 0F 00 00 00 04

发送报文解析:05 61 00 00 00 08 01为报文头,0F为功能码,00 00 写入线圈地址,00 04写入线圈数量,01写入字节数、0F数据

响应报文解析:05 61 00 00 00 06 01为报文头,0F为功能码,00 00写入线圈地址,00 04为写入数量

10功能码

发送报文格式:08 4D 00 00 00 0D 01 10 00 00 00 03 06 00 01 00 02 00 03

响应报文格式:08 4D 00 00 00 06 01 10 00 00 00 03

发送报文格式解析:08 4D 00 00 00 0D 01为报文头,10为功能码,00 00写入线圈地址,00 03写入寄存器数量,06写入字节数量,00 01 00 02 00 03写入数据

响应报文格式解析:08 4D 00 00 00 06 01为报文头,10为功能码,00 00写入线圈地址,00 03写入寄存器数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值