QModMaster:免费 ModBus 主站调试工具,5 分钟跑通 RTU/TCP 完整路径
【免费下载链接】qModbusMasterFork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/)项目地址: https://gitcode.com/gh_mirrors/qm/qModbusMaster
ModBus 调试卡在哪,QModMaster 解决什么问题
PLC 连不上、厂商调试软件又贵又难用,你需要一个能直接看帧、读寄存器、还能挂在那轮询的工具:QModMaster 是一款免费开源的 ModBus 主站调试工具,支持 RTU 和 TCP 两种协议。
当设备在线但数据就是不对时,它能做三件事:总线监控逐帧显示收发报文、寄存器表格批量读写四种数据类型、周期扫描按固定间隔自动轮询并统计报文与错误数。Windows 用预编译包,Linux 直接编译,界面功能一致。
ModBus 主站连接设备最快步骤
先别管复杂配置,按下面顺序走,5 分钟内能看到设备数据。
第 1 步:拿到软件。Windows 直接下载预编译版,解压即运行;要二次开发就克隆源码:
git clone https://gitcode.com/gh_mirrors/qm/qModbusMaster第 2 步:编译(可选)。需要 Qt 5.2.1 以上,用 Qt Creator 打开工程文件qModMaster.pro,选好编译器运行即可。libmodbus 通信库和 QsLog 日志库都在3rdparty/目录里,不用单独装。
第 3 步:配通信参数。主窗口通信模式下拉框选 RTU(串口)或 TCP(网络)。RTU 进串口设置填串口号、波特率、校验位、数据位、停止位;TCP 填 IP 和端口。点"连接",状态栏变绿就通了。
第 4 步:发起读取。起始地址填寄存器地址,数量填个数,功能码选好(如 03),点读取,表格里立刻出数据。
💡 第一次测试建议用 TCP 模式连本机回环地址或内网的 PLC,参数最少,出问题的环节也最少。
ModBus 寄存器读写、总线监控与扫描模式拆解
数据对不上时,总线监控器就是你的示波器
你什么时候会用到它:设备明明在线,数据却时好时坏,你需要看总线上真实跑过的每一帧,而不是猜。
怎么操作:菜单打开总线监控窗口,它把发送帧(Tx)和接收帧(Rx)分开解析,逐条列出从站地址、功能码、数据内容,支持十六进制/ASCII 两种显示,每条报文带时间戳,还能保存到文件。解析逻辑在 forms/busmonitor.cpp 里,请求和响应分别走独立的解析函数。
注意什么:排查顺序固定——先看请求帧发出去没有,再看响应帧回来没有,最后对比两边的从站地址和功能码是否一致。90% 的通信问题这一步就能定位。
要批量读写寄存器,主窗口表格就是操作台
你什么时候会用到它:调变频器、电表这类设备,需要反复读写一批寄存器。
怎么操作:填好起始地址和数量,选功能码,读取或写入。覆盖的寄存器类型和对应功能码:保持寄存器 03/06/16,输入寄存器 04,线圈 01/05/15,离散输入 02。显示格式可切十六进制、十进制、浮点,有符号/无符号、16 位/32 位都能调,电表里的有符号 32 位数据切一下就能直接看懂,不用手算补码。表格数据模型在 src/registersmodel.cpp,显示转换在src/registersdatadelegate.cpp。
注意什么:如果读出来是"乱码"或莫名负数,先怀疑显示格式没和设备寄存器定义对齐,再怀疑设备。
数据变化快、懒得手动点,开周期扫描挂机
你什么时候会用到它:温度传感器每秒都在变,手动点读取太慢;或者你想长时间观察设备稳定性。
怎么操作:打开扫描开关,设置扫描间隔,QModMaster 就按固定节奏自动轮询,状态栏实时累计 Packets(报文数)和 Errors(错误数),随时可重置计数。轮询由定时器驱动,实现见 src/modbusadapter.cpp 中的startPollTimer/modbusTransaction。
注意什么:间隔别设太激进(100ms 级即可),跑几小时看错误率是否爬升,这个指标能直接反映 RS-485 布线或干扰问题。
智能电表数据采集:RTU 五步完整实战
环境:USB 转 485 线一根,电表挂 RS-485 总线(A/B 线别接反),从站地址 1,波特率 9600,8 数据位、1 停止位、无校验。
| 步骤 | 你输入什么 | 屏幕上看到什么 |
|---|---|---|
| 1. 建连接 | RTU 模式,串口设置填 COM 口、9600、N-8-1,点连接 | 状态栏变绿,连接图标亮起 |
| 2. 定参数 | 从站地址填 1,起始地址填 0,数量填 4(覆盖电压、电流两组寄存器),功能码选 03 | 表格生成 4 行待读区域 |
| 3. 发起读取 | 点读取按钮 | 4 个寄存器原值填入表格 |
| 4. 调显示 | 显示格式切十进制,对照电表说明书确认倍率(常见 实际值 = 寄存器值 ÷ 1000) | 数值变成可读的物理量 |
| 5. 验稳定 | 打开总线监控看帧,再开周期扫描、间隔设 5 秒 | 请求帧/响应帧逐条正常,Packets 持续增长、Errors 保持 0 |
⚠️ 最容易卡的点在第 2 步:电表说明书写的寄存器地址是协议偏移量,有的表读电压要用 03,有的放在 04 的输入寄存器里,功能码选错就会超时或报异常码——先看响应帧的异常码再换。
ModBus 连接失败与数据异常速查表
| 现象 | 最可能原因 | 30 秒内能做的检查 |
|---|---|---|
| RTU 连不上,串口没问题 | Linux 串口权限 / 波特率参数不匹配 / 串口被占用 | 把用户加进 dialout 组;核对波特率与从站一致;关掉其他占用串口的程序 |
| 连接成功但读取一直超时 | 从站地址填错,或起始地址/数量超出设备范围 | 打开总线监控看响应帧,返回异常码就是地址或范围问题 |
| TCP 连不上 | 防火墙挡了 502 端口 | 用 Tools 面板 ping 目标 IP、测端口连通性,先把网络层排干净 |
| 数据乱码 / 全是负数 | 显示格式与寄存器定义不匹配 | 切十六进制/十进制、有符号/无符号、16/32 位,逐项对齐设备手册 |
| 日志太啰嗦或太简 | QModMaster.ini 里 LoggingLevel 没设对 | 现场排障改成 0(Trace)看最详细过程,排完改回 3(Warn) |
| 每次都要重填参数 | 没存会话 | 用会话保存/加载,模式、从站、功能码、地址、数量整套存成文件,下次直接恢复 |
如果以上都没解决,去项目 issue 里搜现象关键词,大概率有人踩过同一个坑。
手册、源码与二次开发资源在哪
- ManModbus/:整套 HTML 用户手册,浏览器直接打开。界面某项拿不准、想确认功能码支持范围时翻它。
- Docs/:ModBus 应用协议规范 PDF。调试通了之后想把帧结构、异常码机制啃透,读这本。
- 核心源码:通信层与界面层分离,src/modbuscommsettings.cpp 管参数存取,src/mainwindow.cpp 管界面逻辑,配合前面提到的 modbusadapter.cpp 看一遍就能读懂一次完整通信的生命周期。
- 二次开发:GPLv3 协议,底层 libmodbus 和 QsLog 都放在
3rdparty/,加协议、改界面、嵌进自己的自动化测试系统都可行,qModMaster.pro里 unix 和 win32 的串口库差异已经处理好了。
下一步
QModMaster 把 ModBus 调试的三件硬事——参数配对、地址找对、格式选对——全做成了图形界面操作,全程不写一行代码。
现在就 clone 下来,连上你手边那台设备跑一次读取,再打开一次总线监控。
【免费下载链接】qModbusMasterFork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/)项目地址: https://gitcode.com/gh_mirrors/qm/qModbusMaster
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考