湖北睿能电气有限公司-j9官方网址

发布时间:

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

网站地图