Modbus-RTU报文结构及常用功能码详解

Modbus-RTU报文结构及常用功能码

Modbus是一种串行通讯协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的。现在的Modbus协议已经成为工业控制领域通信协议的业界标准,是工业电子设备间常用的通讯协议。

Modbus协议能够成为工业控制领域应用最广泛的协议,它具备了以下几个特点:

  • 开放性架构:Modbus协议完全公开且无版权限制,企业可自由修改适配设备,降低开发成本。施耐德电气公开协议后,全球200余家企业推出兼容硬件;
  • 跨平台兼容:支持RS-485、RS-232、以太网等多种物理层接口,覆盖从串行通信到TCP/IP网络的场景;
  • 协议简单稳定:固定数据帧格式(地址+功能码+数据+校验)和主从通信模式,确保实时性及可靠性;

Modbus RTU协议

1. Modbus RTU协议的基本概念

Modbus RTU模式是二进制模式,数据流以字节为单位传输,每个字节的高位首先发送。传输数据时,使用了差错检测机制,以确保数据的完整性。通常RTU模式通过RS-485总线进行通讯,因为它能够支持多个设备(最多247个设备)并且支持长距离传输。

2. Modbus RTU通信的帧结构

用途 长度 描述
设备地址 1byte 从机有唯一的地址,范围1-247.地址0是广播地址,从机不会应答
功能码 1byte 主机要求从机执行的操作类型
数据 可变(0-252byte) 包含了命令的具体参数,格式和长度却决于功能码
CRC校验 2byte 检查数据在传输过程中是否有错误

3. Modbus RTU协议中的功能码

常用功能码表格

功能码 名称 操作数据类型 作用
0x01 读线圈(Read Coils) 取得一组逻辑线圈的当前状态(ON/OFF)
0x02 读离散输入寄存器(Read Discrete Inputs) 取得一组开关输入的当前状态(ON/OFF)
0x03 读保持寄存器(Read Holding Registers) 整型、浮点型、字符型 在一个或多个保持寄存器中取得当前的二进制值
0x04 读输入寄存器(Read Input Registers) 整型、浮点型 在一个或多个输入寄存器中取得当前的二进制值
0x05 写单个线圈寄存器 (Write Single Coil) 强置一个逻辑线圈的通断状态
0x06 写单个保持寄存器(Write Single Register) 整型、浮点型、字符型 把具体二进制值装入一个保持寄存器
0x0F 写多个线圈寄存器(Write Multiple Coils) 强置一串连续逻辑线圈的通断
0x10 写多个保持寄存器(Write Multiple Registers) 整型、浮点型、字符型 把具体的二进制值装入一串连续的保持寄存器

1.功能码 0x01-读线圈(Read Coils)

  • 作用:读从机线圈寄存器,位操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x01 0x00 0x17 0x00 0x08 0x8D 0xC8
js 复制代码
Tx:01 01 00 17 00 08 8D C8
  • 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
从机地址 功能码 返回字节数 data CRC H CRC L
0x01 0x01 0x01 0x17 0x11 0x86
js 复制代码
Rx:01 01 01 17 11 86

2.功能码 0x02-读离散输入寄存器(Read Discrete Inputs)

  • 作用:读从机离散输入寄存器,位操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x02 0x00 0x17 0x00 0x08 0xC9 0xC8
js 复制代码
Tx:01 02 00 17 00 08 C9 C8
  • 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
从机地址 功能码 返回字节数 data CRC H CRC L
0x01 0x02 0x01 0x17 0xE1 0x86
js 复制代码
Rx:01 02 01 17 E1 86

3.功能码 0x03-读保持寄存器(Read Holding Inputs)

  • 作用:读从机保持寄存器,字节操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x03 0x00 0x17 0x00 0x01 0x34 0x0E
js 复制代码
Tx:01 03 00 17 00 01 34 0E
  • 响应:返回数据;
从机地址 功能码 返回字节数 data1H data1L CRC H CRC L
0x01 0x03 0x02 0x17 0x01 0x76 0x74
js 复制代码
Rx:01 03 02 17 01 76 74

4.功能码 0x04-读输入寄存器(Read Input Inputs)

  • 作用:读从机输入寄存器,字节操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x04 0x00 0x17 0x00 0x01 0x81 0xCE
js 复制代码
Tx:01 04 00 17 00 01 81 CE
  • 响应:返回数据;
从机地址 功能码 返回字节数 data1H data1L CRC H CRC L
0x01 0x04 0x02 0x17 0x01 0x77 0x00
js 复制代码
Rx:01 04 02 17 01 77 00

5.功能码 0x05-写单个线圈寄存器(Write Single Coil)

  • 作用:写单个线圈,位操作,只能写一个,写0xFF00表示线圈为ON,写0x0000表示线圈为OFF
  • 发送指令:从机地址:0x01,设置线圈0x0017为ON。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) DATAH DATAL CRC H CRC L
0x01 0x05 0x00 0x17 0xFF 0x00 0x3C 0x3E
js 复制代码
Tx:01 05 00 17 FF 00 3C 3E
  • 响应:同发送数据;

6.功能码 0x06-写单个保持寄存器(Write Single Register)

  • 作用:写单个保持寄存器,字节操作,只能写一个,
  • 发送指令:从机地址:0x01,设置线圈0x0017为0x2193。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) DATAH DATAL CRC H CRC L
0x01 0x06 0x00 0x17 0x21 0x93 0x61 0xF3
js 复制代码
Tx:01 06 00 17 21 93 61 F3
  • 响应:同发送数据;

7.功能码 0x0F-写多个线圈(Write Multiple Coils)

  • 作用:写多个线圈寄存器,数据区的位0表示OFF,位1表示ON;
  • 发送指令:从机地址:0x01,线圈地址0x0012,写5个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 DATAH DATAL CRC H CRC L
0x01 0x0F 0x00 0x12 0x00 0x05 0x01 0x00 0x13 0x54 0x93
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 54 93
  • 响应
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 CRC H CRC L
0x01 0x0F 0x00 0x12 0x00 0x05 0x01 0xCC 0xD7
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 CC D7

8.功能码 0x10-写多个保持寄存器(Write Multiple Registers)

  • 作用:写多个保持寄存器,字节操作,可写多个;
  • 发送指令:从机地址:0x01,寄存器地址0x0012,写2个寄存器4个字节数据。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 DATA1H DATA1L DATA2H DATA2L CRC H CRC L
0x01 0x10 0x00 0x12 0x00 0x02 0x04 0x00 0x13 0x00 0x11 0x42 0xB3
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 00 11 42 B3
  • 响应
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 CRC H CRC L
0x01 0x10 0x00 0x12 0x00 0x02 0x04 0x0C 0x8B
js 复制代码
Tx:01 0F 00 12 00 02 04 0C 8B 

结语

Modbus RTU协议是工业控制系统中一种非常常见的通信协议,以其简单、可靠和高效的特点被广泛应用于各类设备的串行通信中。它适合小型到中型的系统,尤其在现场设备、PLC和传感器之间的通信中发挥着重要作用。然而,由于没有内建的安全机制,在使用时需要确保网络和通信的安全性。


推荐工具


关注我,获取更多有用的知识和工具

相关推荐
工业通讯探索者2 天前
ProfiNet转DeviceNet边缘计算网关多品牌集成实践:污水处理厂设备网络融合全流程解析
modbus·工业物联网·工业自动化·数据交互·协议转换网关
serene949 天前
HL7消息编辑器的使用手册
物联网·hl7·消息·modbus·数据·医疗行业·医疗信息
兴达易控10 天前
Profibus DP主站转modbusTCP网关与dp从站通讯案例
网络·网络协议·modbus
周不易13 天前
ubuntu20.04+qt5.12.8安装serialbus
开发语言·c++·qt·modbus·serialbus
兴达易控24 天前
Modbus TCP转Profibus DP网关接防撞雷达与PLC通讯
网络协议·modbus
WINDHILL_风丘科技2 个月前
Softing线上研讨会 | 自研还是购买——用于自动化产品的工业以太网
modbus·工业自动化·profinet·工业以太网·线上研讨会
繁星蓝雨4 个月前
Qt实现使用TCP与RS485串口设备通信————附带详细实践方法
qt·modbus·modbus tcp·rs485·modbus rtu
飘飘燃雪4 个月前
Linux Modbus协议详解,代码示例
linux·运维·服务器·modbus
serene13124 个月前
Modbus新手教程
物联网·mqtt·教程·modbus·工业网关·iec104·iec101