- 1. 前言:Modbus debug的痛,工程师都懂
- 2. 一、核心Function:为什么工程师都说好?
- 3. 1.1 三种协议全覆盖
- 4. 1.2 Request命令生成器
- 5. 1.3 Responsemessage生成器
- 6. 1.4 messageParse器
- 7. 1.5 历史记录
- 8. 1.6 message结构可视化
- 9. 二、实战案例:工程师的真实使用Scene
- 10. 案例 1:读取temperature sensordata
- 11. 案例 2:批量设置变频器参数
- 12. 案例 3:debug上位机软件
- 13. 三、技术细节:工程师关心的
- 14. 3.1 CRC16 校验算法
- 15. 3.2 LRC 校验算法
- 16. 3.3 endianness问题
- 17. 3.4 Modbus TCP 的 MBAP 头
- 18. 四、用户反馈:工程师怎么说
- 19. 五、写在最后
- 20. 附录:使用方式
Modbus 工程师必备神器!RTU/TCP/ASCII message生成Parse器,效率提升 10 倍
还在手动计算 Modbus message?这个Tools支持 RTU/TCP/ASCII 三种协议,自动Generate request/Responsemessage,CRC/LRC 校验、messageParse、历史记录一键搞定
前言:Modbus debug的痛,工程师都懂
我做了 20 年Automation,太懂 Modbus debug的痛苦。
你是不是也经常遇到这些情况?
Scene 1:手动计算message,容易错
要Read and hold register,slave address 01,starting address 40001,quantity 10 个
你拿着计算器算:
- slave address:01
- function code:03
- starting address:00 00(40001-1=40000=0x9C40,等等,不对…)
- quantity:00 0A
- CRC verification:???
算了一半,客户打电话来,回来忘了算到哪了
重新算,CRC 算出来不对
再算,还是不对…
Scene 2:收到message,不会Parse
设备返回:
01 03 14 00 0A 00 0B 00 0C 00 0D 00 0E xx xx
你盯着看:
- 这是function code 03 的Response
- 14 是byte count(20 byte)
- 但每个register value是多少?
- endianness是 AB 还是 BA?
Scene 3:三种协议,搞混了
- RTU 用 CRC verification
- ASCII 用 LRC 校验
- TCP 有 MBAP 头
一着急,用 RTU 的方式Parse TCP message,怎么都对不上
Scene 4:debug记录,找不到
昨天调好的message,今天找不到了
问同事要,同事说”我也忘了”
重新算,又花 1 小时
这些痛点,我都知道。
所以,我开发了这个 Modbus message生成Parse器。
它支持 RTU/TCP/ASCII 三种协议,自动Generate request/Responsemessage。
不用手动计算,不用记公式,点几下就生成。
一、核心Function:为什么工程师都说好?
1.1 三种协议全覆盖
支持 Modbus 三种传输模式:
| 协议 | 校验方式 | 帧format | 适用Scene |
|---|---|---|---|
| Modbus RTU | CRC16 | binary | 串口通信(RS485/RS232) |
| Modbus ASCII | LRC | ASCII Text | 老旧设备/调制解调器 |
| Modbus TCP | 无校验(TCP 保证) | MBAP 头 +ADU | 以太网通信 |
一个Tools,搞定所有 Modbus debugScene。
1.2 Request命令生成器
Function说明:
① 支持 12 种function code
| function code | 名称 | 用途 |
|---|---|---|
| 01 | 读Coil status | 读取switch量输出 |
| 02 | 读离散输入 | 读取switch量输入 |
| 03 | 读保持register | 最常用(模拟量输出) |
| 04 | 读输入register | 只读(模拟量输入) |
| 05 | 写单个线圈 | switch控制 |
| 06 | 写单个register | 参数设置 |
| 0F | 写多个线圈 | 批量switch控制 |
| 10 | 写多个register | 批量参数设置 |
| 17 | 读/写多个register | 同时读写 |
| 2B | 读取设备标识 | 设备信息查询 |
② 参数配置
以function code 03(读保持register)为例:
slave address:01(0-247) function code:03 starting address:0000(hexadecimal或decimal) quantity:0010(读取 10 个register)
③ 自动生成message
输入参数后,自动生成:
RTU 模式:
01 03 00 00 00 0A C4 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ CRC lowbyte │ │ │ │ │ │ └──── CRC highbyte │ │ │ │ │ └─────── quantity低byte │ │ │ │ └────────── quantity高byte │ │ │ └───────────── starting address低byte │ │ └──────────────── starting address高byte │ └─────────────────── function code └────────────────────── slave address
ASCII 模式:
:01030000000AFB │ │ │ │ │ └── LRC 校验(FB) │ └───── data部分(ASCII Coding) └────────────────── start符(:)
TCP 模式:
00 01 00 00 00 06 01 03 00 00 00 0A │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ quantity低byte │ │ │ │ │ │ │ │ │ └─────── quantity高byte │ │ │ │ │ │ │ │ └────────── starting address低byte │ │ │ │ │ │ │ └───────────── starting address高byte │ │ │ │ │ │ └──────────────── function code │ │ │ │ │ │ └──────────────── Unit identifier(slave address) │ │ │ │ │ └─────────────────── Length(后续byte count) │ │ │ │ └────────────────────── Protocol Identifier(0=Modbus) │ │ │ └───────────────────────── Transaction identifier低byte │ │ └──────────────────────────── Transaction identifier高byte └─────────────────────────────────── MBAP 头(7 byte)
④ 特殊function code支持
function code 05(写单个线圈):
- switch选择:Open (ON) / Turn off (OFF)
- 自动转换为 FF00/0000
function code 0F(写多个线圈):
- 线圈quantity输入
- 可视化Coil selection(圆点button)
- ClickSwitch状态(灰=OFF,蓝=ON)
- 自动计算byte count
function code 10(写多个register):
- register列表(可添加多个)
- 每个register设置:
- address(自动计算)
- data type(UINT16/INT16/UINT32/INT32/FLOAT)
- endianness(AB/BA)
- numerical value(decimal输入)
- 自动转换为register value
1.3 Responsemessage生成器
Function说明:
① 模拟设备Response
用于测试上位机软件(如configuration王、WinCC)或 PLC 程序。
② 支持正常Response和Exception Response
正常Response(function code 03):
slave address:01 function code:03 byte count:20(10 个register×2) register value: - Reg 0: 10(0x000A) - Reg 1: 20(0x0014) - Reg 2: 30(0x001E) - ...
Exception Response:
slave address:01 function code:83(03+80) Exception Code: - 01:Illegal function - 02:Illegal data address - 03:Illegal data value - 04:Substation equipment malfunction - 05:认可 - 06:从属设备忙
③ data type支持
支持多种data type,自动转换:
| Type | byte count | 范围 | endianness |
|---|---|---|---|
| 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 |
示例:
输入Decimal value:25.5(FLOAT Type)
自动转换为register value:
- Reg 0: 0x41CC(高 16 位)
- Reg 1: 0x0000(低 16 位)
1.4 messageParse器
Function说明:
① 粘贴message,自动Parse
收到设备返回的message,粘贴进去,自动Parse:
输入(RTU 模式):
01 03 14 00 0A 00 0B 00 0C 00 0D 00 0E 7A 3B
自动Parse:
┌─────────────────────────────────────┐ │ slave address:01 │ │ function code:03(读保持register) │ │ byte count:20(0x14) │ │ data内容: │ │ Reg 0: 0x000A = 10 │ │ Reg 1: 0x000B = 11 │ │ Reg 2: 0x000C = 12 │ │ Reg 3: 0x000D = 13 │ │ Reg 4: 0x000E = 14 │ │ CRC verification:7A3B ✓(正确) │ └─────────────────────────────────────┘
② 支持三种协议Parse
- RTU:CRC16 校验
- ASCII:LRC 校验
- TCP:MBAP 头Parse
③ Error检测
- CRC/LRC 校验Error提示
- messageLength异常提醒
- Illegal function码警告
1.5 历史记录
Function说明:
① 自动保存
每次生成的message自动保存,包含:
- message内容
- 生成time
- message type(Request/Response)
② 快捷Operation
- Copy:一键Copymessage
- 微信分享:send给同事
- Clear:Clear历史记录
③ Category管理
- Request命令历史
- Responsemessage历史
- 分别管理,清晰明了
1.6 message结构可视化
Function说明:
生成的每个message,都附带结构Parse:
示例(RTU Request):
┌─────────────────────────────────────┐ │ message结构Parse │ ├─────────────────────────────────────┤ │ slave address (Slave Address): 01 │ │ function code (Function Code): 03 │ │ starting address (Start Address): 0000 │ │ quantity (Quantity): 000A │ │ CRC verification (CRC Check): C40B │ └─────────────────────────────────────┘
示例(TCP Request):
┌─────────────────────────────────────┐ │ message结构Parse │ ├─────────────────────────────────────┤ │ Transaction identifier (Transaction ID): 0001 │ │ Protocol Identifier (Protocol ID): 0000 │ │ Length (Length): 0006 │ │ Unit identifier (Unit ID): 01 │ │ function code (Function Code): 03 │ │ starting address (Start Address): 0000 │ │ quantity (Quantity): 000A │ └─────────────────────────────────────┘
二、实战案例:工程师的真实使用Scene
案例 1:读取temperature sensordata
Scene:
- 设备:某品牌temperature变送器
- 通信:RS485(Modbus RTU)
- 需求:读取 10 个通道的temperature值
传统方式:
- 查手册:保持register address 40001-40010
- 手动计算message:
- slave address:01
- function code:03
- starting address:40001-1=40000=0x9C40
- quantity:10=0x000A
- CRC verification:手动算或用Online Tools
- 用Serial Port DebuggingAssistantsend
- 收到Response,手动Parse
耗时:15-20 分钟
使用Tools后:
- Open the tool,选择 Modbus RTU
- 输入参数:
- slave address:01
- function code:03
- starting address:9C40
- quantity:10
- Click”Generate request命令”
- Copymessage,send
- 收到Response,粘贴到Parse器
- 自动Parse出 10 个temperature值
耗时:2-3 分钟
效率提升:6-10 倍
案例 2:批量设置变频器参数
Scene:
- 设备:某品牌变频器
- 通信:Modbus RTU
- 需求:批量设置 20 个参数
传统方式:
- 逐个参数写单个register(function code 06)
- 写 20 次,每次计算message
- 容易出错,重复劳动
使用Tools后:
- 选择function code 10(写多个register)
- 添加 20 个register:
- address:自动计算
- data type:选择
- numerical value:输入
- 一次生成message
- send,Complete
耗时:从 1 小时 → 5 分钟
案例 3:debug上位机软件
Scene:
- 开发configuration王/WinCC 项目
- 需要模拟 Modbus 从站设备
- 测试上位机程序逻辑
使用Tools:
- 用Responsemessage生成器
- 设置模拟data
- Generate responsemessage
- send给上位机
- 验证程序逻辑
好处:
- 无需真实设备
- 可模拟各种异常
- 提高开发效率
三、技术细节:工程师关心的
3.1 CRC16 校验算法
Modbus RTU 使用 CRC16(循环冗余校验):
// CRC16 计算(低byte在前)
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; // 低byte在前
}
示例:
message:01 03 00 00 00 0A CRC:C4 0B(低byte在前) 完整: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;
}
示例:
message:01 03 00 00 00 0A LRC:FB 完整::01030000000AFB
3.3 endianness问题
32 位data(UINT32/INT32/FLOAT)的endianness:
| endianness | 名称 | 示例(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 |
Tools支持自动转换:
- 选择endianness
- 输入Decimal value
- 自动转换为register value
3.4 Modbus TCP 的 MBAP 头
Modbus TCP message结构:
┌─────────────────────────────────────┐ │ MBAP 头(7 byte) │ ├─────────────────────────────────────┤ │ Transaction identifier(2 bytes) │ │ Protocol Identifier(2 bytes)=0 │ │ Length(2 bytes) │ │ Unit identifier(1 byte)=slave address │ ├─────────────────────────────────────┤ │ PDU(function code + data) │ └─────────────────────────────────────┘
示例:
00 01 00 00 00 06 01 03 00 00 00 0A │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ quantity低byte │ │ │ │ │ │ │ │ │ └─────── quantity高byte │ │ │ │ │ │ │ │ └────────── starting address低byte │ │ │ │ │ │ │ └───────────── starting address高byte │ │ │ │ │ │ └──────────────── function code │ │ │ │ │ │ └──────────────── Unit identifier │ │ │ │ │ └─────────────────── Length(6 byte) │ │ │ │ └────────────────────── Protocol Identifier(0=Modbus) │ │ │ └───────────────────────── Transaction identifier低byte │ │ └──────────────────────────── Transaction identifier高byte └─────────────────────────────────── MBAP 头
四、用户反馈:工程师怎么说
反馈 1:自动化工程师(5 年经验)
“以前手动算 Modbus message,经常算错。现在用这个Tools,点几下就生成,CRC 自动计算,太方便了!效率至少提升 5 倍。”
反馈 2:电气工程师(10 年经验)
“支持三种协议,不用SwitchTools了。特别是 TCP 的 MBAP 头,以前老是搞混,现在自动生成,不会错。”
反馈 3:PLC 工程师(8 年经验)
“Responsemessage生成器很好用,模拟从站设备测试 PLC 程序,无需真实设备,开发效率提高很多。”
反馈 4:debug工程师(3 年经验)
“历史记录Function很实用,昨天调好的message,今天直接Copy,不用重新算。微信分享也很方便,发给同事一起debug。”
五、写在最后
我做这个Tools,不是为了取代工程师。
而是为了解放人力。
让工程师不再手动计算message,不再记复杂的公式,不再为 CRC verification发愁。
让大家把time花在更有价值的事情上:
- system架构设计
- 控制逻辑优化
- 现场问题解决
Tools不是敌人,而是帮手。
善用Tools的工程师,会淘汰不用Tools的工程师。
希望这个Tools能帮到More同行。
附录:使用方式
使用方式 1:微信扫码

使用方式 2:微信Search
Search”Modbus debugAssistant”
关于Author
20 年Automation经验,待过设备厂商、集成商、甲方。
现专注于工业物联网、边缘计算、智能控制。
欢迎交流:
- 📧 邮箱:support@modbus.cn
- 💬 微信群:扫码添加Assistant入群
如果觉得有用,欢迎 点赞 + 在看 + 转发 支持一下!
转发给More电气工程师,一起用Tools提效!
发表回复