什么是 Modpoll?
Modpoll 은(는)오픈소스的命令行 Modbus 마스터模拟器,由 proconX 公司基于其 FieldTalk™ 프로토콜栈개발。它可以在 Windows、Linux、QNX 等操作系统上运行,是엔지니어링师进行 Modbus 设备디버깅、프로토콜测试和批量데이터采集时的利器。与带 GUI 的 Modbus Poll 不同,Modpoll 完全通过命令行매개변수控制,非常适合통합到自动化测试스크립트和 CI/CD 流程中。
官方下载주소:http://www.focus-sw.com/fieldtalk/modpoll.html
Modpoll 支持的功能
- 传输모드:Modbus RTU(시리얼 포트)和 Modbus TCP(以太网),同时支持通过 RTU-over-TCP 게이트웨이통신
- 기능 코드覆盖:FC01(读코일)、FC02(读이산 입력)、FC03(读유지 레지스터)、FC04(读입력 레지스터)、FC05(写单코일)、FC06(写单레지스터)、FC15(写多코일)、FC16(写多레지스터)、FC23(读/写多레지스터)
- 데이터형식:支持 HEX、10진수无符号、10진수有符号、32 位浮点数(Float)等多种표시 형식
- 바이트序설정:支持 Big-Endian 和 Little-Endian 两种바이트序,适配不同厂商的 PLC 设备
- 轮询모드:支持单次읽기和连续轮询,可自由指定轮询间隔
- 출력형식:支持표준文本출력和16진수 raw 출력两种모드
安装 Modpoll
Windows 平台安装
从官网下载 Windows 버전的 ZIP 压缩包,解压后即可获得 modpoll.exe 可执行文件。建议将解压目录추가到系统的 PATH 환경변수中,方便在任意目录下调用。Windows 10/11 用户也可以直接通过 WSL 使用 Linux 버전的 Modpoll。
Linux 平台安装
# 下载 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 ID) | -a 1 |
-r | 시작레지스터/코일주소(프로토콜주소) | -r 100 |
-c | 읽기/쓰기的点数(Count) | -c 20 |
-b | 통신 속도(RTU 모드) | -b 9600 |
-p | 패리티(none / even / odd) | -p none |
-t | 데이터유형与표시 형식 | -t 4:hex |
-1 | 持续轮询모드 | -1 |
-o | 超时时间(秒) | -o 3 |
-0 | 주소从 0 开始(默认 PLC 주소从 1 开始) | -0 |
常用实战命令
1. Modbus TCP 유지 레지스터 읽기 (FC03)(FC03)
从 IP 주소 192.168.1.100、포트 502 的设备,읽기슬레이브 주소 1 的유지 레지스터 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 毫秒轮询一次,무한 반복
modpoll -m tcp -a 1 -r 1 -c 20 -1 192.168.1.100 500
# 출력带时间戳的轮询데이터
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. 读코일 상태(FC01)
# 읽기주소 0 开始的 8 个코일
modpoll -m tcp -a 1 -r 1 -c 8 -t 0 192.168.1.100
注意:-t 0 表示코일유형,-t 1 表示이산 입력,-t 3 表示입력 레지스터,-t 4 表示유지 레지스터。
5. 쓰기单레지스터(FC06)
# 将프로토콜주소 0 的레지스터 값쓰기 1234
modpoll -m tcp -a 1 -r 1 192.168.1.100 1234
6. 읽기 32 位浮点数(Float)
很多工业仪表(如온도变送器、流量计)使用两个连续的 16 位유지 레지스터存储一个 IEEE 754 32 位浮点数:
# 从주소 0 开始읽기 2 个레지스터,按 float 형식显示
modpoll -m tcp -a 1 -r 1 -c 2 -t 4:float 192.168.1.100
7. 批量쓰기多레지스터(FC16)
# 从프로토콜주소 0 开始,依次쓰기 100, 200, 300, 400
modpoll -m tcp -a 1 -r 1 192.168.1.100 100 200 300 400
8. 读写组合操作(FC23)
# 읽기주소 0-4(5个레지스터),同时将주소 10-11 쓰기 99, 88
modpoll -m tcp -a 1 -r 1 -c 5 -w 11 -q 2 192.168.1.100 99 88
통합到自动化测试스크립트
Modpoll 的命令行特性使其成为自动化测试的理想选择。以下是一个完整的설비 인수 검사测试스크립트:
#!/bin/bash
# Modbus 设备레지스터读写验收测试
# 用法: ./modbus_test.sh <设备IP>
DEVICE_IP=${1:-"192.168.1.100"}
PASS=0
FAIL=0
echo "=== Modbus 설비 인수 검사测试 ==="
echo "目标设备: $DEVICE_IP"
echo ""
# 测试1: TCP 연결性
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: 유지 레지스터 읽기 (FC03) FC03
echo "[TEST 2] 기능 코드 FC03 - 读유지 레지스터"
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 功能正常"
PASS=$((PASS+1))
else
echo " [FAIL] FC03 읽기失败: $result"
FAIL=$((FAIL+1))
fi
# 测试3: 쓰기유지 레지스터 FC06
echo "[TEST 3] 기능 코드 FC06 - 写单레지스터"
# 先读当前值
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 쓰기功能正常"
PASS=$((PASS+1))
else
echo " [FAIL] FC06 쓰기失败: 预期9999, 实际$after"
FAIL=$((FAIL+1))
fi
echo ""
echo "=== 测试结果: $PASS 通过, $FAIL 失败 ==="
Modpoll 与其他 Modbus 도구对比
- Modbus Poll:Windows GUI 도구,可视化操作,适合手动디버깅。官网 www.modbustools.com。
- Modpoll:纯命令行도구,跨平台,适合스크립트自动化和远程部署,完全무료。
- pymodbus:Python 库,需要编程,灵活性最高,适合构建自定义测试框架。
- QModMaster:Qt 写的跨平台 GUI 도구,오픈소스무료,功能较简单。
常见문제排查指南
연결超时
首先用 ping 确认네트워크层连通。对于 Modbus TCP,默认使用 502 포트,用 telnet 192.168.1.100 502 测试。如果연결바로断开(而非超时),설명服务器拒绝연결,可能포트未开放。如果一直대기无响应,可能是防火墙拦截。
읽기值全为零
可能原因:슬레이브 주소 -a 设置与实际设备不일치;시작주소 -r 的 PLC 주소到프로토콜주소转换错误(如 PLC 주소 40001 对应프로토콜주소 0);该段레지스터确实未被설정或未쓰기过데이터。
RTU 모드返回异常/错误
逐一确认:통신 속도(-b)、데이터 비트(固定8位)、패리티(-p:none/even/odd)和정지 비트是否与슬레이브设备一致。RS-485 배선特别注意 A(+)/B(-)线序不能接反。建议先用示波器或逻辑分析仪观察总线上信号质量。
浮点数读数异常
32 位浮点数涉及两个 16 位레지스터的排列顺序(바이트序/字序)。不同厂商可能使用 ABCD、CDAB、BADC、DCBA 等不同顺序。Modpoll 默认使用 Big-Endian 浮点형식。如果读数明显异常(如 NaN 或数量级完全不对),尝试用 modpoll -t 4:hex 先看原始16진수值,手动계산确认바이트序后再调整설정。
总结
Modpoll 是 Modbus 프로토콜디버깅 도구链中不可或缺的"瑞士军刀"。它的最大优势在于轻量、跨平台、命令行驱动,可以无缝融入 Shell 스크립트、Python 测试框架和 CI/CD 流水线。无论是嵌入式엔지니어링师验证单片机 Modbus 슬레이브、自动化엔지니어링师디버깅 PLC 통신설정,还是 QA 엔지니어링师编写自动化的 Modbus 설비 인수 검사测试,掌握 Modpoll 都能显著提高工作效率。
답글 작성