ModScan 是 WinTECH Software 出的 Modbus 主站工具。官方自己的说法是:从 1990 年随 Windows 3.0 一起出现,久到成了全世界维护 Modbus 网络的事实标准。

它干的事情很单一:以主站身份向从站发请求,把响应解析成一张数据表,顺手把原始报文摊开给你看。

2026 年还有必要学它吗?有。因为 Modbus 本身没被替代——电表、温控器、变频器、PLC、各类传感器,现场还在大量说这个协议。而 ModScan 这种"点表 → 数据"的直白交互,是理解 Modbus 最快的方式:它把"你填的地址"和"实际发出去的报文"同时摆在屏幕上,这一点比任何文档都直观。


一、为什么是它(和该换成什么的时机)

Modbus 调试工具就那么几个,取舍很清楚:

工具

授权

平台

维护状态

什么时候选它

ModScan / ModSim

商业(演示版全功能,有时限)

仅 Windows

老牌在售,ModScan64 面向 Win10/11

学协议、现场排障、要图形化点表

Modbus Poll / Modbus Slave

商业,129 美元起

仅 Windows

活跃,20+ 年

要 28 种显示格式、Test Center 脚本、Excel/OLE 自动化

QModMaster

开源(GPL)

Windows / Linux

官方仓库 2022 年 1 月后无提交

要免费 + 跨平台 + 总线监控,能接受"停更快照"

Radzio Modbus Master Simulator

免费

仅 Windows

2017 年 10 月后停更

老机器上的应急备胎

mbpoll / modpoll

开源 GPL-3.0 / 商业

Win / macOS / Linux

活跃(2026 年仍有提交)

要脚本化、进 CI、无图形界面的环境

一句话结论:先装 ModScan 学协议和做现场排障(演示版功能不缺,只限时间),要长期自动化再补 mbpoll 这类命令行工具。

价格提一句,但请当作参考:早期公开资料写的是 65 美元(基础版)/ 110 美元(含趋势图与 OLE 的专业版),不过那是 2009 年的报价,现在以官网询价为准——作为对照,同类里的 Modbus Poll 目前是 129 美元起。


二、先把四个数据区搞清楚(这是前提)

ModScan 界面上那个下拉框只有四项,但它们对应 Modbus 的四类数据对象。不搞清楚这个,后面全是瞎试。

点类型(下拉框)

读功能码

写功能码

读写属性

典型用途

01: COIL STATUS

01

05 / 15

可读写

继电器输出、指示灯、MOSFET 等开关量输出

02: INPUT STATUS

02

只读

拨码开关、接近开关等开关量输入

03: HOLDING REGISTER

03

06 / 16

可读写

参数设定值、PID 参数、控制字(最常用

04: INPUT REGISTER

04

只读

温度、电压、电流等模拟量采集

配套的功能码全表:

功能码

名称

作用

01 / 02

读线圈 / 读离散输入

读位(开关量),一次最多 2000 位

03 / 04

读保持寄存器 / 读输入寄存器

读字(16 位),一次最多 125 个

05 / 06

写单个线圈 / 写单个保持寄存器

单点写入

15 / 16

写多个线圈 / 写多个保持寄存器

批量写入

两个必须记住的约定

  1. 下拉框里的 01/02/03/04 是功能码编号。而设备手册上写的 4000130001,那个开头的 4/3 是另一套"区号前缀"命名法,只用于地址分段,不参与报文。两套东西混在一起是新手最大的困惑源。

  2. 从站执行失败时,返回的功能码是原功能码 + 0x80。比如你发 03 读保持寄存器、地址不存在,从站回 83,后面跟一个异常码(02 就是"非法数据地址")。


三、安装与版本选择

官网 win-tech.com 的 Download 页(/html/demos.htm)直接下,解压即用,是绿色软件——官方建议解压到一个独立目录,比如 C:\ModScan32

关键是选对 32 还是 64:

文件

适用系统

版本

最后更新

ModScan32.zip

老系统(NT / XP / Vista / Win7 32 位)

8.A00-10

2014-03-20

ModScan64.zip

Windows 10 / 11

2.A00-00

2017-11-14

ModSim32.zip

同上(从站模拟器)

4.A00-04

2008-03-25

ModSim64.zip

同上(从站模拟器,64 位)

2013-07-03

注意看更新日期——这是判断这个软件"活不活跃"最直接的方式。官网首页提到已上线 "Secure Modbus Version 8",支持安全 Modbus 以及 Modbus TCP 与串口,并说明既有许可证仍然有效;官方还提到有 iPhone 版(App Store 搜 ModScan)。

演示版的限制:全功能,但有时间限制(多个来源描述为运行几分钟后中断,需要重启)。所以它做现场快速排障绰绰有余,做长时间数据记录就不行了。注册后解除。


四、界面:五个地方要知道

软件打开后是一个 MDI 窗口(叫 Modsca1 之类的文档窗口),你要认的地方只有五处:

位置

内容

说明

菜单 Connection

Connect / Quick Connect / Disconnect

连接管理

菜单 Setup

Data Definition / Display Options / Data Capture

配置入口

主窗口字段

Device Id / Address / Length / Modbus Point Type / 扫描速率

核心,四个字段决定一切

数据区

地址 + 数值列表

双击可写入

状态行

Number of Polls / Valid Slave Responses

判断链路通不通就看这两个数

四个字段的含义和常见值:

字段

含义

注意

Device Id

从站地址(站号)

1~247,一般是 1;错了就完全无响应

Address

起始地址

最小 1,不能填 0(下一节详解)

Length

读取点数

默认 100,多数设备会因此报错,必须 ≤ 实际可用点数

Modbus Point Type

01 / 02 / 03 / 04

默认是 01: COIL STATUS,想读寄存器要手动切

扫描速率

轮询间隔

决定刷新快慢,见"常见坑"

状态行的两个计数器是最实用的诊断手段:Number of Polls 是发出去的请求数,Valid Slave Responses 是收到的有效响应数。两个数一起涨才是链路正常;只有前者涨,说明发得出去但收不回来。


五、第一次连接:串口与 TCP 两条路

走串口(RTU,现场最常见)

  1. ConnectionConnect...

  2. 在 "Connect Using" 下拉里选 Direct Connection to COMxx(xx 是你的串口号)

  3. 配串口参数:波特率 / 数据位 / 校验位 / 停止位。工业设备最常见的组合是 9600、8 数据位、无校验、1 停止位

  4. Protocol Selections 按钮,把传输模式设为 RTU(ASCII 模式很罕见,且要改成 7 数据位)

  5. Slave Timeout(从站超时,常用 1000 ms)和 Delay Between Polls(轮询间隔,常用 500 ms)

  6. OK,开始轮询

走 TCP(以太网设备 / 网关)

  1. ConnectionConnect...

  2. 在 "Connect Using" 下拉里选 Remote modbusTCP Server

  3. 填设备 IP 和端口,Modbus/TCP 默认端口 502

  4. 本机必须和从站在同一网段,或者能路由过去

两个省时间的习惯

  • 存配置FileSave As 存成命名文档,下次 File → 打开就行,不用重填四个字段。现场有多种设备时,一个设备存一份。

  • 快速连接ConnectionQuick Connect,沿用上一次的连接配置。


六、地址那一格:整个软件最容易填错的地方

这是全文最重要的一节,也是绝大多数"明明按手册填了却读不到数据"的根因。

结论:ModScan 的 Address 字段是 1 基的,而且它对应报文里的地址 0。所以如果手册给的是"0 基偏移量",你要 +1 再填进去。

这个说法怎么自己验证?用软件自己证明——打开 SetupDisplay Options → 显示数据流(原始报文),你会看到实际发出的帧。有资料记录了一个实测例子:Address 填 1、Length 填 100、点类型选线圈时,ModScan 发出的报文是:

01 01 00 00 00 64 3D E1

逐字节拆开看:

字节

含义

从站地址

01

站号 1

功能码

01

读线圈状态

起始地址

00 00

协议里的地址是 0(界面上填的是 1)

数量

00 64

100 个点(十六进制 0x64 = 十进制 100)

CRC

3D E1

校验(RTU 模式,低字节在前)

界面的 Address=1 变成报文的 0x0000——这就是那个偏移。手册地址的三种写法对照

手册写法

它的真实含义

ModScan 的 Address

40001

0 基偏移 0

1

40103

0 基偏移 102

103

30001

0 基偏移 0

1

0000110001

0 基偏移 0

1

(上表的换算基于"ModScan 的 Address 最小可填 1、且填 1 对应协议地址 0"这套被多份资料记录的规则。填之前建议先用显示数据流核一眼——报文里的起始地址字段是 0x0000 还是 0x0001,一眼就能看出来。)

读不到数据时的第一动作永远是:地址 ±1 各试一次。厂商手册在这件事上不统一是常态,试比翻文档快。

另外,不同工具对地址的处理方式不一样,混用时别串了——比如 QModMaster 用的是 0 基寻址,同样一台设备在它那里要填 0


七、数据显示与浮点数

SetupDisplay Options 里可以切换数据的解读方式:

显示格式

什么时候用

十进制(有符号 / 无符号)

状态量、计数器

十六进制

看位标志、看原始字节,排障必备

二进制

逐位分析报警字、状态字

浮点数 / ASCII

见下

显示数据流

看收发原始报文,见下一节

浮点数是第二个大坑。 一个 32 位 IEEE-754 浮点数要占两个 16 位寄存器,ModScan 提供两个选项:

选项

含义

Floating Pt.

两个字寄存器按正常顺序组合(手册里的 "Word Normal")

Swapped FP.

两个字寄存器顺序对调(手册里的 "Word Reversed")

典型现场现象:某个寄存器读出来是 65535 或者一个明显离谱的天文数字,看着像通信故障,其实通信完全正常,只是数据解释方式不匹配。切成 Swapped FP. 往往就是那个真实的 25.6

需要知道的边界:ModScan 只提供"正常"和"字序对调"这两种。如果你的设备用的是字节交换类组合(比如 BADC 这种更冷门的排法),它没有直接对应项——这时先切到十六进制,按原始字节自己算。判断顺序永远是:先确认通信通不通(看状态行两个计数器和数据流),再确认数据怎么解释。

还有个连带影响:浮点占两个寄存器,所以 Length=100 只能看到 50 个浮点值。算长度时别忘了 ×2。


八、写数据(遥控 / 遥调)

写操作简单到让人放松警惕:在数据区双击某个地址/数值,弹出 Write Register 对话框,输入值,点 Update

写入方式上,ModScan 允许你选择单点写入时用 05/06 还是用 15/16 批量指令——有些老设备只认其中一种,这是报文级兼容性问题,不是软件 bug。

但请把这几件事做在前面:

  1. 确认设备允许远程写(有些设备有写保护位或硬件锁)。

  2. 搞清楚这个参数写的是 RAM 还是 EEPROM。写 RAM 掉电就恢复,写 EEPROM 有次数寿命、且可能改坏设备配置。

  3. 先记下原值。点表存一份、原值抄一份,写错了能回退。

  4. 现场有联锁逻辑的设备,先确认写这个值不会触发误动作。

模拟有风险,下令需谨慎。


九、看原始报文(最有用的一节)

SetupDisplay Options显示数据流,就能把收发报文摊开,其中一种底色是主站发出的,另一种是从站回复的(软件用底色区分方向)。

这个窗口能直接回答三个问题:

  • 是我发错了,还是它没回? —— 报文列表里只有发出没有回复,问题在链路/从站;发出去了且地址明显不对,问题在你自己的配置。

  • CRC 对不对? —— 校验错的响应会明确报出来,指向干扰、波特率偏高或线材。

  • 从站到底回了什么? —— 异常响应长这样:

01 83 02 C0 F1

含义是:站号 01、功能码 83(= 03 加了 0x80,表示异常)、异常码 02(非法数据地址)、CRC。看到这个就说明地址或点类型不对、超出了设备的点表范围,不用再怀疑接线。

顺带说一句和 Wireshark 的分工:TCP 场景下,ModScan 看应用层语义(点表对不对、值对不对),Wireshark 看网络层时序(重传、延迟、连接问题);串口场景没有网络层可看,ModScan 这个数据流窗口就是唯一的观测点。


十、没有硬件也能练:配一个 ModSim

同厂有个从站模拟器 ModSim(ModSim32 / ModSim64),和 ModScan 是配套的一对:它在你的电脑上扮演从站,定义若干数据块,等主站来读。

练法:

  1. 打开 ModSim,定义一个数据块(比如保持寄存器 1~10),手工填几个值。

  2. 打开 ModScan,TCP 就连本机回环或本机 IP、端口 502;串口就配合虚拟串口对(COM3 ↔ COM4)。

  3. 对着自己模拟的从站,把"地址偏移、点类型、长度、浮点字序"这几件事全部练一遍。

价值在于把工具和点表逻辑先练熟,到现场就只剩接线和参数对齐。 现场排障的时间压力很大,这些操作不该在现场才第一次做。


十一、状态行故障速查

状态行是 ModScan 的主要报错出口,红字对应不同病因:

提示

含义

往哪查

Device NOT CONNECTED!

尚未建立连接

连接没点,或串口被占用

Data Uninitialized

当前窗口没配置

Address / Length / 点类型没填对

MODBUS Message TIME-OUT

发出去了,从站没响应

站号、波特率、校验位、接线 A/B 反接、从站不解析

Checksum Error in Response Message

响应的 CRC 校验错

干扰、线太长、波特率偏高

MODBUS Exception Response from Slave Device

从站返回异常码

地址或点类型超范围(最常见是异常码 02)

Received Invalid Response to MODBUS Query

响应格式不对

从站不支持该功能码、帧被截断

Number of Polls 涨、Valid Slave Responses 不涨

单向通

发送正常、返回丢失,查接收侧和双工设置


十二、常见坑

现象

原因

解法

一连上就报异常 / 数据不刷新

Length 用了默认的 100,超过从站实际点数

按实际点数填;浮点要 ×2

读寄存器读不出来

点类型默认是 01: COIL STATUS

手动切到 03: HOLDING REGISTER

地址明明按手册填的却没数据

手册是 1 基带前缀,或 0 基偏移,两套差 1

用显示数据流核实,或地址 ±1 试

数值离谱(65535、天文数字)

浮点字序不匹配

Swapped FP.,或切十六进制自己算

地址填 0 报错

ModScan 的 Address 最小为 1

填 1(对应协议地址 0)

设了很短的扫描间隔但没变快

软件内部的时间设置在短间隔下不准

有实测记录显示设 1 ms、示波器量到约 100 ms 量级;别拿软件里的时间评价设备性能

抓到的报文看着不正常

电脑卡顿会影响软件运行

用性能正常的机器,或在设备侧抓

数据导出到 Excel 格式乱

捕获的文本不是标准 CSV

用 Excel 导入向导,或先用转换小工具处理

浮点值列错位、隔行空

窗口高度不够,多列显示重叠

把窗口调高

长时间记录中途停

演示版有时间限制

注册,或改用命令行工具做长期记录

在 Linux / macOS 上找不到替代

ModScan 只有 Windows 版

QModMaster(跨平台)或 mbpoll(命令行)


十三、上手路径

不用背,按四步走:

阶段

做什么

检验标准

第 1 步

装 ModScan64 + ModSim64,两者互连

数据区出现自己填的模拟值

第 2 步

故意把 Length 调到超范围、把点类型选错

能对照状态行认出对应报错

第 3 步

打开显示数据流,把"地址填 1 → 报文 0x0000"亲手验证一遍

能自己算出手册地址该填几

第 4 步

在 ModSim 里放一个浮点值,分别用两种浮点选项读

能一眼看出字序问题

这四步做完,现场遇到"连不上"或"数据不对",基本能当场定性。


十四、参考

  • 官网与下载(ModScan32 / ModScan64 / ModSim32 / ModSim64 的演示版):https://www.win-tech.com/html/demos.htm

  • ModScan32 功能说明:https://www.win-tech.com/html/modscan32.htm

  • Modbus 应用说明页(ModScan / ModSim 概览):https://www.win-tech.com/html/modbus1.htm

  • 用户手册打包(MS-Word 格式,含 ModScan / ModSim / MNetSvr / MNetMon):https://www.win-tech.com/demos/cpakman.zip

  • 功能码与报文结构速查:随手册附带的协议章节,或任一份 Modbus 应用协议规范

  • 替代品:Modbus Poll(https://www.modbustools.com)、mbpoll(libmodbus 系的命令行工具)