- 1. 什么是 Modpoll?
- 2. Modpoll 支持的Function
- 3. 安装 Modpoll
- 4. Windows 平台安装
- 5. Linux 平台安装
- 6. ARM / 嵌入式 Linux 安装
- 7. Modpoll 命令行参数详解
- 8. 常用实战命令
- 9. 1. Modbus TCP Read and hold register(FC03)
- 10. 2. Modbus RTU 串口通信
- 11. 3. 持续轮询模式(监控用)
- 12. 4. 读Coil status(FC01)
- 13. 5. 写入单register(FC06)
- 14. 6. 读取 32 位浮点数(Float)
- 15. 7. 批量写入多register(FC16)
- 16. 8. 读写组合Operation(FC23)
- 17. 集成到自动化测试脚本
- 18. Modpoll 与其他 Modbus Tools对比
- 19. Frequently Asked Questions排查指南
- 20. connect超时
- 21. 读取值全为零
- 22. RTU 模式返回异常/Error
- 23. 浮点数读数异常
- 24. 总结
什么是 Modpoll?
Modpoll 是一款开源的命令行 Modbus 主站模拟器,由 proconX 公司基于其 FieldTalk™ 协议栈开发。它可以在 Windows、Linux、QNX 等Operationsystem上运行,是工程师进行 Modbus 设备debug、协议测试和批量Data Acquisition时的利器。与带 GUI 的 Modbus Poll 不同,Modpoll 完全通过命令行参数控制,非常适合集成到自动化测试脚本和 CI/CD 流程中。
官方Downloadaddress:http://www.focus-sw.com/fieldtalk/modpoll.html
Modpoll 支持的Function
- 传输模式:Modbus RTU(串口)和 Modbus TCP(以太网),同时支持通过 RTU-over-TCP 网关通信
- function code覆盖:FC01(读线圈)、FC02(读离散输入)、FC03(读保持register)、FC04(读输入register)、FC05(写单线圈)、FC06(写单register)、FC15(写多线圈)、FC16(写多register)、FC23(读/写多register)
- data format:支持 HEX、decimal无符号、decimal有符号、32 位浮点数(Float)等多种Display format
- endianness配置:支持 Big-Endian 和 Little-Endian 两种endianness,适配不同厂商的 PLC 设备
- 轮询模式:支持单次读取和连续轮询,可自由指定轮询间隔
- 输出format:支持标准Text输出和hexadecimal raw 输出两种模式
安装 Modpoll
Windows 平台安装
从官网Download Windows 版本的 ZIP 压缩包,解压后即可获得 modpoll.exe 可执行文件。建议将解压目录添加到system的 PATH 环境变量中,方便在任意目录下调用。Windows 10/11 用户也可以直接通过 WSL 使用 Linux 版本的 Modpoll。
Linux 平台安装
# Download Linux 版本(以 3.10 版本为例)
wget http://www.focus-sw.com/fieldtalk/modpoll-3.10-linux-x86_64.tar.gz
# 解压
tar -xzf modpoll-3.10-linux-x86_64.tar.gz
# 进入目录
cd modpoll-3.10-linux-x86_64
# 测试运行
./modpoll --version
# 可选:创建软链接方便全局调用
sudo ln -s $(pwd)/modpoll /usr/local/bin/modpoll
ARM / 嵌入式 Linux 安装
如果需要在树莓派等 ARM 设备上运行,可以从官网选择对应的 ARM 版本,或从源码交叉编译。proconX 提供了 armhf 和 aarch64 等架构的预编译包。
Modpoll 命令行参数详解
| 参数 | 含义 | 示例 |
|---|---|---|
-m | 传输模式(tcp / rtu / ascii) | -m tcp |
-a | slave address(Slave ID) | -a 1 |
-r | startregister/Coil address(协议address) | -r 100 |
-c | 读取/写入的点数(Count) | -c 20 |
-b | Baud rate(RTU 模式) | -b 9600 |
-p | check digit(none / even / odd) | -p none |
-t | data type与Display format | -t 4:hex |
-1 | 持续轮询模式 | -1 |
-o | 超时time(秒) | -o 3 |
-0 | address从 0 开始(默认 PLC address从 1 开始) | -0 |
常用实战命令
1. Modbus TCP Read and hold register(FC03)
从 IP address 192.168.1.100、端口 502 equipment,读取slave address 1 的保持register 0-9(共 10 个):
modpoll -m tcp -a 1 -r 1 -c 10 192.168.1.100
输出示例:
-- Polling slave 1...
[1]: 1234
[2]: 5678
[3]: 0
[4]: 100
2. Modbus RTU 串口通信
# Linux 平台(/dev/ttyUSB0)
modpoll -m rtu -a 1 -r 1 -c 10 -b 9600 -p none /dev/ttyUSB0
# Windows 平台(COM3)
modpoll -m rtu -a 1 -r 1 -c 10 -b 9600 -p none COM3
3. 持续轮询模式(监控用)
# 每 500 毫秒轮询一次,infinite loop
modpoll -m tcp -a 1 -r 1 -c 20 -1 192.168.1.100 500
# 输出带time戳的轮询data
modpoll -m tcp -a 1 -r 1 -c 5 -1 192.168.1.100 1000 | while read line; do
echo "$(date '+%H:%M:%S') $line"
done
4. 读Coil status(FC01)
# 读取address 0 开始的 8 个线圈
modpoll -m tcp -a 1 -r 1 -c 8 -t 0 192.168.1.100
注意:-t 0 表示线圈Type,-t 1 表示离散输入,-t 3 表示输入register,-t 4 表示保持register。
5. 写入单register(FC06)
# 将协议address 0 的register value写入 1234
modpoll -m tcp -a 1 -r 1 192.168.1.100 1234
6. 读取 32 位浮点数(Float)
很多工业仪表(如temperature变送器、流量计)使用两个连续的 16 位保持register存储一个 IEEE 754 32 位浮点数:
# 从address 0 开始读取 2 个register,按 float format显示
modpoll -m tcp -a 1 -r 1 -c 2 -t 4:float 192.168.1.100
7. 批量写入多register(FC16)
# 从协议address 0 开始,依次写入 100, 200, 300, 400
modpoll -m tcp -a 1 -r 1 192.168.1.100 100 200 300 400
8. 读写组合Operation(FC23)
# 读取address 0-4(5个register),同时将address 10-11 写入 99, 88
modpoll -m tcp -a 1 -r 1 -c 5 -w 11 -q 2 192.168.1.100 99 88
集成到自动化测试脚本
Modpoll 的命令行特性使其成为自动化测试的理想选择。以下是一个完整equipment验收测试脚本:
#!/bin/bash
# Modbus 设备register读写验收测试
# 用法: ./modbus_test.sh <设备IP>
DEVICE_IP=${1:-"192.168.1.100"}
PASS=0
FAIL=0
echo "=== Modbus 设备验收测试 ==="
echo "目标设备: $DEVICE_IP"
echo ""
# 测试1: TCP connect性
echo "[TEST 1] TCP 端口 502 连通性"
if timeout 3 bash -c "echo > /dev/tcp/$DEVICE_IP/502" 2>/dev/null; then
echo " [PASS] 端口 502 可达"
PASS=$((PASS+1))
else
echo " [FAIL] 端口 502 不可达"
FAIL=$((FAIL+1))
fi
# 测试2: Read and hold register FC03
echo "[TEST 2] function code FC03 - 读保持register"
result=$(modpoll -m tcp -a 1 -r 1 -c 5 -o 1 $DEVICE_IP 2>&1)
if echo "$result" | grep -qE '[[0-9]+]:'; then
echo " [PASS] FC03 Function正常"
PASS=$((PASS+1))
else
echo " [FAIL] FC03 读取失败: $result"
FAIL=$((FAIL+1))
fi
# 测试3: 写入保持register FC06
echo "[TEST 3] function code FC06 - 写单register"
# 先读current value
before=$(modpoll -m tcp -a 1 -r 1 -c 1 -o 1 $DEVICE_IP 2>&1 | grep -oP '(? /dev/null 2>&1
# 验证写入
after=$(modpoll -m tcp -a 1 -r 1 -c 1 -o 1 $DEVICE_IP 2>&1 | grep -oP '(? /dev/null 2>&1
if [ "$after" = "9999" ]; then
echo " [PASS] FC06 写入Function正常"
PASS=$((PASS+1))
else
echo " [FAIL] FC06 写入失败: 预期9999, 实际$after"
FAIL=$((FAIL+1))
fi
echo ""
echo "=== 测试结果: $PASS 通过, $FAIL 失败 ==="
Modpoll 与其他 Modbus Tools对比
- Modbus Poll:Windows GUI Tools,可视化Operation,适合手动debug。官网 www.modbustools.com。
- Modpoll:纯命令行Tools,跨平台,适合脚本自动化和远程部署,完全free。
- pymodbus:Python 库,需要编程,灵活性最高,适合构建Customization测试框架。
- QModMaster:Qt 写的跨平台 GUI Tools,开源free,Function较简单。
Frequently Asked Questions排查指南
connect超时
首先用 ping Confirm网络层连通。对于 Modbus TCP,默认使用 502 端口,用 telnet 192.168.1.100 502 测试。如果connect立即断开(而非超时),说明服务器拒绝connect,可能端口未开放。如果一直等待无Response,可能是防火墙拦截。
读取值全为零
可能原因:slave address -a 设置与实际设备不匹配;starting address -r 的 PLC address到协议address转换Error(如 PLC address 40001 对应协议address 0);该段register确实未被配置或未写入过data。
RTU 模式返回异常/Error
逐一Confirm:Baud rate(-b)、data bit(固定8位)、check digit(-p:none/even/odd)和stop bit是否与从站设备一致。RS-485 接线特别注意 A(+)/B(-)线序不能接反。建议先用示波器或逻辑分析仪观察总线上信号质量。
浮点数读数异常
32 位浮点数涉及两个 16 位register的排列顺序(endianness/字序)。不同厂商可能使用 ABCD、CDAB、BADC、DCBA 等不同顺序。Modpoll 默认使用 Big-Endian 浮点format。如果读数明显异常(如 NaN 或quantity级完全不对),尝试用 modpoll -t 4:hex 先看原始hexadecimal值,手动计算Confirmendianness后再调整配置。
总结
Modpoll 是 Modbus protocolDebug Tools链中不可或缺的”瑞士军刀”。它的最大优势在于轻量、跨平台、命令行驱动,可以无缝融入 Shell 脚本、Python 测试框架和 CI/CD 流水线。无论是嵌入式工程师验证单片机 Modbus 从站、自动化工程师debug PLC 通信配置,还是 QA 工程师编写自动化的 Modbus 设备验收测试,掌握 Modpoll 都能显著提高工作效率。
发表回复