Canmetry
打开工作台

DBC 对比:找出影响解码的改动

DBC 对比会列出两版 DBC 文件之间改动的报文和信号,旧值在上、新值在下。

单个文件最大 150 MB · 支持 UTF-8、GBK、GB18030 · 只在浏览器内读取

旧版把旧版 .dbc 拖到这里
新版把新版 .dbc 拖到这里

两侧各放一份 .dbc,放齐后自动开始对比。

什么时候需要比较 DBC 文件

DBC 是总线上各个 ECU 之间的约定。约定一换手,就该做一次 DBC 对比。

  • 供应商发来新版本

    文件只换了版本号,没有变更说明。在合入集成分支之前,先看清每一个变动过的报文和信号。

  • 日志解出来不对了

    更新 DBC 之后,某个信号读数翻了一倍。先筛选「解码解释」,依次检查系数、偏移、起始位和字节序。

  • 变更需要评审

    把 Markdown 摘要贴进工单或合并请求,评审人看到的是带行号的字段级改动,而不是一大段文本 diff。

  • 两个车型或两个分支

    对比两个车型配置的 DBC,在共用测试脚本或解码配置之前,先确认哪些 ID、DLC 和周期不一样。

DBC 对比逐个字段检查什么

每一行列出对比读取的 DBC 语句、比较的字段,以及改动会被标成哪一类影响。

对象语句比较的字段标签
报文身份BO_帧类型(标准帧或扩展帧,第 31 位)加仲裁 ID 作为匹配键。同一 ID 换了名字记为改名。描述信息
报文属性BO_ · BA_DLC、发送节点、GenMsgCycleTime、VFrameFormat时序约定
新增或删除BO_ · SG_整条报文,以及已匹配报文中的信号覆盖范围
信号布局SG_ · SIG_VALTYPE_起始位、长度、字节序(@0 Motorola、@1 Intel)、有无符号、IEEE 浮点类型、多路复用(M、mN)解码解释
换算SG_系数和偏移按数值比较,0.10 与 0.1 视为相同解码解释
范围与单位SG_声明的最小值、最大值;单位文本时序约定 · 描述信息
值表VAL_每个取值及其标签,按原始数值匹配,与行序无关描述信息
注释与接收节点CM_ · SG_报文和信号的注释;接收节点按集合比较描述信息
属性BA_报文和信号的属性值,按属性名匹配描述信息
不比较SG_MUL_VAL_ · …扩展多路复用,以及解析器不保留的语句。它们会按行号列出,结果标为部分比较。部分比较

按字段做 DBC diff,而不是按行

对两个 DBC 文件做普通文本 diff,每一行移动都会被标出来。DBC 对比把两份文件解析成报文和信号,逐个字段比较:整块挪位、空格变化、语句换序都不算改动,一个系数的变化也不会淹没在满屏的红绿里。

普通文本 diff12 行改动
字段对比1 处改动

示意文件:挪动了一个报文块,改了一行的空格,改了一个系数。

DBC 文件比较如何匹配报文和信号

报文按帧类型和仲裁 ID 配对。信号在已配对的报文里按名称配对。没有把握的只列为候选。

  1. 帧类型和仲裁 ID 都相同,就是同一条报文,即使名称变了。

  2. ID 相同只改名称,会报告为改名。仅凭名称相同,不会把不同 ID 合并成同一条报文。

  3. 在已配对的报文里,信号按名称匹配。布局相同但名称不同,只作为候选。

  4. 重复的 ID 或名称不会强行配对。两侧都保留,并标出源行。

部分比较是什么意思

有内容没有比较:解析缺口、重复定义,或本页不解释的语法。这种结果不会写成两份文件相同。

技术细节

DBC 对比怎样处理你的文件,以及它不做什么。

文件大小
单个文件最大 150 MB,两份文件都读入当前标签页的内存。
编码
逐个文件识别 UTF-8、GBK 和 GB18030,中文注释和值表标签按文本比较。
匹配方式
报文按帧类型和仲裁 ID 配对,信号在报文内按名称配对。行号从 1 开始,取自各自的原始文件。
ID
同时显示十六进制和十进制。显示时去掉扩展帧标志位(第 31 位);标准帧 0x123 和扩展帧 0x123 仍是两条不同的报文。
导出
CSV 每条改动、警告和候选各占一行;Markdown 摘要可直接贴进工单。两者都带两个文件名、对比时间和覆盖状态。
隐私
不上传、不需要账号、不保存。关闭标签页即清空两份文件。
键盘
J、K 或上下方向键切换到下一条、上一条报文。
不做的事
编辑或合并 DBC、ARXML 和 LDF 文件、用任一文件重新解码日志。

DBC 对比常见问题

会上传文件吗?

不会。DBC 对比在你的浏览器里读取两份文件,不会上传。

为什么文本 diff 会骗人?

排序、空白和注释会改变文本,却不改变解码用到的字段。两份文件可以逐行看起来差很多,解码却一样;也可以看起来差不多,系数已经变了。

什么时候改名不算已确认?

布局相同、信号名不同,只是候选。不会当成已确认的匹配,所以新增和删除都留在结果里。

部分比较是什么意思?

有内容没有比较。即使已比较的部分没有改动,页面也不会说两份文件相同。

系数变了,能不能证明日志里的值变了?

不能。它只说明同一个原始值可能解出不同的物理值。这个页面不会拿日志重新解码。

标准帧和扩展帧用了同一个 11 位数字,是同一条报文吗?

不是。标准帧和扩展帧即使低 11 位相同,也是不同的报文,不会配成一对。

为什么有的信号是灰色的?

它们没有改动。留在表里是为了让整条报文和它的位布局能一眼看全。取消勾选「未改动的信号」即可隐藏。

文件最大能多大?

每个最大 150 MB。大多数量产 DBC 都在 5 MB 以内。对比在当前标签页里进行,特别大的一对文件可能需要几秒。