Modbus 工程师必备神器!RTU/TCP/ASCII 报文生成解析器,效率提升 10 倍
还在手动计算 Modbus 报文?这个工具支持 RTU/TCP/ASCII 三种协议,自动生成请求/响应报文,CRC/LRC 校验、报文解析、历史记录一键搞定
前言:Modbus 调试的痛,工程师都懂
我做了 20 年工业自动化,太懂 Modbus 调试的痛苦。
你是不是也经常遇到这些情况?
场景 1:手动计算报文,容易错
要读取保持寄存器,从站地址 01,起始地址 40001,数量 10 个
你拿着计算器算:
- 从站地址:01
- 功能码:03
- 起始地址:00 00(40001-1=40000=0x9C40,等等,不对…)
- 数量:00 0A
- CRC 校验:???
算了一半,客户打电话来,回来忘了算到哪了
重新算,CRC 算出来不对
再算,还是不对…
场景 2:收到报文,不会解析
设备返回:
01 03 14 00 0A 00 0B 00 0C 00 0D 00 0E xx xx
你盯着看:
- 这是功能码 03 的响应
- 14 是字节数(20 字节)
- 但每个寄存器值是多少?
- 字节序是 AB 还是 BA?
场景 3:三种协议,搞混了
- RTU 用 CRC 校验
- ASCII 用 LRC 校验
- TCP 有 MBAP 头
一着急,用 RTU 的方式解析 TCP 报文,怎么都对不上
场景 4:调试记录,找不到
昨天调好的报文,今天找不到了
问同事要,同事说”我也忘了”
重新算,又花 1 小时
这些痛点,我都知道。
所以,我开发了这个 Modbus 报文生成解析器。
它支持 RTU/TCP/ASCII 三种协议,自动生成请求/响应报文。
不用手动计算,不用记公式,点几下就生成。
一、核心功能:为什么工程师都说好?
1.1 三种协议全覆盖
支持 Modbus 三种传输模式:
| 协议 | 校验方式 | 帧格式 | 适用场景 |
|---|---|---|---|
| Modbus RTU | CRC16 | 二进制 | 串口通信(RS485/RS232) |
| Modbus ASCII | LRC | ASCII 文本 | 老旧设备/调制解调器 |
| Modbus TCP | 无校验(TCP 保证) | MBAP 头 +ADU | 以太网通信 |
一个工具,搞定所有 Modbus 调试场景。
1.2 请求命令生成器
功能说明:
① 支持 12 种功能码
| 功能码 | 名称 | 用途 |
|---|---|---|
| 01 | 读线圈状态 | 读取开关量输出 |
| 02 | 读离散输入 | 读取开关量输入 |
| 03 | 读保持寄存器 | 最常用(模拟量输出) |
| 04 | 读输入寄存器 | 只读(模拟量输入) |
| 05 | 写单个线圈 | 开关控制 |
| 06 | 写单个寄存器 | 参数设置 |
| 0F | 写多个线圈 | 批量开关控制 |
| 10 | 写多个寄存器 | 批量参数设置 |
| 17 | 读/写多个寄存器 | 同时读写 |
| 2B | 读取设备标识 | 设备信息查询 |
② 参数配置
以功能码 03(读保持寄存器)为例:
从站地址:01(0-247) 功能码:03 起始地址:0000(十六进制或十进制) 数量:0010(读取 10 个寄存器)
③ 自动生成报文
输入参数后,自动生成:
RTU 模式:
01 03 00 00 00 0A C4 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ CRC 低字节 │ │ │ │ │ │ └──── CRC 高字节 │ │ │ │ │ └─────── 数量低字节 │ │ │ │ └────────── 数量高字节 │ │ │ └───────────── 起始地址低字节 │ │ └──────────────── 起始地址高字节 │ └─────────────────── 功能码 └────────────────────── 从站地址
ASCII 模式:
:01030000000AFB │ │ │ │ │ └── LRC 校验(FB) │ └───── 数据部分(ASCII 编码) └────────────────── 起始符(:)
TCP 模式:
00 01 00 00 00 06 01 03 00 00 00 0A │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ 数量低字节 │ │ │ │ │ │ │ │ │ └─────── 数量高字节 │ │ │ │ │ │ │ │ └────────── 起始地址低字节 │ │ │ │ │ │ │ └───────────── 起始地址高字节 │ │ │ │ │ │ └──────────────── 功能码 │ │ │ │ │ │ └──────────────── 单元标识符(从站地址) │ │ │ │ │ └─────────────────── 长度(后续字节数) │ │ │ │ └────────────────────── 协议标识符(0=Modbus) │ │ │ └───────────────────────── 事务标识符低字节 │ │ └──────────────────────────── 事务标识符高字节 └─────────────────────────────────── MBAP 头(7 字节)
④ 特殊功能码支持
功能码 05(写单个线圈):
- 开关选择:打开 (ON) / 关闭 (OFF)
- 自动转换为 FF00/0000
功能码 0F(写多个线圈):
- 线圈数量输入
- 可视化线圈选择(圆点按钮)
- 点击切换状态(灰=OFF,蓝=ON)
- 自动计算字节数
功能码 10(写多个寄存器):
- 寄存器列表(可添加多个)
- 每个寄存器设置:
- 地址(自动计算)
- 数据类型(UINT16/INT16/UINT32/INT32/FLOAT)
- 字节序(AB/BA)
- 数值(十进制输入)
- 自动转换为寄存器值
1.3 响应报文生成器
功能说明:
① 模拟设备响应
用于测试上位机软件(如组态王、WinCC)或 PLC 程序。
② 支持正常响应和异常响应
正常响应(功能码 03):
从站地址:01 功能码:03 字节数:20(10 个寄存器×2) 寄存器值: - Reg 0: 10(0x000A) - Reg 1: 20(0x0014) - Reg 2: 30(0x001E) - ...
异常响应:
从站地址:01 功能码:83(03+80) 异常码: - 01:非法功能 - 02:非法数据地址 - 03:非法数据值 - 04:从站设备故障 - 05:认可 - 06:从属设备忙
③ 数据类型支持
支持多种数据类型,自动转换:
| 类型 | 字节数 | 范围 | 字节序 |
|---|---|---|---|
| UINT16 | 2 | 0-65535 | 固定 |
| INT16 | 2 | -32768~32767 | 固定 |
| UINT32 | 4 | 0-4294967295 | AB/BA |
| INT32 | 4 | -2147483648~2147483647 | AB/BA |
| FLOAT | 4 | IEEE 754 单精度 | AB/BA/CDAB/BADC |
示例:
输入十进制值:25.5(FLOAT 类型)
自动转换为寄存器值:
- Reg 0: 0x41CC(高 16 位)
- Reg 1: 0x0000(低 16 位)
1.4 报文解析器
功能说明:
① 粘贴报文,自动解析
收到设备返回的报文,粘贴进去,自动解析:
输入(RTU 模式):
01 03 14 00 0A 00 0B 00 0C 00 0D 00 0E 7A 3B
自动解析:
┌─────────────────────────────────────┐ │ 从站地址:01 │ │ 功能码:03(读保持寄存器) │ │ 字节数:20(0x14) │ │ 数据内容: │ │ Reg 0: 0x000A = 10 │ │ Reg 1: 0x000B = 11 │ │ Reg 2: 0x000C = 12 │ │ Reg 3: 0x000D = 13 │ │ Reg 4: 0x000E = 14 │ │ CRC 校验:7A3B ✓(正确) │ └─────────────────────────────────────┘
② 支持三种协议解析
- RTU:CRC16 校验
- ASCII:LRC 校验
- TCP:MBAP 头解析
③ 错误检测
- CRC/LRC 校验错误提示
- 报文长度异常提醒
- 非法功能码警告
1.5 历史记录
功能说明:
① 自动保存
每次生成的报文自动保存,包含:
- 报文内容
- 生成时间
- 报文类型(请求/响应)
② 快捷操作
- 复制:一键复制报文
- 微信分享:发送给同事
- 清空:清除历史记录
③ 分类管理
- 请求命令历史
- 响应报文历史
- 分别管理,清晰明了
1.6 报文结构可视化
功能说明:
生成的每个报文,都附带结构解析:
示例(RTU 请求):
┌─────────────────────────────────────┐ │ 报文结构解析 │ ├─────────────────────────────────────┤ │ 从站地址 (Slave Address): 01 │ │ 功能码 (Function Code): 03 │ │ 起始地址 (Start Address): 0000 │ │ 数量 (Quantity): 000A │ │ CRC 校验 (CRC Check): C40B │ └─────────────────────────────────────┘
示例(TCP 请求):
┌─────────────────────────────────────┐ │ 报文结构解析 │ ├─────────────────────────────────────┤ │ 事务标识符 (Transaction ID): 0001 │ │ 协议标识符 (Protocol ID): 0000 │ │ 长度 (Length): 0006 │ │ 单元标识符 (Unit ID): 01 │ │ 功能码 (Function Code): 03 │ │ 起始地址 (Start Address): 0000 │ │ 数量 (Quantity): 000A │ └─────────────────────────────────────┘
二、实战案例:工程师的真实使用场景
案例 1:读取温度传感器数据
场景:
- 设备:某品牌温度变送器
- 通信:RS485(Modbus RTU)
- 需求:读取 10 个通道的温度值
传统方式:
- 查手册:保持寄存器地址 40001-40010
- 手动计算报文:
- 从站地址:01
- 功能码:03
- 起始地址:40001-1=40000=0x9C40
- 数量:10=0x000A
- CRC 校验:手动算或用在线工具
- 用串口调试助手发送
- 收到响应,手动解析
耗时:15-20 分钟
使用工具后:
- 打开工具,选择 Modbus RTU
- 输入参数:
- 从站地址:01
- 功能码:03
- 起始地址:9C40
- 数量:10
- 点击”生成请求命令”
- 复制报文,发送
- 收到响应,粘贴到解析器
- 自动解析出 10 个温度值
耗时:2-3 分钟
效率提升:6-10 倍
案例 2:批量设置变频器参数
场景:
- 设备:某品牌变频器
- 通信:Modbus RTU
- 需求:批量设置 20 个参数
传统方式:
- 逐个参数写单个寄存器(功能码 06)
- 写 20 次,每次计算报文
- 容易出错,重复劳动
使用工具后:
- 选择功能码 10(写多个寄存器)
- 添加 20 个寄存器:
- 地址:自动计算
- 数据类型:选择
- 数值:输入
- 一次生成报文
- 发送,完成
耗时:从 1 小时 → 5 分钟
案例 3:调试上位机软件
场景:
- 开发组态王/WinCC 项目
- 需要模拟 Modbus 从站设备
- 测试上位机程序逻辑
使用工具:
- 用响应报文生成器
- 设置模拟数据
- 生成响应报文
- 发送给上位机
- 验证程序逻辑
好处:
- 无需真实设备
- 可模拟各种异常
- 提高开发效率
三、技术细节:工程师关心的
3.1 CRC16 校验算法
Modbus RTU 使用 CRC16(循环冗余校验):
// CRC16 计算(低字节在前)
function calcCRC16(bytes) {
let crc = 0xFFFF;
for (let i = 0; i < bytes.length; i++) {
crc ^= bytes[i];
for (let j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc >>= 1;
}
}
}
return crc; // 低字节在前
}
示例:
报文:01 03 00 00 00 0A CRC:C4 0B(低字节在前) 完整:01 03 00 00 00 0A C4 0B
3.2 LRC 校验算法
Modbus ASCII 使用 LRC(纵向冗余校验):
// LRC 计算
function calcLRC(bytes) {
let sum = 0;
for (let i = 0; i < bytes.length; i++) {
sum += bytes[i];
}
const lrc = ((~sum) + 1) & 0xFF;
return lrc;
}
示例:
报文:01 03 00 00 00 0A LRC:FB 完整::01030000000AFB
3.3 字节序问题
32 位数据(UINT32/INT32/FLOAT)的字节序:
| 字节序 | 名称 | 示例(0x12345678) |
|---|---|---|
| AB | Big Endian | 12 34 56 78 |
| BA | Little Endian | 34 12 78 56 |
| CDAB | Mixed | 56 78 12 34 |
| BADC | Mixed | 78 56 34 12 |
工具支持自动转换:
- 选择字节序
- 输入十进制值
- 自动转换为寄存器值
3.4 Modbus TCP 的 MBAP 头
Modbus TCP 报文结构:
┌─────────────────────────────────────┐ │ MBAP 头(7 字节) │ ├─────────────────────────────────────┤ │ 事务标识符(2 字节) │ │ 协议标识符(2 字节)=0 │ │ 长度(2 字节) │ │ 单元标识符(1 字节)=从站地址 │ ├─────────────────────────────────────┤ │ PDU(功能码 + 数据) │ └─────────────────────────────────────┘
示例:
00 01 00 00 00 06 01 03 00 00 00 0A │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ 数量低字节 │ │ │ │ │ │ │ │ │ └─────── 数量高字节 │ │ │ │ │ │ │ │ └────────── 起始地址低字节 │ │ │ │ │ │ │ └───────────── 起始地址高字节 │ │ │ │ │ │ └──────────────── 功能码 │ │ │ │ │ │ └──────────────── 单元标识符 │ │ │ │ │ └─────────────────── 长度(6 字节) │ │ │ │ └────────────────────── 协议标识符(0=Modbus) │ │ │ └───────────────────────── 事务标识符低字节 │ │ └──────────────────────────── 事务标识符高字节 └─────────────────────────────────── MBAP 头
四、用户反馈:工程师怎么说
反馈 1:自动化工程师(5 年经验)
“以前手动算 Modbus 报文,经常算错。现在用这个工具,点几下就生成,CRC 自动计算,太方便了!效率至少提升 5 倍。”
反馈 2:电气工程师(10 年经验)
“支持三种协议,不用切换工具了。特别是 TCP 的 MBAP 头,以前老是搞混,现在自动生成,不会错。”
反馈 3:PLC 工程师(8 年经验)
“响应报文生成器很好用,模拟从站设备测试 PLC 程序,无需真实设备,开发效率提高很多。”
反馈 4:调试工程师(3 年经验)
“历史记录功能很实用,昨天调好的报文,今天直接复制,不用重新算。微信分享也很方便,发给同事一起调试。”
五、写在最后
我做这个工具,不是为了取代工程师。
而是为了解放人力。
让工程师不再手动计算报文,不再记复杂的公式,不再为 CRC 校验发愁。
让大家把时间花在更有价值的事情上:
- 系统架构设计
- 控制逻辑优化
- 现场问题解决
工具不是敌人,而是帮手。
善用工具的工程师,会淘汰不用工具的工程师。
希望这个工具能帮到更多同行。
附录:使用方式
使用方式 1:微信扫码

使用方式 2:微信搜索
搜索”Modbus 调试助手”
关于作者
20 年工业自动化经验,待过设备厂商、集成商、甲方。
现专注于工业物联网、边缘计算、智能控制。
欢迎交流:
- 📧 邮箱:support@modbus.cn
- 💬 微信群:扫码添加助手入群
如果觉得有用,欢迎 点赞 + 在看 + 转发 支持一下!
转发给更多电气工程师,一起用工具提效!
