CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
Modbus基础知识
一.物理层与通信规范
-1.1.传输介质与接口标准
-1.2.电气特性
-1.3.通信规范
二.报文帧结构
三.请求与响应报文示例
-3.1.读线圈状态0x01
-3.2.读离散输入0x02
-3.3.读保持寄存器0x03
-3.4.读输入寄存器0x04
-3.5.写单个线圈0x05
-3.6.写单个寄存器0x06
-3.7.写多个线圈0x0F
-3.8.写多个寄存器0x10
四.使用控制器收发Modbus报文
-4.1.发送Modbus报文
-4.2.接收Modbus报文
五.注意事项
回到顶部
Modbus基础知识
一.物理层与通信规范
-1.1.传输介质与接口标准
-1.2.电气特性
-1.3.通信规范
二.报文帧结构
三.请求与响应报文示例
-3.1.读线圈状态0x01
-3.2.读离散输入0x02
-3.3.读保持寄存器0x03
-3.4.读输入寄存器0x04
-3.5.写单个线圈0x05
-3.6.写单个寄存器0x06
-3.7.写多个线圈0x0F
-3.8.写多个寄存器0x10
四.使用控制器收发Modbus报文
-4.1.发送Modbus报文
-4.2.接收Modbus报文
五.注意事项
回到顶部
# Modbus基础知识 Modbus是一种广泛应用于工业自动化领域的串行通信协议,采用主从架构,用于控制器与传感器、执行器等设备间的标准化数据交换。 Modbus为单主机控制通信,最多支持 247 个从机,主机主动发起请求,从机响应,从机之间无直接通信。 Modbus协议,拥有三种变体,Modbus RTU、Modbus TCP与Modbus ASCII,如下表所示,本文内容主要介绍Modbus RTU。 | 协议 | 特点 | 适用场景 | | ------------------ | -------------------------------------------- | ------------ | | **Modbus RTU** | 二进制编码,高效;帧结构:[地址][功能码][数据][CRC-16校验] | RS-485工业现场总线 | | **Modbus TCP** | 基于 TCP/IP,端口 502;帧结构:[MBAP头][Modbus数据] | 以太网环境 | | **Modbus ASCII** | ASCII 字符编码,可读性强但效率低;帧结构:[地址][功能码][数据][LRC校验] | 低速文本通信 | ## 一.物理层与通信规范
### 1.1.传输介质与接口标准
Modbus RTU基于串行接口(RS485/RS422)采用二进制编码,数据紧凑,适用于短距离(<1200米),高可靠性场景(如变频器控制)。 采用RS485半双工差分信号传输,支持多点通信,单总线最多连接32个设备(使用中继器可扩展),抗干扰强,需终端电阻(通常首尾接120Ω终端电阻)。 ### 1.2.电气特性
逻辑 "1":A 线电压 > B 线电压(差分电压 > +200mV)。 逻辑 "0":A 线电压 < B 线电压(差分电压 < -200mV)。 ### 1.3.通信规范
主从设备需严格匹配波特率(如9600)、校验方式(奇/偶/无校验)、停止位,否则通信失败。在实际应用中,大多数支持Modbus的设备都默认使用9600波特率,无校验位,8个数据位,1个停止位的Modbus通信参数设置。 Modbus规定仅主机可发起请求,从机被动响应,从机不可主动发送帧报文。 设备通过字符时间间隔来断帧,因此设备发送Modbus报文时,帧间需保持 ≥3.5个字符时间的静默间隔(如9600bps时约4ms)。 超时无响应时,主机自动重发(工业场景通常设3次或者3次以上重试)。 ## 二.报文帧结构
整个Modbus帧被称为应用数据单元(ADU),ADU中又包含了协议数据单元(PDU),PDU中包含了真正需要传输的数据,如下图所示。  - 地址:表示通信的目标从机设备(或广播地址)。主机发送请求时指定目标从机地址;从机响应时返回自身地址。地址范围为 1 至 247(0 通常保留用于广播)。 - 功能码:从机需要执行的操作类型。每个功能码对应特定的寄存器访问或控制命令(如读线圈、写寄存器)。功能码决定了后续数据域的格式和含义。常用的Modbus功能码有0x03、0x04、0x06与0x10,其中最常用的功能码是0x03几乎所有支持Modbus的设备都支持功能码0x03。 比较完整的Modbus功能码列表: | 功能码 | **名称** | **操作类型** | **作用** | | ---- | -------- | ---------- | ------------------------------------ | | 0x01 | 读线圈状态 | 位操作(1bit) | 读取从机数字量输出(DO)的通断状态1为ON,0为OFF。 | | 0x02 | 读离散输入 | 位操作(1bit) | 读取从机数字量输入(DI)的状态(如传感器信号),1为ON,0为OFF。 | | 0x03 | 读保持寄存器 | 字操作(16bit) | 读取从机保持寄存器(可读写,存储模拟量输出或配置参数)。 | | 0x04 | 读输入寄存器 | 字操作(16bit) | 读取从机输入寄存器(只读,如模拟量输入值)。 | | 0x05 | 写单个线圈 | 位操作(1bit) | 强制设置单个线圈状态,FF 00为ON,00 00为OFF。 | | 0x06 | 写单个保持寄存器 | 字操作(16bit) | 修改单个保持寄存器的值(如设定参数)。 | | 0x0F | 写多个线圈 | 位操作(1bit) | 批量设置多个线圈状态(数据按位打包)。 | | 0x10 | 写多个保持寄存器 | 字操作(16bit) | 批量修改多个保持寄存器的值(需指定起始地址和寄存器数量)。 | - 数据:包含功能码操作所需的具体信息,长度和内容由功能码决定,不同功能码的数据详细信息可参考本文第三章《请求与响应示例》。 - 校验码:CRC-16校验 (CRC-16 Checksum),用于检测数据帧在传输过程中是否发生错误(如比特翻转、丢失)。发送方根据地址、功能码、数据域计算出一个两字节的CRC值附加在帧尾。接收方重新计算CRC并与接收到的CRC值比较,若不匹配则丢弃该帧,确保通信数据的完整性。 ## 三.请求与响应报文示例
当从机地址为1时,Modbus RTU请求与响应报文示例如下: ### 3.1.读线圈状态0x01
功能码0x01,请求读线圈地址0x0000开始的2个线圈,请求帧(主机→从机):  线圈状态依次为ON,ON,值为(0b 11)0x03响应帧(从机→主机):  ### 3.2.读离散输入0x02
功能码0x02,请求读DI地址0x0023开始的10个输入,请求帧(主机→从机):  DI状态依次为 ON, OFF, ON, OFF, OFF, OFF, ON, OFF。数据为 (0b 01000101)0x45。 ON, OFF。值为 (0b 01)0x01。 响应帧(从机→主机):  ### 3.3.读保持寄存器0x03
功能码0x03,请求读寄存器0x000A开始的2个值,请求帧(主机→从机):  寄存器值依次为254(0x00FE)、60000(0xEA60),响应帧(从机→主机):  ### 3.4.读输入寄存器0x04
功能码0x04,请求读输入寄存器0x006B开始的3个值,请求帧(主机→从机):  输入寄存器值依次为100(0x64)、1000(0x03E8)、10000(0x2710),响应帧(从机→主机):  ### 3.5.写单个线圈0x05
功能码0x05,请求写线圈0x0005为ON,请求帧(主机→从机):  响应帧(从机→主机)与请求帧相同。 ### 3.6.写单个寄存器0x06
功能码0x06,请求写寄存器0x0032,值为0x1232,请求帧(主机→从机):  响应帧(从机→主机)与请求帧相同。 ### 3.7.写多个线圈0x0F
功能码0x0F,请求写线圈地址0x00A5,数量为12(0x0C),线圈状态依次为ON、OFF、OFF、ON、ON、ON、OFF、OFF、ON、OFF、ON、OFF,请求帧(主机→从机):  响应帧(从机→主机):  ### 3.8.写多个寄存器0x10
功能码0x10,请求写寄存器地址0x0034,数量为2,值依次为200(0xC8)、2000(0x07D0),请求帧(主机→从机):  响应帧(从机→主机):  ## 四.使用控制器收发Modbus报文
[RapidECU-F23M](./f23m.html)控制器支持Modbus主机工作模式与从机工作模式。F23M控制器Modbus模块默认设置为9600波特率,无校验位,8个数据位,1个停止位,单帧发送模式(也支持多帧发送模式)。 ### 4.1.发送Modbus报文
利用ModbusTransmit模块可以发送Modbus报文。 ModbusTransmit发送模块的参数见下表: | 选项 | 选项说明 | 可选值 | | ------------- | ------------------------------------- | ------------------------------------------------------ | | RS485 Channel | RS485 通道 | S485CH1、RS485CH2 | | TX Buffer | 用于发送 Modbus 报文的缓存编号 | 0、1、2、3,当使用单帧发送功能时,只能使用 0;
当使用多帧发送功能时,可以使用 0、1、2、3。 | | Slave ID | 设备地址码 | 1-247 | | Function | 功能码 | 03H、04H、06H、10H | | Data Length | 数据长度,不包含 Modbus 报文的地址码、功能码、CRC16 校验码。 | Modbus 报文总长度-4,比如当发送的Modbus报文总长度为8 时,数据长度为4。 | | Sample | 采样时间 | 自定义,通常使用-1 | 模块的用法:按需求为模块设置所有参数,即可发送与指定设备地址相关的Modbus报文(主机模式下通常为周期性发送,从机模式下接收到主机请求报文后发送)。如下图所示:  ### 4.2.接收Modbus报文
利用ModbusReceive模块可以接收Modbus报文。 ModbusReceive模块的参数见下表: | 选项 | 选项说明 | 可选值 | | ------------- | ------------------ | ------------------------------------------- | | RS485 Channel | RS485 通道 | S485CH1、RS485CH2 | | Function | 功能码 | 03H、04H、06H、10H | | Data Length | 数据长度,Modbus 报文总长度。 | Modbus 报文总长度,比如当接收的Modbus 报文总长度为 8 时,长度为 8。 | | Sample | 采样时间 | 自定义,通常使用-1 | ModbusReceive接收模块有两个输出端口,端口说明见下表: | 端口名称 | 端口说明 | 数据类型 | | ---------- | --------------------------------------------- | ------------------- | | RS485 OK | 是否接收到Modbus帧报文,未收到为0,接收到且CRC正确为1,接收到但CRC错误为2。 | uint8 | | RS485 DATA | RS485报文数据 | uint8(数据的维数取决于数据长度) | 模块的用法:按需求为模块设置所有参数,即可接收总线上的所有Modbus报文(通常在周期性任务中执行)。如下图所示:  ## 五.注意事项
**从机异常响应** Modbus通信时,若从机功能码执行失败,从机应返回功能码+0x80(如0x01 83表示读寄存器异常)并附加错误码。 **数据格式** Modbus通信时字操作(如功能码03/04)通常以16位无符号整数或浮点数传输,具体由设备自定义。 **扩展功能码** 部分设备支持自定义功能码(如65-72、100-110),但需参考具体设备手册。 **典型故障** - **地址冲突**:多个从机地址重复设为1。 - **参数不匹配**:波特率/校验位配置错误(如主机波特率19200,从机波特率9600)。 - **物理层问题**:接线错误(如RS485的A/B线反接)、终端电阻缺失、线路干扰等。 **调试方法** - 测量RS485总线电压:静态时A+≈3V(一般大于2V)、B-≈0V;动态传输时使用示波器查看电压波形。 - 使用串口调试助手、抓包工具等软件协助分析请求/响应报文。