DBC 对比:找出影响解码的改动
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 对比把两份文件解析成报文和信号,逐个字段比较:整块挪位、空格变化、语句换序都不算改动,一个系数的变化也不会淹没在满屏的红绿里。
示意文件:挪动了一个报文块,改了一行的空格,改了一个系数。
DBC 文件比较如何匹配报文和信号
报文按帧类型和仲裁 ID 配对。信号在已配对的报文里按名称配对。没有把握的只列为候选。
帧类型和仲裁 ID 都相同,就是同一条报文,即使名称变了。
ID 相同只改名称,会报告为改名。仅凭名称相同,不会把不同 ID 合并成同一条报文。
在已配对的报文里,信号按名称匹配。布局相同但名称不同,只作为候选。
重复的 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 以内。对比在当前标签页里进行,特别大的一对文件可能需要几秒。
更多免费工具
做完这一步之后常见的下一步,每个都有独立页面。