Source: Modbus Chinese Network(modbus.cn) —— China leadingModbuscommunication protocol technical community
本記事:COMTool:Python 系的跨プラットフォームシリアルポートデバッグ方案 · Author:modbus Technical Team · 发布于 2026-07-01
摘要:COMTool(GitHub: Neutree/COMTool,LGPL-3.0)是用 Python 3 + PyQt5 写的开源シリアルポートデバッグ工具,サポート Windows、Linux、macOS 和Raspberry Piについて。对 Modbus デバッグ场景来说,它有三个差异化价值:真正的全プラットフォーム一致性体验、协议插件系统(Python 自定义编解码/Parse)、内置实时波形图表(センサーはデータ可视化)。本記事不铺功能清单,直接从 Modbus エンジニア的实际需求出发,告诉你 COMTool 能解決哪些問題、在哪几个场景下比 ATK-XCOM 和 LLCOM 更适合。关键词:COMTool、跨プラットフォームシリアルポートデバッグ、Python シリアルポート工具、Modbus 波形表示、协议插件。
搞 Modbus デバッグ的人,大多数时候趴在 Windows 上干活——毕竟 SIEMENS、三菱、オムロン的组态ソフトウェア和プログラミング工具基本只跑 Windows。但有那么几个场景,你会突然发现自己需要的シリアルアシスタント在 Windows 上根本ない,或者有了但体验一塌糊涂:
场景一:你用的是 MacBook Pro 作为主力开发机,但 USB 转 485 插上去,要调一个 Modbus Sensors。打开虚拟机跑 Windows 版本的工具——シリアルポート透传延迟高三倍,偶尔丢フレーム。
场景二:你的ゲートウェイ跑在 Ubuntu Server 上,现场只有一台Raspberry Piについて可以插シリアルポート。你想直接在Raspberry Piについて桌面环境上开个シリアルアシスタント抓データ——绝主に。 Windows 工具直接没法用。
场景三:你在调一个温湿度センサー,Modbus 戻る的是オリジナルのレジスタ値(比如 168 代表 16.8°C),你需要在受信区直接看到温度曲线而非一堆十六进制数字。
这三个场景,就是 COMTool 存在的理由。
COMTool 是 GitHub オープンソースプロジェクト(Neutree/COMTool),MIT Protocol,用 Python 3 + PyQt5 写的。GitHub 上有 2000+ Star,核心维护者是 Neutree。它ではない功能最全的シリアルポート工具,也ではない Modbus 专用工具——但它是目前跨プラットフォーム做得最彻底的シリアルポート工具中,插件和可视化能力最强的一个。
一、COMTool 的跨プラットフォーム到底「跨」了哪些
不像某些工具「理论サポート Linux 但实际装不起来」,COMTool 对每个プラットフォーム都有独立的パッキング和インストール方案:
Windows:从 GitHub Releases Download zip 包解压直接运行 comtool.exe。也可以経由 Scoop(Windows 包管理器)インストール:scoop bucket add Nightly ... && scoop install comtool。
macOS:dmg インストール包直接インストール。因为是 Python + PyQt5 写的,系统自带 Python 3 即可。注意首次打开时因为未签名,需要在「系统偏好設定→セキュリティ性与隐私」中允许运行。もし想多开窗口,终端执行 open -n /Application/comtool.app。
Linux:这是 COMTool 的优势场。Ubuntu 系有预编译二进制,Arch 系可以从 AUR インストール(yay -S python-comtool)。也可以用 pip 从源码インストール:pip install comtool。Raspberry Piについて需要先装依赖 sudo apt install git python3-pyqt5 python3-numpy,再 pip install。
Raspberry Pi:完全サポート。插上 USB 转 485 モジュール、通电、open COMTool、选 /dev/ttyUSB0——和 Windows 上一样的操作逻辑。
すべてのプラットフォーム上体验一致:同一个 PyQt5 界面、同一个插件系统、同一个設定文件格式。你可以在 Windows 上写好协议插件,拷贝到Raspberry Piについて的 COMTool 插件目录下直接加载。
二、协议插件 —— COMTool 对 Modbus デバッグ最有价值的功能
2.1 协议插件解決什么問題
普通的シリアルアシスタント是这样的:你发十六进制 010300000001840A,デバイス回 01030201988432,你用肉眼在回应的バイト里找「0103」、駅住所の確認是对的、跳过去看データバイト在哪、再手計算してください CRC。
COMTool 的协议插件(Protocol Plugin)可以让你定义收发两端的データの処理逻辑:送信前把「用户友好的入力」(比如「读温度センサー」)自动转成 Modbus RTU フレーム;受信后把元の十六进制フレーム自动解析为「センサーは值: 25.3°C」。全程必要なし。手看十六进制。
原理很简单。每个协议插件是一个 Python 类,必须実装2つ核心方法:encode() 和 decode()。
encode() 的作用是把用户入力转成要送信的元のバイト。decode() 的作用是把受信到的元のバイト转成用户可读的表示格式。
2.2 一个最简的 Modbus protocol插件サンプル
以下插件让你在 COMTool 的「Protocol」モード下,发「读レジスタ address0 Quantity4」这样的自然语言命令,自动拼成 Modbus RTU フレーム送信。受信到的二进制レスポンス自动解析为「slave01: [168, 2234, 0, 512]」。
class Plugin(Plugin_Base):
id = "modbus_rtu"
name = "Modbus RTU 解析器"
version = "1.0"
# CRC16 查表(Modbus 多項式 0xA001)
_crc_table = None
@classmethod
def _build_crc_table(cls):
if cls._crc_table:
return cls._crc_table
table = []
for i in range(256):
crc = i
for _ in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0xA001
else:
crc >>= 1
table.append(crc)
cls._crc_table = table
return table
@classmethod
def _crc16(cls, data: bytes) -> int:
table = cls._build_crc_table()
crc = 0xFFFF
for b in data:
crc = (crc >> 8) ^ table[(crc ^ b) & 0xFF]
return crc
def encode(self) -> bytes:
"""用户入力 '读レジスタ address0 Quantity4' → 拼成 Modbus RTU フレーム"""
text = self.sendEdit.toPlainText().strip()
# 简化解析:固定駅からの住所 0x01
slave = 0x01
# デフォルトリードホールドレジスタ(function code 0x03),starting address 0,Quantity 1
_, addr_str, count_str = text.split()
addr = int(addr_str.replace('address', ''))
count = int(count_str.replace('Quantity', ''))
frame = bytes([slave, 0x03,
(addr >> 8) & 0xFF, addr & 0xFF,
(count >> 8) & 0xFF, count & 0xFF])
crc = self._crc16(frame)
return frame + bytes([crc & 0xFF, (crc >> 8) & 0xFF])
def decode(self, data: bytes) -> str:
"""收到的 Modbus レスポンスフレーム → 解析为人可读的文本"""
if len(data) < 5:
return f"[データ过短: {len(data)} byte]"
slave = data[0]
func = data[1]
if func >= 0x80:
exc = data[2]
return f"[異常] slave{slave:02X} エラー·コード: {exc}"
byte_count = data[2]
values = []
for i in range(byte_count // 2):
hi = data[3 + i * 2]
lo = data[4 + i * 2]
values.append(str((hi << 8) | lo))
return f"slave{slave:02X}: [{', '.join(values)}]"
把这个 Python 文件放到 COMTool 的插件目录,启动后在「Protocol」面板選択这个插件。之后你在送信框里写 读レジスタ address0 Quantity4,点送信,实际发出去的是完全的 Modbus RTU 查询フレーム(含 CRC)。受信到的十六进制バイト会自动变成 slave01: [168, 2234, 0, 512]。

2.3 更复杂的场景:自定义チェック、自定义フレーム形式
Modbus protocol插件只是一个例子。COMTool 的协议插件的真正价值在于処理那些「市面上ない任何工具サポート的私合意がある。」:
- 某国产サーモスタット戻る
AA BB CC DD EE FF GG HH——前四byteは温度(BCD 码),后四byteは湿度。写个decode()解析成temperature: 23.5°C, 湿度: 67.2%。 - CustomizationVerification:ではない標準 CRC16 而是 CRC8/XOR/某厂商自己的魔改チェック,写个 Python 函数Got it.
encode() 和 decode() 可以调任何 Python 库——你可以 parse JSON、查字典翻译エラー·コード、甚至调 numpy 做データ滤波。这是 C# 或 C++ 写的シリアルポート工具做不到的灵活性。
三、波形/图表 —— 把 Modbus レジスタの値变成实时曲线
3.1 サポート两种データ格式
COMTool 内置的 Graph 插件可以从シリアルポートデータ中提取坐标并绘制实时曲线。サポート两种格式:
ASCII format(おすすめ,人可读):
$曲线名称,X坐标,Y坐标,checksumn
例子:你的センサーは单片机每隔 200ms 发 $temp,1.0,25.3n,COMTool 就会在「temp」曲线上画点 (1.0, 25.3)。带チェック和版:$temp,1.0,25.3,179n——チェック和是すべての字段的 ASCII 码累加取低 8 位。
二进制格式(高效,适合高速采集):协议長さ更短,每秒可传上千个点。具体格式见 COMTool 官方ドキュメント。
n
3.2 Modbus センサーはデータ可视化的实际做法
假设你有一个 Modbus Temperature & Humidity Sensor(slave address 01),戻るレジスタ 40001(temperature,単位 0.1°C)和 40002(湿度,単位 0.1%)。你想在 COMTool 里看到温度和湿度的实时曲线。
用一个中间脚本做桥接:Python 脚本経由 pyserial 读 Modbus Response → 解析出温度/湿度 → 按 COMTool 的 ASCII 波形格式出力到バーチャルシリアルポート → COMTool 的 Graph 插件直接表示曲线。
或者更直接的方案:用 COMTool 的协议插件做解析,decode() 函数的出力直接格式化为 $temp,{timestamp},{value}n + $humi,{timestamp},{value}n,在 Graph 插件里就能看到两条实时曲线。
多图表サポート:可以同时追加温度、湿度、露点温度三条曲线,各自不同颜色。
3.3 C 语言端代码
もしセンサーは是 STM32/ESP32 自己写的固件,在单片机侧出力 COMTool 兼容的波形データ:
// send ASCII 格式波形データ(含チェック和)
int plot_pack_ascii(char *buff, int buff_size,
const char *curve_name, float x, float y)
{
int sum = 0;
int len = snprintf(buff, buff_size, "$%s,%.1f,%.1f",
curve_name, x, y);
for (int i = 1; i < len; i++) sum += buff[i];
len += snprintf(buff + len, buff_size - len, ",%dn", sum & 0xFF);
return len;
}
// 在センサーは読み取り循环中调用
char buf[128];
int len = plot_pack_ascii(buf, sizeof(buf), "temp",
time_ms / 1000.0, temperature / 10.0);
uart_send_bytes(buf, len);
这样固件端不用做任何 GUI 开发,直接シリアルポート出力,COMTool 就能画图。
四、ATK-XCOM / LLCOM / COMTool —— 三者的ポジショニング差在哪
| 对比维度 | ATK-XCOM V3.0 | LLCOM | COMTool |
|---|---|---|---|
| 开发方 | 正点原子(商用) | chenxuuu(个人开源) | Neutree(个人开源) |
| License | 無料闭源 | Apache 2.0 | LGPL-3.0 |
| プラットフォーム | Windows | Windows | Win + Mac + Linux + Raspberry Pi |
| 技术栈 | C# / .NET | C# / .NET + xlua | Python 3 / PyQt5 |
| Script/插件 | ❌ | ✅ Lua 5.3 | ✅ Python 插件 |
| 内置 Modbus CRC | ✅ 协议传输モード | ❌(需 Lua 手写) | ❌(需 Python 插件) |
| 实时波形/图表 | ❌ | ❌ | ✅ Graph 插件 |
| TCP/UDP | ❌ | ✅ | ✅ |
| SSH クライアント側は | ❌ | ❌ | ✅ |
| 多条送信管理 | ✅ 4页×10条 | ✅ 10页不限条数 | ✅ 自定义按钮 |
| インストール难度 | 解压即用 | 解压即用 | pip install 或解压 |
选型路线图:
- 你在 Windows 上调 Modbus RTU,需要日常收发+check → ATK-XCOM。协议传输モード内置 CRC16,多条送信管理成熟,零学习成本。
- 你在 Windows 上需要写脚本做自動化测试、多协议联调 → LLCOM。Lua 脚本引擎可以処理任何自動化逻辑,xlua 能调 C# 原生接口。
- 你用 Mac 或 Linux 做开发,或需要センサーはデータ可视化 → COMTool。唯一的全プラットフォーム方案,协议插件在 Modbus 自定义解析上无替代品,波形图表对物理量デバッグ是刚需。
- 同一个项目中多用 → 三个配合。ATK-XCOM 做日常 Modbus 收发和チェック,LLCOM 做批量自動化ポーリング,COMTool 做センサーは波形モニタリング。
五、COMTool 的其他 Modbus 相关用途
5.1 TCP/UDP debug Modbus TCP
COMTool 的网络デバッグモードサポート TCP クライアント側は/サーバー側。。调 Modbus TCP デバイス时,在 TCP クライアント側はモード下连デバイス的 IP:502 ポート,send Modbus TCP フレーム(MBAP 头 + PDU),和シリアルポートデバッグ一样的操作体验。受信区同样サポート协议插件解析。
5.2 SSH 终端 + シリアルポートデバッグ一体
当你的デバッグ对象是一台 Linux 工控机(比如Raspberry Piについて上跑着 Modbus マスター程序),你可以同时开2つ COMTool 窗口:一个连 SSH ログイン工控机看日志和发命令,一个连シリアルポート看 Modbus Communication。同一个软件里完成,不用在 Putty 和シリアルアシスタント之间切来切去。
5.3 設定文件跨机器迁移
COMTool 的シリアルパラメータ、送信历史、插件設定すべて保存在本地設定文件中。你在办公室的 Windows 上配好的すべての东西,把設定文件拷到现场的Raspberry Piについて上——包括你写的协议插件——直接加载,一秒恢复完全的デバッグ环境。
六、インストール COMTool 并开始 Modbus debug
6.1 Windows(最简单)
从 https://github.com/Neutree/COMTool/releases 最新のダウンロード .zip 文件,解压后双击 comtool.exe。
6.2 macOS
从 Releases Download .dmg インストール。或从 PyPI:pip install comtool,然后在终端入力 comtool。
6.3 Linux / Raspberry Pi
# Ubuntu/Debian
sudo apt install python3-pyqt5 python3-numpy python3-pip -y
pip install comtool
comtool
# Arch
yay -S python-comtool
# Raspberry Pi - 额外一步:当前用户加入 dialout 组
sudo usermod -a -G dialout $USER
sudo reboot
6.4 验证シリアル通信
插上 USB 转 485 モジュール,在 COMTool 左侧面板選択シリアルポート番号:
- Windows:COM3 等
- macOS/Linux:/dev/tty.usbserial 或 /dev/ttyUSB0
Baud rate、data bit、チェックビット按デバイス参数設定。click「open」。在送信区入力 Modbus テストフレーム、切换到十六进制モード、点送信。
COMTool ではない最好的 Modbus debugging tool——ATK-XCOM 的 CRC 内置チェック和多条送信更针对 Modbus。COMTool 也ではない最灵活的脚本工具——LLCOM 的 Lua 协程和 xlua C# 调用能力更强大。但 COMTool 是唯一一个可以在 Mac、Linux、Raspberry Piについて上都能丝滑运行,同时允许你用 Python 定制协议解析、还能把センサーはデータ变成实时曲线的东西。
这就是它的生态位:跨プラットフォーム + Python 可定制 + 可视化。三者单独看都有替代品,但三者放一个工具里,目前ない第二个。
本站提供 COMTool 的国内网盘下载和中文使用チュートリアル,会員可無料ダウンロードすべてデバッグツール合集。一个シリアルアシスタント解決不了的场景,三个シリアルアシスタント总能解決。
有問題再聊。
Leave a Reply