Modbus 地址计算器

输入任意一种地址格式(40001 / 400001 / 0x0000 / 偏移量),自动算出全部对应关系。专治「地址偏移了一个」「功能码用错了」「0开始还是1开始搞不清」。

支持:40001(5位参考地址)、400001(6位)、0x0000(十六进制)、纯数字(偏移量)

Modbus 四类数据区速查

前缀名称读写位/字读功能码写单个写多个
0x线圈 Coil读写位010515 (0x0F)
1x离散输入 Discrete Input只读位02——
3x输入寄存器 Input Register只读16位字04——
4x保持寄存器 Holding Register读写16位字030616 (0x10)

高频问题

Q1. Modbus 地址 40001、400001、0x0000 到底是什么关系?
Modbus 协议本身只有「从站地址 + 功能码 + 起始地址(2字节十六进制)+ 数量」,报文中的起始地址从 0 开始。40001/400001 是厂商和文档常用的「参考地址」表示法:第一位 4 表示保持寄存器(功能码 03/06/16),后面的数字是从 1 开始的序号。40001 = 保持寄存器第 1 个 = 报文起始地址 0x0000;40002 = 0x0001,以此类推。有些厂商用 6 位(400001),有些用 5 位(40001),本质一样,只是位数不同。本工具输入任意一种,自动算出全部对应关系。
Q2. 0x、1x、3x、4x 前缀分别对应什么功能码?
Modbus 有四类数据区,用前缀数字区分:0x = 线圈(Coil,可读写位,功能码 01 读/05 写单个/15 写多个);1x = 离散输入(Discrete Input,只读位,功能码 02);3x = 输入寄存器(Input Register,只读 16 位,功能码 04);4x = 保持寄存器(Holding Register,可读写 16 位,功能码 03 读/06 写单个/16 写多个)。工业模拟量采集最常用 4x(保持寄存器)和 3x(输入寄存器)。
Q3. 为什么有些设备地址从 0 开始,有些从 1 开始?
这是 Modbus 最容易踩的坑之一。协议报文里的起始地址严格从 0 开始(0x0000 是第一个寄存器)。但很多 PLC/设备厂商的配置界面和文档用「从 1 开始」的参考地址(如 40001 对应第一个寄存器)。还有些厂商直接用 0 开始编号(如寄存器 0 对应第一个)。结果就是:你以为写的是 40001,设备可能理解成报文地址 0(正确)或 1(错了一个)。调试时如果「读出来的数据偏移了一个寄存器」,基本就是这个问题。本工具同时给出「从0开始的偏移」和「从1开始的参考地址」,对照设备手册确认即可。
Q4. 功能码 03 和 04 有什么区别?读模拟量用哪个?
03 读保持寄存器(4x),04 读输入寄存器(3x)。保持寄存器是设备里可读写的存储区,上位机可以读也可以写(写用 06/16);输入寄存器是设备采集的只读数据(如 AI 模块的采样值),只能读不能写。实际项目中,很多设备的模拟量数据既放在 3x 也放在 4x(厂商映射),有些设备干脆所有数据都放 4x。具体用哪个功能码,看设备手册的「Modbus 地址表」——表中标注 4x 的用 03,标注 3x 的用 04。不确定时两个都试一下,能读到正确数据的就是对的。
Q5. 一次最多能读多少个寄存器?读多了设备报错怎么办?
协议规定 03/04 一次最多读 125 个寄存器(因为响应报文长度限制),01/02 一次最多读 2000 个位。但实际设备支持的上限可能更少(有些设备只支持一次读 32 或 64 个),读多了会返回异常码 03(非法数据值)或 02(非法地址)。工程上建议:① 一次读 30~50 个,留裕量;② 连续地址合并成一次读,比逐点读效率高;③ 非连续地址分组,不要为了凑数读一大段用其中几个点(浪费带宽);④ 如果设备支持,用功能码 23(读/写多个寄存器)可以一次同时读写,但不是所有设备都支持。