Modbus遵循主从方式进行通信,一个主机可以连接多个从机,主机可以主动发送数据给从机,但是从机不可以主动发送数据给主机。
通信协议
-
Modbus RTU,RTU是最常用的
-
Modbus ASCII
-
Modbus TCP/IP
-
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写入寄存器数量