Modbus协议功能码及格式解析

发布时间:

2025-01-13

在工业自动化和设备通信中,Modbus协议作为一种常见的串行通信协议,广泛应用于PLC、传感器、变频器等设备之间的数据交换。Modbus协议通过特定的功能码来实现不同的操作。今天,我们就来详细解析Modbus协议的功能码及其格式。

一、Modbus协议格式概述

Modbus协议的数据格式主要包括以下部分:

  1. 地址域(Address):

 1字节,表示设备的地址。

  1. 功能码(Function Code):

 1字节,表示要执行的操作类型。

  1. 数据域(Data):

 N字节,表示操作所需要的数据或响应的数据。

  1. CRC校验(CRC):

 2字节,用于数据完整性校验。

Modbus协议的基本数据格式如下:

  •  
| 地址域 | 功能码 | 数据域 | CRC校验 |


 


 

二、常见Modbus功能码及其含义

Modbus协议支持多种功能码,每种功能码对应不同的操作或请求。以下是常见功能码的详细介绍:

1. 功能码0x01:读取线圈状态(Read Coils)

功能码0x01用于读取一个或多个线圈(Coils)状态(开/关)。该操作允许主机获取从设备的输出状态。

  • 请求格式:
  •  
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | CRC校验 |


 


 

  • 响应格式:
  •  
| 地址域 | 功能码 | 字节数(1字节) | 数据 | CRC校验 |


 


 

数据:每个字节代表8个线圈的状态,按位表示(1为开,0为关)。

示例:主机请求读取地址为0x01设备的起始地址0x0000到0x0007的线圈状态。 请求:
01 01 00 00 00 07 CRC

响应:
01 01 01 80 CRC
表示设备0x01的线圈状态为:0x80(0b10000000)(即第一个线圈开,第二个线圈关,依此类推)。

2. 功能码0x02:读取离散输入状态(Read Discrete Inputs)

功能码0x02用于读取一个或多个离散输入(Discrete Inputs)的状态。

  • 请求格式:
  •  
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | CRC校验 |


 


 

  • 响应格式:
  •  
| 地址域 | 功能码 | 字节数(1字节) | 数据 | CRC校验 |


 


 

示例:主机请求读取地址为0x01设备的起始地址0x0000到0x0007的离散输入状态。 请求:
01 02 00 00 00 07 CRC

响应:
01 02 01 80 CRC
表示设备0x01的离散输入状态为:0x80。

3. 功能码0x03:读取保持寄存器(Read Holding Registers)

功能码0x03用于读取一个或多个保持寄存器的值。保持寄存器通常用于存储设备的配置参数或测量结果。

  • 请求格式:
  •  
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | CRC校验 |


 


 

  • 响应格式:
  •  
| 地址域 | 功能码 | 字节数(1字节) | 数据(N字节) | CRC校验 |


 


 

示例:主机请求读取设备0x01的起始地址0x0000的2个保持寄存器。 请求:
01 03 00 00 00 02 CRC

响应:
01 03 04 00 01 00 02 CRC
表示第一个寄存器的值为0x0001,第二个寄存器的值为0x0002。

4. 功能码0x04:读取输入寄存器(Read Input Registers)

功能码0x04用于读取一个或多个输入寄存器的值。输入寄存器通常用于读取传感器等设备的测量数据。

  • 请求格式:
  •  
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | CRC校验 |


 


 

  • 响应格式:
  •  
| 地址域 | 功能码 | 字节数(1字节) | 数据(N字节) | CRC校验 |


 


 

示例:主机请求读取设备0x01的输入寄存器值。 请求:
01 04 00 00 00 02 CRC

响应:
01 04 04 00 01 00 02 CRC
表示第一个输入寄存器的值为0x0001,第二个寄存器的值为0x0002。

5. 功能码0x05:强制单个线圈(Force Single Coil)

功能码0x05用于强制设置单个线圈的状态为开或关。

请求格式:

  •  
| 地址域 | 功能码 | 起始地址(2字节) | 状态(2字节) | CRC校验 |


 


 


 

状态:0xFF00表示开,0x0000表示关。

响应格式:

  •  
| 地址域 | 功能码 | 起始地址(2字节) | 状态(2字节) | CRC校验 |


 


 


 

示例:主机请求设置设备0x01的线圈0x0000为开状态。 请求:
01 05 00 00 FF 00 CRC

响应:
01 05 00 00 FF 00 CRC

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

功能码0x06用于写入一个保持寄存器的值。

  • 请求格式:
  •  
| 地址域 | 功能码 | 寄存器地址(2字节) | 数据(2字节) | CRC校验 |


 


 

  • 响应格式:
  •  
| 地址域 | 功能码 | 寄存器地址(2字节) | 数据(2字节) | CRC校验 |


 


 

示例:主机请求写入设备0x01的保持寄存器地址0x0000,值为0x0001。 请求:
01 06 00 00 00 01 CRC

响应:
01 06 00 00 00 01 CRC

XML 地图