
OpenModScan 完整指南如何用这款开源 Modbus 主站测试工具搞定寄存器读写、设备扫描与通讯日志【免费下载链接】OpenModScanOpen ModScan is a Free Modbus Master (Client) Utility项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan凌晨的机房里你手里的 PLC 明明上电了上位机却读出一堆莫名其妙的数值。你怀疑是地址写错了又怀疑是字节序不对最后怀疑到协议本身。手头没有一台能同时看原始报文、又能手动改寄存器的调试工具问题就卡在了猜这个环节。OpenModScan 就是为这种时刻准备的它是一款免费的开源 Modbus 主站Client测试工具支持 Modbus TCP 和 Modbus RTU既能持续轮询寄存器并把数据换算成你指定的格式也能把每一帧请求和响应以十六进制原始报文记录下来帮你快速定位到底是设备的问题还是配置的问题。30 秒速览关键信息一览项目说明项目名OpenModScan一句话定位免费开源的 Modbus 主站调试工具寄存器/线圈读写 设备扫描 报文日志核心协议Modbus TCP、Modbus RTU另支持 RTU over TCP 扫描支持的功能码0x01、0x02、0x03、0x04、0x05、0x06、0x0F、0x10、0x16支持平台Windows 7/10 及以上、主流 Linux 发行版Debian、Ubuntu、Fedora、Rocky、openSUSE、ALT、Astra 等开发技术栈C / Qt 5.15 或 Qt 6 / CMake开源协议MIT适用人群自动化工程师、设备集成人员、工控开发者、协议学习者典型场景设备通讯验证、寄存器数据核对、网络内从站发现、报文抓包分析安装与快速上手所有方式都指向同一个目标装完就能连上设备。你按自己的系统选一条最短路径即可。Windows直接跑安装程序到项目 Releases 里下载安装包双击运行:: 32 位系统Qt5 qt5-omodscan_1.16.0_x86.exe :: 64 位系统Qt5 或 Qt6 二选一 qt5-omodscan_1.16.0_x64.exe qt6-omodscan_1.16.0_x64.exeWindows 安装包经过代码签名正常不会被 SmartScreen 拦截。Debian / Ubuntu / Mint / Zorin / AstraDEB 包sudo apt install ./qt6-omodscan_1.16.0-1_amd64.deb # 或 Qt5 版本 sudo apt install ./qt5-omodscan_1.16.0-1_amd64.debRHEL / Fedora / Rocky / RedOSRPM 包sudo dnf install ./qt6-omodscan_1.16.0-1.x86_64.rpmALT Linux 用apt-get install ./qt6-omodscan_1.16.0-1.x86_64.rpm以 root 执行。openSUSE / SUSE先导入签名密钥sudo rpm --import qt6-omodscan.rpm.pubkey sudo zypper install ./qt6-omodscan_1.16.0-1.x86_64.rpmFlatpak跨发行版通用flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo flatpak install --user io.github.sanny32.omodscan.flatpak⚠️ 如果要用串口连接Flatpak 安装后还需要把当前用户加入dialout组并重新登录否则打不开串口sudo usermod -a -G dialout $USER从源码编译定制或深度集成时需要 CMake 和 Qt 5.15 及以上版本git clone https://gitcode.com/gh_mirrors/op/OpenModScan cd OpenModScan ./build.sh # Linux指定 Qt 版本可加 -qt5 或 -qt6 # Windows 下改为 # .\build.ps1 -qt5首次运行后如果你习惯中文界面可以在语言菜单里切换到简体中文或繁体中文项目在src/translations/下自带了 zh_CN、zh_TW、ru 三套翻译。核心功能逐一拆解OpenModScan 的界面是一个 MDI 多窗口结构主窗口负责连接管理每一个监控表格都是一个独立的子窗口你可以同时开着多台设备、多组寄存器互不干扰。下面按模块拆开讲。多窗口寄存器/线圈监控每个监控子窗口由四组参数定义设备 ID、点位类型线圈/离散输入/保持寄存器/输入寄存器、起始地址、读取长度。点显示数据后工具按你设定的轮询周期持续读数据表格里实时刷新。轮询次数、有效响应数会统计在窗口底部掉线一眼可见支持 1-based / 0-based 地址基数切换5 位或 6 位地址空间显示不同厂家手册的地址写法都能对上每个地址可以加文字描述、改背景色方便在表格里做标注子窗口可保存为配置文件下次直接打开。全功能码读写操作覆盖日常调试用得上的全部功能码对应菜单栏里的写操作入口功能码操作界面入口0x01 / 0x02读线圈 / 读离散输入轮询读取0x03 / 0x04读保持/输入寄存器轮询读取0x05写单个线圈写单个线圈对话框0x06写单个寄存器写单个寄存器对话框0x0F写多个线圈批量强制线圈对话框0x10写多个寄存器批量强制寄存器对话框0x16掩码写寄存器掩码写对话框批量写入时你可以直接往表格单元格里填值再一次性下发预设寄存器功能则把一组值提前存好需要时恢复现场。数据格式与字节序转换寄存器读回来只是 16 位二进制真正有用的是把它解释成正确类型。数据菜单提供一整排显示模式二进制、无符号 16 位、有符号 16 位、十六进制、ANSI 文本可换代码页适合设备把字符串存进寄存器32 位 / 64 位有符号与无符号整数单精度 / 双精度浮点数IEEE 754以上每一种多字节类型都带 Swapped字序交换变体比如UInt32对SwappedUInt32。这是 Modbus 调试里最经典的坑同一台设备有的厂家大端有的小端。你不用自己按计算器在菜单里点一下对应模式数值立刻对得上。通讯日志Traffic 视图与统计把显示模式从 Data 切到 Traffic表格会变成逐帧报文记录每一帧请求和响应都带时间戳以十六进制展示并标注事务 ID、协议 ID、设备地址、功能码这些字段。日志行数上限可在 4 到 1000 行之间调整默认 30 行自动滚动可开可关支持文本捕获把日志持续写到文件事后分析配合底部的轮询/响应统计发了多少、回了多少、成功率多少一目了然。设备扫描RTU / TCP / RTU over TCP不知道总线上有哪些从站打开扫描器对话框选择协议类型Modbus RTU、Modbus TCP 或 Modbus RTU over TCP配置目标范围TCP 时填 IP 与端口范围RTU 时选串口并勾选波特率/数据位/校验/停止位的组合工具会并行试多种组合设置设备 ID 范围、扫描用的功能码与请求参数点开始发现结果实时列出可疑结果dubious会单独标出。TCP 扫描默认最多 10 条并发连接设备 ID 默认扫 1–10超时 1000ms这些参数都可以改。扫描结果的代码入口是src/modbusscanner.h里的ScanParams结构。地址扫描连接已经通了但不确定这台设备到底开了哪些寄存器地址扫描功能会按地址步进探测把有响应的地址区间找出来省得你拿 0x03 从 0 开始一个一个试。报文解析器与自定义报文两个手搓报文工具适合验证特殊指令报文解析器粘贴一段十六进制报文工具帮你逐字段拆开看事务 ID、协议 ID、长度、单元 ID、功能码、数据反向核对设备回包是否符合规范用户自定义报文手动拼一帧请求发出去连请求-响应都能自己控制适合做边界测试。数据模拟设备还没到货或想验证上位程序对数据变化的反应内置数据模拟器可以对任意地址生成数据模拟模式行为关键参数Random范围内随机值数值范围Increment按步长递增步长、范围Decrement按步长递减步长、范围Toggle线圈/点位翻转—每个模拟任务可单独设更新间隔默认 1000ms模拟配置同样可以存进配置文件里随项目一起走。一次完整的实战工作流下面这条流程串起了连接、监控、读写、抓包四个动作基本覆盖了接到新设备先验一遍的全过程。以一台 Modbus TCP 设备192.168.1.100为例。第 1 步建立连接菜单连接里选 Modbus TCP/IP填写服务器地址192.168.1.100 端口502 从站响应超时250 ms默认值 重试次数3连串口则改成串口名、波特率默认 9600、数据位 8、校验 None、停止位 1。如果参数经常复用可以点保存配置下次一键快速连接。第 2 步定义要监控的数据新建监控窗口设置显示定义设备 ID1 点位类型保持寄存器0x03 起始地址1注意地址基数与设备手册一致 读取长度50 轮询周期1000 ms点显示数据轮询开始底部出现轮询计数与有效响应计数。第 3 步核对数据格式温度值读出来是 12345 而不是 48.5把显示模式从 UInt16 切到浮点再不对就切到Swapped FP。32/64 位值同理直到数值符合预期。第 4 步做一次写操作验证从写单个寄存器对话框向某个设定值寄存器写入测试值例如 25.0回看表格确认设备回显一致再打开 Traffic 视图检查 0x06 请求帧与响应帧是否成对出现、功能码是否被原样返回。第 5 步留档需要汇报或存档时开启文本捕获把日志落到文件再把整个监控窗口另存为配置文件。下次现场调试直接打开这份文件参数原样恢复。如果第 2 步发现设备完全不回应回到扫描器按设备扫描流程先确认从站地址和串口参数组合再继续。关键参数配置与调优这些参数都来自代码里的真实默认值和取值范围调优时照着这个表来参数默认值取值范围调优建议轮询周期ScanRate1000 ms20 ms – 1 小时设备响应慢、总线拥堵时调大需要高刷新率且链路稳定时调小但别低于 20 ms从站响应超时250 ms10 – 300000 msRTU 串口、远距离链路调大TCP 内网保持默认即可重试次数30 – 10偶发丢帧调大设备明确不响应时调小以加快排错帧间延迟InterFrameDelay00 – 300000 ms老式串口设备要求帧间隔 3.5 字符时间以上时按波特率估算后设置单次读取长度50随地址空间变化设备一次读太多会超时或截断时拆小分批读日志行数上限LogViewLimit304 – 1000抓包分析时调大平时调小省资源扫描并发连接数10扫描器内可调网段大、设备响应慢时调小避免大量超时挤占队列扫描设备 ID 范围1 – 101 – 247不确定时直接扫全范围代价是耗时另外两个容易忽略的开关ForceModbus15And16Func部分老设备只认 15/16 功能码的旧写法连接参数里有强制选项排除虚拟串口ExcludeVirtualPorts机器上有多个 USB 转串口虚口时用它避免连错。常见问题速查表现象排查步骤处理连接超时 / 连不上① ping 通不通 ② 端口 502 是否开放、防火墙 ③ 设备 ID 是否一致核对 IP/端口串口场景换 DTR/RTS 开关再试串口打开失败 / 权限不足① 当前用户是否在dialout组 ② Flatpak 是否额外授权 ③ 端口是否被占用加入dialout组后重新登录Flatpak 按上文补组有连接但读出的值全是乱码① 数据位/校验/停止位组合对不对 ② 地址基数 0/1 ③ 字节序用扫描器多组合试参切 Swapped 显示模式对比异常码 0x01 非法功能设备不支持该功能码换该设备支持的功能码或确认协议版本异常码 0x02 非法数据地址起始地址超出设备映射范围用地址扫描确认真实地址空间检查 0/1-based异常码 0x03 非法数据值写入值超出允许范围改值或核对设备允许的最大值异常码 0x04 从站故障设备内部错误检查设备状态指示灯重启设备再测轮询时好时坏① 超时太短 ② 读取长度太大 ③ 总线有干扰加大响应超时、拆小读取长度、加帧间延迟界面是英文语言菜单切换选简体中文 / 繁体中文 / 俄语二次开发与集成代码按职责分层改功能前先看这几处src/modbusclient.h/src/modbusclientprivate.cpp核心通讯层。对外暴露sendReadRequest()、writeRegister()、syncReadRegisters()等接口以及modbusRequest/modbusResponse/modbusReply信号请求帧与响应帧都通过ModbusMessage对象抛出做协议级集成从这里下手src/connectiondetails.h连接参数结构TCP、串口、协议选项同时支持 QSettings 与 XML 序列化你的配置持久化可以直接复用这套序列化代码src/modbusscanner.hsrc/modbustcpscanner.cpp/src/modbusrtuscanner.cpp扫描器基类与 TCP/RTU 两个实现ScanParams定义了扫描的全部可调项src/datasimulator.cpp数据模拟器Random/Increment/Decrement/Toggle 四种模式各自有独立参数结构见src/modbussimulationparams.hsrc/formmodsca.cpp监控子窗口轮询、统计、捕获、显示定义都在这里src/mainwindow.cpp是 MDI 外壳和菜单入口src/modbusmessages/各功能码 PDU 的构造与解析。嵌入到自己程序里的示意代码接口以头文件实际声明为准ModbusClient client(this); client.connectDevice(cd); // cd: ConnectionDetails含 TCP/串口/超时参数 auto* reply client.sendReadRequest( QModbusDataUnit::HoldingRegisters, // 点位类型 /*startAddress*/0, // Base0 地址 /*valueCount*/10, /*server*/1, /*requestGroupId*/0); connect(reply, ModbusReply::finished, this, [this, reply]{ auto regs reply-result().holdingRegisters(); // 10 个 quint16 });命令行侧支持--profile 文件启动时直接载入一份配置档案--version、--help也可用定义见src/cmdlineparser.h方便把固定调试场景写进脚本里定期跑。同类工具横向对比对比项OpenModScanModbus PollQModMaster开源✅ MIT❌ 商业✅跨平台Windows Linux✅❌仅 Windows✅协议覆盖TCP / RTU✅✅✅网络从站扫描✅含 RTU over TCP✅❌报文日志与逐帧解析✅Traffic 视图 解析器✅✅多字节格式/字节序切换✅含 64 位与字序变体✅有限批量写 / 掩码写✅0x0F/0x10/0x16部分有限数据模拟✅随机/增减/翻转❌❌二次开发✅源码开放MIT❌✅三者定位并不冲突需要商业支持或只跑 Windows 时 Modbus Poll 更省事做 Qt 生态开发或需要扫描、模拟、深度改协议时OpenModScan 的自由度更高QModMaster 适合轻量级的日常读写。按场景选不必非此即彼。选型与落地建议适合用 OpenModScan 的场景现场设备验证接一台陌生 PLC/仪表快速确认它到底回了什么总线资产盘点不知道总线上挂了谁用扫描器批量发现协议学习Traffic 视图 报文解析器是读 Modbus 规范的活教材无设备环境下的上位机联调用数据模拟生成随机/递增数据先跑通自己的解析逻辑开源集成项目MIT 协议代码可直接嵌进你自己的工具链。不太适合的场景需要 7×24 厂商技术支持的关键产线它开源免费没有商业 SLA超大点位数的长期生产采集它是调试工具不是 SCADA长时间大规模采集请交给专业采集平台。落地注意点先核对地址基数再动手0-based 和 1-based 混用是现场最高频的错误来源轮询周期宁慢勿快从 1000ms 起步链路稳定再逐步压缩串口参数用扫描器扫出来而不是凭设备铭牌猜重要调试会话开文本捕获事后可复现每台设备的调试参数连接 显示定义存成配置文件建立自己的设备档案库。写在最后OpenModScan 把 Modbus 调试里最实用的几件事——连续轮询、全功能码读写、字节序换算、逐帧报文日志、从站扫描、地址探测、数据模拟——做进了一个跨平台的免费工具里而且以 MIT 协议开放了全部源码。对你来说它的价值很直接少猜一步多看一帧。想深入的话建议按这个顺序读源码协议处理逻辑src/modbusmessages/modbusmessage.cpp核心通讯客户端src/modbusclient.cpp扫描机制src/modbusscanner.cpp主窗口与菜单组织src/mainwindow.cpp项目说明与构建方式README.md【免费下载链接】OpenModScanOpen ModScan is a Free Modbus Master (Client) Utility项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考