Modbus 协议速查(功能码 / RTU / TCP)

2026-06-14

依据 Modbus 公开规范整理,适用于支持 Modbus 的时序器、IO 模块、PLC 等设备。具体设备的寄存器地址、功能码支持范围与串口参数以设备手册为准。

从一次”全馆同时上电跳闸”说起

展厅二十几路设备——投影、灯光、音响、服务器、显示屏——如果早上开馆一个总闸全推上去,几十台机器同一瞬间涌浪电流,轻则跳闸、重则烧电源。老练的做法是用电源时序器分路、按秒延时逐路上电:先服务器、再显示、再投影、最后音响。而让中控能”按顺序、一路一路”地控这个时序器的,通常就是 Modbus。它是工业界几十年的老协议,简单、透明、几乎所有时序器和 IO 模块都支持。协议本身很朴素,难在寄存器地址、功能码和串口参数这几样对不上就读不到、写不进。这篇把主从机制、功能码、RTU/TCP 封装到展厅分路上电讲透。

Modbus 是什么

Modbus 是一种主从式请求-应答协议:网络上有一个主站(中控)和若干带地址的从站(设备),永远是主站主动发问、从站被动回答,从站之间不说话、也不会主动上报。把它想成点名:老师(主站)念到几号(从站地址),几号才应答,没被念到的一律沉默。主站发一条报文,里面写清”找几号从站、干什么操作(功能码)、操作哪个地址、值是多少”,从站照做并回执。展厅里它常用于电源时序器、继电器 IO 模块、环境监测(温湿度、门磁)等设备的对接。SoftControl 展厅中控 原生支持 Modbus,配好从站地址和寄存器就能直接驱动。

Modbus 的四类数据模型

要看懂功能码,先分清 Modbus 把设备数据分成四种”抽屉”,两两成对(位 / 字 × 读写 / 只读):

数据类型位宽读写展厅里对应什么
线圈 Coils1 位读 / 写继电器开关、时序器某一路的通断
离散输入 Discrete Inputs1 位只读门磁、按钮、到位信号等开关量输入
保持寄存器 Holding Registers16 位读 / 写延时参数、设定值、可写配置
输入寄存器 Input Registers16 位只读温湿度、电压电流等采集值

记住这张对应表,功能码就是”对哪种抽屉做什么”的组合,一下就串起来了。

常用功能码表

功能码Hex操作数据类型
010x01读线圈 Read Coils1 位 读写
020x02读离散输入1 位 只读
030x03读保持寄存器16 位 读写
040x04读输入寄存器16 位 只读
050x05写单个线圈0xFF00 开 / 0x0000 关
060x06写单个寄存器16 位
0F0x0F写多个线圈批量
100x10写多个寄存器批量

注意:FC05 写线圈标准只接受两个值——0xFF00(开)和 0x0000(关),中间任何其它值在合规设备上会返回异常码。别自作聪明写个 0x0001 当”开”,标准设备不认。

RTU 与 TCP:同样的芯,不同的壳

Modbus 有两种常见传输封装,功能码和数据模型完全一样,区别只在最外层怎么包:

Modbus RTUModbus TCP
物理层RS-232 / RS-485 串口以太网 TCP/IP
帧结构从站地址(1–247) + PDU + CRC 校验MBAP 头(事务ID / 协议ID / 长度 / 单元ID) + PDU
校验帧尾 16 位 CRC靠 TCP 自身可靠传输,无 CRC
端口 / 参数串口参数(常见 9600 8N1)TCP 502
功能码完全一致完全一致

PDU(协议数据单元)就是”功能码 + 数据”那部分,两种封装里长得一模一样。 RTU 在前面加从站地址、后面加 CRC 校验(因为串口不可靠,靠 CRC 查错);TCP 换成前面加一个 MBAP 头(事务 ID 用来把应答和请求对上号,单元 ID 相当于串口那边的从站地址),末尾不用 CRC——TCP 本身已经保证不丢不错了。所以你若懂了 RTU,TCP 只是换个壳。很多现场是”Modbus TCP 网关 + 下挂 RS-485 串口设备”,网关把 TCP 报文里的单元 ID 翻成串口从站地址转发,两种封装在网关里握手。

展厅落地:用 Modbus 做分路延时上电

回到开头那个电源时序器。假设它是一台 8 路 Modbus 继电器,每一路对应一个线圈地址(比如线圈 0 到 7 对应第 1 到 8 路)。中控做”开馆分路上电”的逻辑就是:

  1. FC05 写线圈 0 = 0xFF00(服务器那路先通电),等 3 秒;
  2. FC05 写线圈 1 = 0xFF00(显示屏那路),再等 2 秒;
  3. 依次点亮投影、灯光、音响那几路,每路之间留延时,避开涌浪电流;
  4. 需要一次开好几路时用 FC0F(写多个线圈)批量下发。

闭馆反过来,按安全顺序逐路 0x0000 断电(一般先关音响投影、最后关服务器)。状态采集上,中控用 FC01 读回各路线圈当前是开是关,核对”该上电的都上了没”;接了环境监测的话用 FC04 读输入寄存器拿温湿度。继电器联动同理,写线圈控制电动幕布、门禁、新风等开关量设备。在 SoftControl 展厅中控 里,这一整套”逐路延时 + 状态核对”被封装成”开馆""闭馆”场景按钮或定时任务,配合 SoftPlayer 展厅播控 做内容联动,运营早上点一下”开馆”,底下 Modbus 就按秒把二十几路设备稳稳唤醒。这跟 DMX512 灯光PJLink 投影 里把底层协议封装成”场景”的思路一样——中控吃掉协议差异,对外只留下一个按钮。

故障排查表

现象可能原因排查 / 解决
读不到任何数据 / 一直超时从站地址错、串口参数(波特率 / 校验 / 停止位)不一致核对设备铭牌的从站地址与串口参数,逐项对齐
读到数据但值不对 / 错位寄存器地址偏移问题(有的手册地址从 1 起、协议从 0 起,差 1)试着把地址 ±1,或按手册说明确认基址
写线圈返回异常码FC05 写了 0xFF00/0x0000 以外的值开只写 0xFF00,关只写 0x0000
功能码报非法该设备不支持这个功能码,或用错了数据类型查手册支持的功能码,输入寄存器只能读(FC04)不能写
RS-485 总线偶发通信错缺终端电阻、接反 A/B、线太长或劣质、多主站抢线末端加 120Ω 终端,核对 A/B 极性,确保总线单主站
挂多个设备只有部分能通从站地址冲突(两台设同一地址)逐台核对并改成互不重复的地址
Modbus TCP 连不上 502IP / 端口错、不同网段、防火墙拦、单元 ID 不对核对 IP 端口网段与防火墙,网关下挂串口设备时核对单元 ID

排查口诀:先对从站地址和串口 / TCP 参数,再对寄存器地址偏移,最后才对功能码。 大半的 Modbus 现场毛病死在”地址或参数没对齐”这一步。

边界与安全

地址偏移是头号坑。 Modbus 有个历史遗留:不少手册按”从 1 开始”的编号写地址(比如 40001 表示第 1 个保持寄存器),而协议报文里实际用的是从 0 开始的偏移。读到的值整体错开一格,八成是这个 ±1 没对上,务必按手册说明确认基址。RS-485 是总线不是星型。 跟 DMX 一样,Modbus RTU 走 RS-485 时要菊花链、末端加 120Ω 终端电阻、A/B 别接反;标准 32 个单位负载,设备多了要加中继。单主站原则。 一条 RTU 总线只能有一个主站发问,两个中控同时抢线会乱套;要多点接入就上 Modbus TCP 或加网关。Modbus 无认证无加密。 报文明文、谁都能发,控制网务必隔离,别把 502 端口暴露在公网。

动手检查清单

对接一台 Modbus 设备前后,对着过一遍:

  • 记下设备的从站地址(RTU)或 IP + 单元 ID(TCP)
  • RTU 核对串口参数(波特率 / 数据位 / 校验 / 停止位)与设备一致
  • 查手册确认寄存器地址基址(从 0 还是从 1 起),避开 ±1 偏移
  • 明确每个操作用哪个功能码,读写别用错数据类型
  • RS-485 已菊花链、末端 120Ω、A/B 极性正确、单主站
  • FC05 写线圈只用 0xFF00 / 0x0000
  • 分路上电 / 断电顺序与延时已在中控编好并测试触发

小结

Modbus 的骨架很简单:主站问、从站答,四种数据抽屉配上几个功能码,读写各就各位。RTU 和 TCP 只是同一套 PDU 换了个外壳。真正决定现场通不通的从来不是协议本身,而是那几样必须严丝合缝对齐的东西——从站地址、串口 / TCP 参数、寄存器地址偏移。上层再由中控把逐路延时上电、状态核对封装成”开馆""闭馆”场景,二十几路设备才真正变成运营手里一个按钮的事。

延伸阅读:了解 DMX512 灯光控制PJLink 投影控制TCP/UDP 通信基础,或查看全部设备协议速查


SoftControl 原生支持 Modbus 对接展厅设备。了解 SoftControl 展厅中控、查看解决方案落地案例,或直接联系我们聊聊你的定制需求

需要展厅软硬件方案或定制开发?