用 DBC 检查工具 查出文件里的错误
拖入一个 CAN DBC,在它发出去之前看看哪里有问题:信号重叠、ID 重复、信号超出帧长度、值表有误。每个发现都带行号和修改办法。
把 DBC 文件拖到这里
或支持最大 150 MiB 的 .dbc 文件,只在你的电脑上读取,不会上传。
DBC 检查工具检查什么
六组共 32 项检查。每一项都会指出对象、行号和修改办法。
结构
8ID、名字、DLC,以及查看器的解析器悄悄丢掉的内容。
E001E002E003E004E005W006E007I053信号布局
12每个信号的起始位、长度、重叠、多路复用和换算。
E010E011E012E013E014E015E016W016I017W018W019I054值表
3指向不存在对象、取值重复或者装不下的值表。
W020W021W022节点
4没有列进节点列表的发送和接收节点。
W030W031I032I033注释和属性
2挂在不存在对象上的注释和属性。
W040I041名字和编码
3严格的工具会拒绝的名字,以及按错误编码读出来的文字。
W050I051W052
- 错误
- 警告
- 提示
DBC 检查工具怎么给发现分级
分三级,评审时可以只看最要紧的那一级。
错误
文件会解出错误的值、在不同工具里加载结果不同,或者读取时丢失数据。把 DBC 发出去之前先修掉。
两个信号占用了同样的位。
警告
大概率是笔误或有歧义。不同工具的处理可能不一致,所以同一个值可能在这个工具里对、在那个工具里错。
值表指向了一个不存在的信号。
提示
整理性的提示。可以忽略,评审时有参考价值。
一个既不发送也不接收的节点。
DBC 检查工具能在数值出错之前抓到的错误
这几种在至少一种工具里都能毫无怨言地加载。右边就是这个页面给出的发现。
两个信号占着同样的位
SG_ Speed : 0|16@1+ ... SG_ Gear : 8|8@1+ ...
E012 Engine 里的 Speed 和 Gear 共用了 8 位。
第 275 行信号超出了帧的末尾
BO_ 416 Engine: 8 ECU SG_ Temp : 56|16@1+ ...
E011 Engine 里的 Temp 需要 9 个字节,但报文只有 8 个字节。
第 12 行解析器藏起来的重名
SG_ Speed : 0|16@1+ ... SG_ Speed : 16|8@1+ ...
E004 Engine 里有两个信号都叫 Speed。
第 31 行指向不存在信号的值表
VAL_ 416 Gear 0 "Park" 1 "Drive" ;W020 有一张值表指向 Engine.Gear,但它并不存在。
第 640 行没有扩展帧标志的扩展 ID
BO_ 4096 Wide: 8 ECUW006 Wide 的 ID 是 0x1000,但没有标成扩展帧。
第 58 行
什么时候该用 DBC 检查工具
检查只要一秒,DBC 每次换手的时候都值得跑一遍。
把 DBC 发出去之前
供应商或客户会用你控制不了的工具打开它。先把他们会踩的坑找出来。
作为发布前的关卡
每个新版本都跑一遍,错误数为零才让 DBC 进入构建。
接手一份 DBC 的时候
没有历史记录的文件经过很多人的手。报告会告诉你哪里被误改过。
解码出来的值看着不对的时候
先别怪日志,先排除 DBC:信号重叠或字节序填反,能解释大部分奇怪的值。
它不做什么
它对照的是 DBC 格式,而不是你的项目。
它检查
- 文件里的每个 ID、名字和 DLC
- 每个信号的位布局
- 值表、节点、注释和属性
- 名字和文本编码
留给你自己
- 属于你的项目或主机厂的命名规则和信号约定。
- 网络设计:总线负载、周期和时序。
- 修改文件。发现会告诉你行号和修法,改 DBC 要你自己动手。
- 使用扩展复用的报文:这类报文里不判断信号重叠。
- 完全读不出来的内容,除了报告「这一行没读到」之外不做更多。
DBC 检查工具常见问题
信号重叠一定是错误吗?
不一定。多路复用的信号只要开关值不同,就可以共用位,因为同一时刻只会有其中一个出现。检查工具只在复用信号的开关值相同时才比较它们,使用扩展复用的报文则整体跳过。
为什么我的 DBC 在这个工具能加载,在另一个工具里不行?
各个工具的严格程度不一样。cantools 默认在信号重叠时会报错,有些解码器会拒绝重复 ID,DBC 查看器背后的解析器会丢掉读不懂的行。检查工具会把这几种情况分别报出来,你就能知道是哪一种。
它会替我改文件吗?
不会。每个发现都会指出行号和修法,修改要你在自己的编辑器里做。这个页面不提供自动修复。
我的 DBC 会被上传吗?
不会。文件在浏览器里读取和检查,不会离开你的电脑。
支持 CAN FD 和 GBK 编码的文件吗?
支持。DLC 最大可到 64 字节,GBK 和 GB18030 编码的文件会先被识别并解码,再做检查。
范围写成 [0|0] 是什么意思?
在 DBC 里它表示没有设置范围,所以检查工具不会拿它去和位数能表示的范围比较。
这和 DBC 查看器有什么区别?
查看器展示的是解析器读懂了什么。检查工具读的是原始文件,报告解析器哪里读错了或者悄悄丢掉了什么,并带行号。
能放进构建流水线里跑吗?
暂时不能,这个页面在浏览器里运行。如果想放进流水线,用 strict 模式的 cantools 可以抓到信号重叠和放不下的错误。
更多免费工具
做完这一步之后常见的下一步,每个都有独立页面。