首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Modbus 功能码入门指南

Modbus 功能码入门指南

作者头像
科控物联
发布2026-05-06 12:29:42
发布2026-05-06 12:29:42
1280
举报

适合初学者的功能码速查手册

版本: 1.0 | 编写日期: 2026-04-22


什么是功能码?

功能码(Function Code)是 Modbus 协议中的"命令代码",告诉设备要执行什么操作。

类比理解

代码语言:javascript
复制
功能码就像餐厅菜单上的编号:
- 01号 = 查看某道菜是否还有
- 03号 = 查看菜的价格
- 06号 = 点一道菜
- 10号 = 批量点菜

功能码分类速览

代码语言:javascript
复制
┌─────────────────────────────────────────────────────────────┐
│                      Modbus 功能码                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐   │
│   │   读取类    │    │   写入类    │    │   诊断类    │   │
│   │  01 02 03  │    │  05 06 15  │    │  07 08 11  │   │
│   │     04      │    │    16 22   │    │  43 ...    │   │
│   └─────────────┘    └─────────────┘    └─────────────┘   │
│                                                             │
│   最常用 ★★★        常用 ★★          进阶 ★             │
│                                                             │
└─────────────────────────────────────────────────────────────┘
代码语言:javascript
复制


一、标准功能码(最常用)

📖 读取类功能码

FC01 - 读取线圈状态

项目

说明

功能码

0x01 (十进制 1)

作用

读取开关量输出的状态(ON/OFF)

数据类型

位(单个 0 或 1)

可读数量

1 ~ 2000 个

通俗解释

查询设备的"开关"状态。比如:继电器是吸合还是断开?阀门是开还是关?

典型应用

  • 查询继电器输出状态
  • 查询指示灯状态
  • 查询电机启停状态

示例

代码语言:javascript
复制
请求:读取 1 号从站,地址 0 开始的 8 个线圈
响应:返回 8 个位状态,如 [1,0,1,1,0,0,1,0]

解读:线圈 0=ON, 线圈 1=OFF, 线圈 2=ON, ...

FC02 - 读取离散输入

项目

说明

功能码

0x02 (十进制 2)

作用

读取开关量输入的状态(ON/OFF)

数据类型

位(单个 0 或 1)

可读数量

1 ~ 2000 个

通俗解释

查询设备的"输入信号"状态。与 FC01 的区别是:这是只读的外部信号。

FC01 vs FC02 对比

对比项

FC01 线圈

FC02 离散输入

方向

输出(可控制)

输入(只读)

典型设备

继电器、指示灯

按钮、限位开关

可写

✅ 可以写

❌ 只能读

典型应用

  • 读取按钮按下状态
  • 读取限位开关状态
  • 读取传感器报警信号

FC03 - 读取保持寄存器 ⭐ 最常用

项目

说明

功能码

0x03 (十进制 3)

作用

读取可读写的数值数据

数据类型

16位整数(0 ~ 65535)

可读数量

1 ~ 125 个

通俗解释

读取设备的"参数值"或"设置值"。这是最常用的功能码!

典型应用

  • 读取变频器频率设定
  • 读取温度设定值
  • 读取 PID 参数
  • 读取设备配置

示例

代码语言:javascript
复制
请求:读取 1 号从站,地址 0 开始的 3 个寄存器
响应:返回 3 个数值,如 [500, 100, 200]

解读:
  寄存器 0 = 500 → 频率设定 50.0Hz
  寄存器 1 = 100 → 加速时间 10.0s
  寄存器 2 = 200 → 减速时间 20.0s

FC04 - 读取输入寄存器

项目

说明

功能码

0x04 (十进制 4)

作用

读取只读的测量数值

数据类型

16位整数(0 ~ 65535)

可读数量

1 ~ 125 个

通俗解释

读取设备的"测量值"或"实际值"。与 FC03 的区别是:这是只读的传感器数据。

FC03 vs FC04 对比

对比项

FC03 保持寄存器

FC04 输入寄存器

方向

可读写

只读

典型数据

设定值、参数

测量值、实际值

典型应用

频率设定、PID参数

温度测量、压力测量

典型应用

  • 读取温度传感器数值
  • 读取压力传感器数值
  • 读取电流、电压测量值
  • 读取流量计数值

✏️ 写入类功能码

FC05 - 写单个线圈

项目

说明

功能码

0x05 (十进制 5)

作用

控制单个开关量输出

数据类型

位(ON 或 OFF)

写入数量

1 个

通俗解释

控制一个"开关"。比如:启动电机、打开阀门、点亮指示灯。

写入值

含义

0xFF00

ON(开/启动)

0x0000

OFF(关/停止)

典型应用

  • 启动/停止电机
  • 打开/关闭阀门
  • 点亮/熄灭指示灯
  • 复位报警

示例

代码语言:javascript
复制
请求:写入 1 号从站,地址 0 的线圈,值 = ON
响应:成功(原样返回请求)

效果:电机启动

FC06 - 写单个寄存器 ⭐ 最常用

项目

说明

功能码

0x06 (十进制 6)

作用

设置单个参数值

数据类型

16位整数(0 ~ 65535)

写入数量

1 个

通俗解释

设置一个"数值参数"。比如:设置频率、设置温度、设置时间。

典型应用

  • 设置变频器频率
  • 设置温度控制目标
  • 设置定时器时间
  • 设置 PID 参数

示例

代码语言:javascript
复制
请求:写入 1 号从站,地址 0 的寄存器,值 = 500
响应:成功(原样返回请求)

效果:频率设定为 50.0Hz(精度 0.1)

FC15 - 写多个线圈

项目

说明

功能码

0x0F (十进制 15)

作用

批量控制多个开关量输出

数据类型

位(多个 ON/OFF)

写入数量

1 ~ 1968 个

通俗解释

一次控制多个"开关"。比逐个用 FC05 更高效。

典型应用

  • 批量控制多路继电器
  • 模式切换(多位开关)
  • 批量启停设备

示例

代码语言:javascript
复制
请求:写入 1 号从站,地址 0 开始的 8 个线圈
数据:[1,0,1,1,0,0,1,0]
响应:成功,写入 8 个线圈

效果:8 路继电器按指定状态动作

FC16 - 写多个寄存器 ⭐ 常用

项目

说明

功能码

0x10 (十进制 16)

作用

批量设置多个参数值

数据类型

16位整数(多个)

写入数量

1 ~ 123 个

通俗解释

一次设置多个"数值参数"。比逐个用 FC06 更高效。

典型应用

  • 批量设置变频器参数
  • 批量设置 PID 参数
  • 多参数联动设置

示例

代码语言:javascript
复制
请求:写入 1 号从站,地址 0 开始的 3 个寄存器
数据:[500, 100, 150]
响应:成功,写入 3 个寄存器

效果:
  频率 = 50.0Hz
  加速时间 = 10.0s
  减速时间 = 15.0s

FC22 - 屏蔽写寄存器

项目

说明

功能码

0x16 (十进制 22)

作用

修改寄存器的特定位,不影响其他位

数据类型

16位整数

写入数量

1 个

通俗解释

精确修改"控制字"的某一位。比如:只改第 3 位,其他位不变。

典型应用

  • 修改控制字的特定位
  • 修改状态标志位
  • 位级参数设置

算法原理

代码语言:javascript
复制
结果 = (当前值 AND AND屏蔽) OR (OR屏蔽 AND NOT AND屏蔽)

简单理解:
- AND屏蔽 = 0 的位会被清零
- OR屏蔽 = 1 的位会被置一
- AND屏蔽 = 1 的位保持原值

FC23 - 读写多个寄存器

项目

说明

功能码

0x17 (十进制 23)

作用

一个请求同时完成读取和写入

数据类型

16位整数

读取数量

1 ~ 125 个

写入数量

1 ~ 121 个

通俗解释

"原子操作":设置参数的同时读取状态。一次通信完成两件事。

典型应用

  • 设置频率并读取当前状态
  • 写入控制字并读取状态字
  • 需要原子操作的场景

优势

  • 减少通信次数
  • 保证操作原子性
  • 提高效率

二、扩展功能码(进阶)

FC07 - 读取异常状态

项目

说明

功能码

0x07 (十进制 7)

作用

快速读取设备的异常状态字节

数据类型

8位字节

典型应用:设备快速诊断


FC08 - 诊断功能

项目

说明

功能码

0x08 (十进制 8)

作用

执行各种诊断测试

子功能

返回查询数据、重启通信、返回计数器等

典型应用:通信链路测试、故障诊断


FC11 - 报告服务器 ID

项目

说明

功能码

0x11 (十进制 17)

作用

读取设备的标识信息

返回数据

设备类型、运行状态、厂商信息

典型应用:设备识别、设备发现


FC43 - 读取设备标识

项目

说明

功能码

0x2B (十进制 43)

作用

读取详细的设备标识信息

可读信息

厂商名称、产品代码、版本号、产品名称等

典型应用:设备管理、资产追踪


三、功能码选择指南

根据数据类型选择

代码语言:javascript
复制
┌─────────────────────────────────────────────────────┐
│                 我要操作什么数据?                    │
├─────────────────────────────────────────────────────┤
│                                                     │
│   位数据(开关量)                                   │
│   ├── 读取 → FC01(线圈)或 FC02(离散输入)        │
│   └── 写入 → FC05(单个)或 FC15(多个)            │
│                                                     │
│   字数据(数值)                                     │
│   ├── 读取 → FC03(保持寄存器)或 FC04(输入寄存器)│
│   └── 写入 → FC06(单个)或 FC16(多个)            │
│                                                     │
└─────────────────────────────────────────────────────┘
代码语言:javascript
复制

根据操作类型选择

操作

推荐功能码

理由

读取单个参数

FC03

最简单直接

读取多个参数

FC03

一次读取多个

设置单个参数

FC06

最简单直接

设置多个参数

FC16

一次设置多个

控制单个开关

FC05

最简单直接

控制多个开关

FC15

一次控制多个

设置并读取

FC23

原子操作

最常用功能码 Top 5

排名

功能码

使用频率

典型场景

🥇

FC03

★★★★★

读取参数/状态

🥈

FC06

★★★★☆

设置参数

🥉

FC16

★★★☆☆

批量设置参数

4

FC04

★★★☆☆

读取测量值

5

FC05

★★☆☆☆

控制开关


四、常见问题

Q1: FC01 和 FC02 有什么区别?

:都是读取位状态,区别在于数据来源:

  • FC01 读取输出(线圈),是设备控制的,可以写入
  • FC02 读取输入(离散输入),是外部信号,只读

Q2: FC03 和 FC04 有什么区别?

:都是读取寄存器,区别在于数据性质:

  • FC03 读取保持寄存器,是设定值/参数,可以写入
  • FC04 读取输入寄存器,是测量值,只读

Q3: 什么时候用 FC06,什么时候用 FC16?

  • 1 个参数 → 用 FC06
  • 多个参数 → 用 FC16(效率更高)

Q4: 为什么有些设备不支持某些功能码?

  • 设备功能有限,只实现了常用功能码
  • 工业设备通常支持 FC01/02/03/04/05/06/15/16 即可满足大部分需求
  • 购买设备前确认协议支持的功能码

Q5: 功能码出错怎么办?

:设备会返回异常响应:

  • 功能码 + 0x80 = 异常响应
  • 异常码说明错误原因

异常码

含义

解决方法

0x01

非法功能码

设备不支持该功能码

0x02

非法地址

地址超出范围

0x03

非法数据

数据值无效

0x04

设备故障

设备内部错误


五、快速参考卡片

代码语言:javascript
复制
┌──────────────────────────────────────────────────────────────┐
│                    Modbus 功能码速查卡                        │
├──────────────────────────────────────────────────────────────┤
│  读取类                                                       │
│  ┌────┬──────────────────────┬───────────────────────────┐  │
│  │ 01 │ 读取线圈(输出位)    │ 可写 │ 1-2000 个         │  │
│  │ 02 │ 读取离散输入(输入位)│ 只读 │ 1-2000 个         │  │
│  │ 03 │ 读取保持寄存器        │ 可写 │ 1-125 个 ⭐最常用 │  │
│  │ 04 │ 读取输入寄存器        │ 只读 │ 1-125 个          │  │
│  └────┴──────────────────────┴───────────────────────────┘  │
│                                                              │
│  写入类                                                       │
│  ┌────┬──────────────────────┬───────────────────────────┐  │
│  │ 05 │ 写单个线圈            │ 1 个 │ ON=0xFF00         │  │
│  │ 06 │ 写单个寄存器          │ 1 个 │ ⭐最常用          │  │
│  │ 15 │ 写多个线圈            │ 1-1968 个                │  │
│  │ 16 │ 写多个寄存器          │ 1-123 个                 │  │
│  │ 22 │ 屏蔽写寄存器          │ 位操作                   │  │
│  │ 23 │ 读写多个寄存器        │ 原子操作                 │  │
│  └────┴──────────────────────┴───────────────────────────┘  │
│                                                              │
│  记忆口诀:                                                   │
│  01读线圈02读输入,03读参数04读值                            │
│  05写开关06写值,15批量16多参数                              │
└──────────────────────────────────────────────────────────────┘
代码语言:javascript
复制

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 适合初学者的功能码速查手册
    • 什么是功能码?
    • 功能码分类速览
    • 一、标准功能码(最常用)
      • 📖 读取类功能码
      • ✏️ 写入类功能码
    • 二、扩展功能码(进阶)
      • FC07 - 读取异常状态
      • FC08 - 诊断功能
      • FC11 - 报告服务器 ID
      • FC43 - 读取设备标识
    • 三、功能码选择指南
      • 根据数据类型选择
      • 根据操作类型选择
      • 最常用功能码 Top 5
    • 四、常见问题
      • Q1: FC01 和 FC02 有什么区别?
      • Q2: FC03 和 FC04 有什么区别?
      • Q3: 什么时候用 FC06,什么时候用 FC16?
      • Q4: 为什么有些设备不支持某些功能码?
      • Q5: 功能码出错怎么办?
    • 五、快速参考卡片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档