Canmetry
打开工作台

用 DBC 检查工具 查出文件里的错误

拖入一个 CAN DBC,在它发出去之前看看哪里有问题:信号重叠、ID 重复、信号超出帧长度、值表有误。每个发现都带行号和修改办法。

把 DBC 文件拖到这里

或

支持最大 150 MiB 的 .dbc 文件,只在你的电脑上读取,不会上传。

DBC 检查工具检查什么

六组共 32 项检查。每一项都会指出对象、行号和修改办法。

  • 结构

    8

    ID、名字、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 ECU

    W006 Wide 的 ID 是 0x1000,但没有标成扩展帧。

    第 58 行

什么时候该用 DBC 检查工具

检查只要一秒,DBC 每次换手的时候都值得跑一遍。

  1. 把 DBC 发出去之前

    供应商或客户会用你控制不了的工具打开它。先把他们会踩的坑找出来。

  2. 作为发布前的关卡

    每个新版本都跑一遍,错误数为零才让 DBC 进入构建。

  3. 接手一份 DBC 的时候

    没有历史记录的文件经过很多人的手。报告会告诉你哪里被误改过。

  4. 解码出来的值看着不对的时候

    先别怪日志,先排除 DBC:信号重叠或字节序填反,能解释大部分奇怪的值。

它不做什么

它对照的是 DBC 格式,而不是你的项目。

它检查

  • 文件里的每个 ID、名字和 DLC
  • 每个信号的位布局
  • 值表、节点、注释和属性
  • 名字和文本编码

留给你自己

  • 属于你的项目或主机厂的命名规则和信号约定。
  • 网络设计:总线负载、周期和时序。
  • 修改文件。发现会告诉你行号和修法,改 DBC 要你自己动手。
  • 使用扩展复用的报文:这类报文里不判断信号重叠。
  • 完全读不出来的内容,除了报告「这一行没读到」之外不做更多。

DBC 检查工具常见问题

信号重叠一定是错误吗?

不一定。多路复用的信号只要开关值不同,就可以共用位,因为同一时刻只会有其中一个出现。检查工具只在复用信号的开关值相同时才比较它们,使用扩展复用的报文则整体跳过。

为什么我的 DBC 在这个工具能加载,在另一个工具里不行?

各个工具的严格程度不一样。cantools 默认在信号重叠时会报错,有些解码器会拒绝重复 ID,DBC 查看器背后的解析器会丢掉读不懂的行。检查工具会把这几种情况分别报出来,你就能知道是哪一种。

它会替我改文件吗?

不会。每个发现都会指出行号和修法,修改要你在自己的编辑器里做。这个页面不提供自动修复。

我的 DBC 会被上传吗?

不会。文件在浏览器里读取和检查,不会离开你的电脑。

支持 CAN FD 和 GBK 编码的文件吗?

支持。DLC 最大可到 64 字节,GBK 和 GB18030 编码的文件会先被识别并解码,再做检查。

范围写成 [0|0] 是什么意思?

在 DBC 里它表示没有设置范围,所以检查工具不会拿它去和位数能表示的范围比较。

这和 DBC 查看器有什么区别?

查看器展示的是解析器读懂了什么。检查工具读的是原始文件,报告解析器哪里读错了或者悄悄丢掉了什么,并带行号。

能放进构建流水线里跑吗?

暂时不能,这个页面在浏览器里运行。如果想放进流水线,用 strict 模式的 cantools 可以抓到信号重叠和放不下的错误。