一款本地运行的 CAN / CAN FD 日志分析与信号解码桌面工具(Electron + React)。
解析 ASC / BLF 总线日志,结合 DBC 数据库文件进行信号级解码,并以「数值表格 + 曲线图 + 位布局视图」三种视图呈现。同时支持物理量 CSV 逆向生成 CAN 报文(含 CRC 自动计算),适用于数据回放、标定验证与 HIL 仿真激励。
当前版本 2.2.0(2026-09-19 发布,tag
v2.2.0);版本更新记录见 CHANGELOG.md。v2.2「体验与健壮」带来深色模式、可折叠布局、全局搜索与时间轴总览、总线负载与错误帧统计、错误上报与诊断日志、多 Y 轴曲线。
- 多格式解析
ASC:Vector CANalyzer 文本日志(支持普通 CAN 与 CAN FD)BLF:Vector 二进制日志(CAN / CAN FD 对象块)DBC:CANdb++ 数据库(BO_/SG_/VAL_/CM_/BA_属性 /SIG_VALTYPE_,支持 factor/offset、Intel/Motorola 字节序、枚举、多路复用、浮点信号)- 物理量
CSV:首行为表头,t列为时间戳,其余列与 DBC 信号名对应
- CAN FD 64 字节:DBC 可定义 DLC=64 的消息,信号位可延伸至 B63(bit 511),布局视图按 DLC 动态渲染 B0–B63
- 信号级解码:物理值 = 原始值 × factor + offset;表格展示物理值、原始字节与解码位
- 曲线图:基于 Recharts,支持缩放/平移、图例点击显隐曲线、Y 轴自适应(常值曲线也可读)
- 位布局视图:直观展示每个信号在报文中的字节/位分布,色块与曲线颜色一一对应
- 报文日志:时间 / ID / 名称 / DLC / 数据 HEX 列表,支持过滤与行内 DBC 解码
- 全局搜索:顶部单一入口统一检索消息名 / 信号名 / CAN ID(十进制 +
0x十六进制)/ DID,Ctrl+F唤起、Esc清除,Enter定位首个命中帧并高亮 + 显示命中数(如12 hits);检索走主进程索引,1M 帧首响应 ≤300ms - 时间轴总览(minimap):报文日志与曲线视图底部共享缩放条,~2000 桶密度热条按 top ID 堆叠;拖拽平移、滚轮/双击缩放,与两侧视图时间窗双向同步
- 总线统计:逐秒总线负载率曲线 + 平均/峰值负载(比特率 125k/250k/500k/1M 可切换);按消息 ID 的周期与抖动(对照 DBC
GenMsgCycleTime,含超差占比与「仅看超差」筛选);错误帧分类 + Bus Off / Error Passive 时间线标记,点击可跳转报文表对应时刻 - 统计 CSV 导出:负载序列、周期抖动表与错误帧/状态明细一键导出
- 诊断日志:
userData/logs/app-YYYY-MM-DD.log按天滚动记录启动/加载/解析错误/渲染进程崩溃/IPC 异常,保留 7 天自动清理;「帮助 → 打开诊断日志」直达,错误抽屉可「一键复制诊断信息」(脱敏,不含报文内容) - 导出与转换:报文日志 / 信号表格导出 CSV(默认命名
<源>_filtered_<时间戳>)、过滤后报文导出 ASC、ASC→BLF格式转换 - 工程保存/恢复:
.claproj工程文件保存/打开,一键恢复日志源 + DBC + 勾选信号与分析现场 - 最近文件 + 偏好持久化:log / dbc / project 三类最近文件(上限 10 条);窗口与界面偏好自动落盘
settings.json,重启自动恢复;双击.claproj直接打开 - 物理量 CSV → ASC:按 DBC factor/offset 反算原始字节打包 CAN 帧,支持 CRC8/CRC16 系列校验自动填充(或保留 CSV 原始值)
- 内置操作手册:应用右上角「使用手册」按钮随时查阅
- Node.js 18+(含 npm)
- 开发模式跨平台;打包发布面向 Windows(electron-builder,NSIS + Portable)
npm installnpm run devnpm run electron:devnpm testnpm run electron:build产物输出至 release/:
| 文件 | 说明 |
|---|---|
CAN Log Analyzer Pro Setup <版本>.exe |
NSIS 安装版(可自定义安装目录、创建桌面/开始菜单快捷方式) |
CAN Log Analyzer Pro-Portable-<版本>.exe |
便携版(单文件免安装) |
win-unpacked/ |
免打包目录,可直接运行 CAN Log Analyzer Pro.exe |
latest.yml |
electron-updater 自动更新元数据 |
发布说明:正式发布统一使用
package.json的build.directories.output(输出到release/),一条命令npm run build产出安装版、便携版与win-unpacked/。release/、backup/等目录已被.gitignore排除,不进入版本库。
应用右上角「使用手册」按钮内置了完整手册,以下为摘要。
- 加载日志:点击工具栏「加载 ASC」或「加载 BLF」,选择日志文件(普通 CAN / CAN FD 均可)。
- 加载 DBC:点击「加载 DBC」,选择对应的 DBC 数据库文件。
- 勾选信号:在左侧「DBC 结构与信号布局」面板展开消息,勾选需要分析的信号(支持消息级全选/单选)。
- 查看结果:右侧「信号解析」页签自动生成数值表格与曲线图,底部为位布局视图。
- 搜索:按消息名 / ID / 信号名检索(如
0x100或Speed);头部「清空」按钮一键清空搜索框。 - 消息列表:显示 ID(十六进制)、名称、发送/接收节点、DLC 字节数及信号数量。点击消息行展开/折叠信号列表;展开列表固定约 8 行可见,超出显示滚动条,避免长信号列表遮挡右侧布局。
- 信号行:
startBit|length@字节序 符号与 factor/offset 一览;勾选即选择该信号,行首色块与曲线颜色对应。 - 布局视图:按消息 DLC 动态渲染字节行(CAN FD 64 字节显示 B0–B63),色块标注各信号占用位,悬停显示信号名与位信息。
- 工具按钮:「全选信号 / 取消全选」「DBC 原文」(弹窗查看原始 DBC 内容)「重新加载」。
- 数值表格:时间戳 / 消息 ID / 各信号物理值;数据量大时自动抽样(可调整步长)。
- 曲线图:时间戳为横轴,支持缩放/平移、图例点击显隐曲线、Y 轴自适应。
- 字节视图:同步展示每个信号的原始字节与解码位(HEX),便于核对字节序与位偏移。
- 报文表:时间 / ID / 名称 / DLC / 数据 HEX,ID 颜色标注(未在 DBC 定义的 ID 为灰色)。
- 过滤:按 ID / 方向过滤,快速聚焦目标报文。
- 行内 DBC 解码:结合 DBC 实时解码已知信号为物理值列。
- 时间轴总览:表格下方为全局缩放条,拖拽平移、滚轮/双击缩放,「重置」恢复全览;视窗与「信号解析」页签共享。
- 导出 ASC:将当前报文列表写回 ASC 文件,实现数据裁剪/重组。
- 检索范围:消息名、信号名、CAN ID(十进制或
0x十六进制,如291/0x123)、DID 名(如F190命中DID_F190);可切换「全部视图」(报文帧 + DBC 结构)与「当前视图」(仅 DBC 结构)。 - 操作:
Ctrl+F唤起输入框、Esc清除;输入后右侧显示命中数(12 hits/无匹配);Enter自动切到「CAN 报文日志」页签并滚动到首个命中帧,命中 ID 的行以品牌红浅底高亮。 - 性能:索引在主进程按日志文件路径缓存并预热,1M 帧日志首响应 ≤300ms,日志不变不重建。
- 逐秒负载曲线:按比特时间估算每帧位长(标准帧
44+8×len、扩展帧64+8×len、CAN FD67+8×len),以自适应桶间隔(默认 ≤2000 点)聚合出逐秒负载率曲线;卡片显示平均负载 / 峰值负载(含峰值时刻)。顶部可切换比特率125k / 250k / 500k / 1M,切换即时重算。 - 周期与抖动:按消息 ID 统计帧数、实测平均/最小/最大周期与平均/最大抖动;参考周期优先取 DBC
GenMsgCycleTime,缺失时退化为实测均值;偏差超过max(参考周期 × 10%, 0.05ms)记为超差,展示超差次数与占比。可勾选「仅看超差」快速筛出周期不稳的报文;点击任意行会切回「CAN 报文日志」页签并定位到该 ID 的首帧,同时高亮该 ID。 - 错误帧与状态时间线:识别
ErrorFrame / OverloadFrame / Bus Off / Error Passive / Error Active / Chip State等记录,按 stuff / form / ack / crc / bit / bit1 / bit0 / overload / other 分类计数,并按时间绘制 Error Active / Warning / Passive / Bus Off 状态标记;点击错误条目或状态标记可跳转报文表对应时刻。- Vector
ErrorFrame Flags = … Code = … CodeExt = …编码位按 ECC 语义解码(0 Bit / 1 Form / 2 Stuff / 3 Other / 4 CRC / 5 Ack-Del / 7 Ack),CANoeCAN 1 Status:chip status <state>(error active / warning level / error passive / busoff)同样识别
- Vector
- 日志自带统计行(Statistic):
1.000000 1 Statistic: D 12 R 0 XD 1 XR 0 E 5 O 0 BusLoad 8.2 %被解析为声明计数,面板展示「日志声明: 错误帧 N / 过载帧 M」与日志自带 BusLoad(可与本机估算负载交叉校验);声明数与逐行解析数不一致时提示「错误计数以日志声明为准」(Vector 并不把每个错误帧都写成行) - 统计 CSV 导出:点「导出统计 CSV」把负载序列 / 周期抖动表 / 错误帧与状态明细三段写入一个 CSV(默认命名
<源>_stats_<时间戳>.csv)。
- 加载 CSV:首行表头,
t列时间戳(秒,可含小数),其余列名与 DBC 信号名一致(大小写不敏感)。 - 选择 CRC 算法:CRC8/CRC16 系列或 NONE(选择 NONE 保留 CSV 原始校验值)。
- 转换为 ASC:按 DBC factor/offset 反算原始字节 → 打包 CAN 帧(时间戳/通道/方向)→ 生成并自动载入 ASC。
- 保存工程:菜单「文件 → 保存工程(.claproj)」把当前工作现场(日志源路径 + DBC 路径 + 勾选信号/参数)写入工程文件;「打开工程」或双击
.claproj(文件关联)一键恢复现场。 - 最近文件:「文件 → 最近文件」子菜单列出最近打开过的日志 / DBC / 工程(三类合并,上限 10 条,去重置顶),点击直接打开。
- 偏好持久化:界面偏好(窗口尺寸、最近文件等)自动保存至系统用户数据目录
settings.json,下次启动自动恢复,无需手动配置。
- 报文日志 CSV:在「CAN 报文日志」页签过滤后点「导出为 CSV」,导出当前过滤结果,默认命名
<源>_filtered_<时间戳>.csv;大文件按 5000 行/块流式写盘,界面显示导出进度。 - 信号 CSV:在「信号解析」页签点「导出为 CSV」,导出时间戳 + 勾选信号物理值;枚举值导出为文本标签、缺失值留空、含逗号字符串自动加引号。
- BLF:日志或转换面板「导出 BLF」,将当前报文写为 BLF 二进制(默认命名
<源>_filtered_<时间戳>.blf)。 - 统计 CSV:在「总线统计」页签点「导出统计 CSV」,导出总线负载序列 + 周期抖动表 + 错误帧/状态明细(默认命名
<源>_stats_<时间戳>.csv)。 - ASC:报文列表「导出 ASC」可将过滤/裁剪后的数据写回 ASC 文本。
- 所有导出在完成/失败时均有提示,大文件导出过程可随时看到进度,不会假死界面。
- 解析错误徽章:加载含坏行/坏块的日志后,工具栏出现黄色警示徽章,点击打开错误报告抽屉,可「导出为 txt」。
- 空态提示:未加载日志 / 未勾选信号 / 无匹配数据时均有明确的空态说明,不再空白无反馈。
- 常用快捷键(原生菜单):
Ctrl+O打开 ASC、Ctrl+Shift+O打开 BLF、Ctrl+D加载 DBC、Ctrl+Shift+P打开工程、Ctrl+S保存工程、Ctrl+E导出 ASC、Ctrl+Shift+Delete清空所有数据、F1使用手册;CSV / BLF 导出与格式转换在对应页签/工具栏按钮执行,完整列表见菜单或内置手册。
- 日志位置:
userData/logs/app-YYYY-MM-DD.log(Windows:%APPDATA%/can-log-analyzer/logs/),按天滚动、跨天自动新建;保留 7 天,启动与跨天时清理更早的文件。 - 记录内容:应用启动(版本 / 平台 / Electron / Node)、日志与 DBC 加载(帧数、解析错误数、错误帧数)、加载失败原因、渲染进程崩溃与页面加载失败、主进程未捕获异常、退出;渲染进程的
window.onerror/unhandledrejection也会汇总到同一份日志。写入为异步追加,不阻塞界面。 - 打开方式:菜单「帮助 → 打开诊断日志」在文件管理器中定位当日日志;解析错误报告抽屉也有同名按钮。
- 一键复制诊断信息:解析错误报告抽屉的「一键复制诊断信息」把版本、平台、运行时、会话开始与运行时长、日志目录与当日日志路径、日志源与帧数、解析错误条数与 Top3 原因、总线错误帧与 Bus Off 计数复制到剪贴板,可直接粘贴进 Issue。内容脱敏:日志与复制文本都只含计数与错误原因,不含 CAN 报文数据内容。
- 曲线看不到? 点击图例曲线名显隐;常值曲线贴近 Y 轴,可先隐藏其他曲线后再查看。
- 数值与预期不符? 检查 DBC factor/offset(物理值 = raw × factor + offset)与字节序(Intel=小端 / Motorola=大端)。
- CAN FD 64 字节只显示 8 个字节? 确认 DBC 中该消息为
BO_ ID NAME: 64 SENDER(DLC=64),布局视图才会渲染 B0–B63。 - 数据量大卡顿? 表格与曲线自动抽样;减少勾选信号或增大抽样步长。
- 如何将 CSV 物理量转成报文? 「物理量 CSV」页签 → 加载 CSV → 选择 CRC → 转换为 ASC。
- 双击 exe 后进程一闪即退、没有窗口? 检查系统/终端是否设置了
ELECTRON_RUN_AS_NODE=1(该变量会让 Electron 以 Node 模式启动,任何 Electron 应用都会「即退无窗口」),清除后重新启动。
TestExample/ 目录包含可直接用于体验的样例:
| 目录 | 内容 |
|---|---|
canfd_rich/ |
CAN FD 丰富场景:vehicle_canfd.asc + vehicle_canfd.blf(30 帧,15 帧 64 字节 VCU 报文 + 15 帧 32 字节 BMS 报文)、vehicle_canfd.dbc(2 条消息 64 个信号,信号覆盖 B0–B63)、generate.js(数据生成脚本) |
error_frames/ |
错误帧 / 总线状态样例:error_frames.asc(100 数据帧 + 7 × ErrorFrame Flags/Code 编码位 + 文本 ErrorFrame + 过载帧 + Status:chip status 状态迁移 + Bus Off + 2 条 Statistic: 统计行)、generate.js(确定性生成,重复运行产出一致) |
| 其他目录 | 普通 CAN 的 ASC / BLF / DBC 样例 |
canfd_rich/generate.js演示了如何调用electron/asc.js、electron/blf.js、electron/dbc.js生成日志并解码验证,可作为二次开发参考。
├── electron/ # Electron 主进程
│ ├── main.js # 窗口、应用菜单、IPC、文件对话框
│ ├── preload.js # 安全桥接 API(contextBridge)
│ ├── asc.js # ASC 解析 / 生成(错误帧、总线状态、Statistic 统计行)
│ ├── blf.js # BLF 解析 / 生成
│ ├── dbc.js # DBC 解析 / 信号编码解码
│ ├── busStats.js # 总线负载 / 周期抖动 / 错误帧统计(R12)
│ ├── diagLog.js # 按天滚动诊断日志(7 天清理、脱敏,R14)
│ └── __tests__/ # 后端单元测试
├── src/ # React 渲染进程
│ ├── App.jsx # 主界面布局、工具栏、页签管理
│ ├── index.css
│ └── components/
│ ├── DBCPanel.jsx # DBC 结构 / 信号选择 / 位布局
│ ├── SignalLayoutView.jsx # 字节位布局图
│ ├── SignalParsePanel.jsx # 信号解析(表格 + 曲线)
│ ├── SignalTable.jsx # 信号数值表格
│ ├── SignalChart.jsx # 曲线图(Recharts)
│ ├── MessageTable.jsx # CAN 报文日志 + 导出 ASC
│ ├── StatsPanel.jsx # 总线负载 / 周期抖动 / 错误帧统计(R12)
│ ├── ExportPanel.jsx # ASC→BLF 等导出
│ ├── CSVPanel.jsx # 物理量 CSV → ASC(含 CRC)
│ ├── HelpModal.jsx # 内置使用手册弹窗
│ └── __tests__/ # 组件单元测试
├── public/ # 静态资源(logo 等)
├── TestExample/ # 示例日志 / DBC / 生成脚本
├── scripts/ # 工程脚本:compare-all.js(cantools 对拍入口)
├── requirements.txt # 对拍环境(cantools==43.0.2 + python-can)
├── package.json # 构建配置(build.directories.output 指向 release/)
├── vite.config.js
└── vitest.config.js
npm test覆盖范围:
electron/__tests__/:ASC / BLF 解析与生成、DBC 解析(BA_ 属性 / 扩展帧标志位 / mux / SIG_VALTYPE_ 浮点)、信号解码(含 CAN FD 64 字节丰富场景)、Motorola 位序回归矩阵(start≡7 专项 + 生成 ≥60 布局交叉验证,锯齿语义)、解析容错(坏行/坏块跳过并报告)、R2 分块与一次性解码双路径收敛(随机 20000 帧 × 4 种 chunk 尺寸,位级一致)src/components/__tests__/:DBC 面板(搜索/清空/滚动、周期/Ext/mux 徽标)、信号表格(浮点 6 位有效数字)、曲线图、布局视图、报文表(扩展帧匹配)、使用手册弹窗、解析错误报告 UI、工程保存/恢复与最近文件(R5)、CSV 导出(R7)、全局搜索(R11)、总线统计面板(R12,含 Vector 统计行与 ErrorFrame 编码位)、诊断日志与错误上报(R14)- 全量 329/329 通过(24 个测试文件);另有
TestExample/*/generate.js样例自校验与compare.js(cantools 对拍,见下节)
解码正确性以 cantools 43.0.2 为参照,环境已固化在 requirements.txt:
# 1) 准备对拍环境(版本必须与验收基线一致)
python -m venv .venv
.\.venv\Scripts\activate # Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt # cantools==43.0.2 + python-can
# 2) 跑对拍(普通模式:无环境时跳过并显著提示)
npm run compare
# 3) 严格模式(CI / 验收用):无环境直接非零退出,禁止静默假绿
npm run compare -- --strict
npm run compare:strict| 模式 | cantools 缺失 | cantools 可用但 DBC 加载失败 | 解码不一致 |
|---|---|---|---|
| 普通 | 跳过 + NOT executed 显著提示,exit 0 |
exit 3 | exit 1 |
严格(--strict / CI=1 / CANTOOLS_STRICT=1) |
exit 4(失败) | exit 3 | exit 1 |
scripts/compare-all.js 会遍历 TestExample/**/compare.js 并汇总结果;.github/workflows/verify.yml 在 push/PR 时执行 npm test + 严格模式对拍。
MIT License。详情见 LICENSE。
