Daybreak 与 HighNoon:105 条报文与 493 条信号

作者:

在

结论:太阳能车队两代车的 CAN 定义是 7 份按功能域切开的 DBC,而非一份整车文件。Daybreak 三份合计 23 条报文、58 条信号,HighNoon 四份合计 82 条报文、435 条信号。决定复用方式的不是总量,而是信号密度:bps.dbc 平均每条报文只挂 1.47 条信号,LightingCAN.dbc 则高达 9.50 条。

七份 DBC 的目录划分与规模落差

归档保留了 7 份字节互不相同的 DBC,分别位于上游 can/dbc/Daybreak/ 与 can/dbc/HighNoon/ 两个目录,并随附上游 docs/README.md 与顶层 MIT LICENSE。目录结构本身就是第一条信息:两代车并不共用一份网络定义,而是各自维护一整套,跨代之间没有版本继承关系。

按单文件看落差极大。最小的两份是 Daybreak/contactor.dbc 与 HighNoon/SteeringCAN.dbc,各只有 2 条报文;最大的 HighNoon/CarCAN.dbc 有 55 条报文、305 条信号,单份就占全部 105 条报文的一半以上、全部 493 条信号的 61.9%。把它当「车队 CAN 数据集」整体引用会严重失真——重心几乎全在一份文件上。

文件 所属代次 报文数 信号数 平均信号 / 报文
can/dbc/Daybreak/bps.dbc Daybreak 15 22 1.47
can/dbc/Daybreak/contactor.dbc Daybreak 2 11 5.50
can/dbc/Daybreak/controls.dbc Daybreak 6 25 4.17
can/dbc/HighNoon/CarCAN.dbc HighNoon 55 305 5.55
can/dbc/HighNoon/BPSCAN.dbc HighNoon 19 63 3.32
can/dbc/HighNoon/LightingCAN.dbc HighNoon 6 57 9.50
can/dbc/HighNoon/SteeringCAN.dbc HighNoon 2 10 5.00

两代车的量级对比

Daybreak 侧三份共 23 条报文、58 条信号;HighNoon 侧四份共 82 条报文、435 条信号。后者的报文数约为前者的 3.6 倍,信号数约为 7.5 倍。也就是说,代次更替不只是加了几个节点,而是单位报文承载的信号量整体翻了一倍(2.52 对 5.30)。

代次 保留文件数 报文合计 信号合计 功能域
Daybreak 3 23 58 电池包(BPS)、接触器、整车控制
HighNoon 4 82 435 整车(CarCAN)、电池(BPSCAN)、灯光、转向
合计 7 105 493 七份文件,互不覆盖

信号密度决定了每份 DBC 的读法

把信号数除以报文数得到的密度,是这几份文件里最实用的判据。它不需要打开文件就能告诉你:这份定义主要承载的是离散状态位,还是打包好的连续测量量。密度小于 2 的文件基本是「一条报文一个状态」,读数容易但信息量有限;密度大于 9 的文件则几乎必然是位域打包,必须逐位拆解才能用。

密度档位 平均信号 / 报文 落在档位内的文件 典型形态 使用建议
稀疏(小于 2) 1.47 Daybreak/bps.dbc 单条报文只承载少量状态或告警位 逐位确认含义,不宜当作连续测量量使用
中等(3 到 6) 3.32、4.17、5.00、5.50、5.55 HighNoon/BPSCAN.dbc、Daybreak/controls.dbc、HighNoon/SteeringCAN.dbc、Daybreak/contactor.dbc、HighNoon/CarCAN.dbc 状态位与测量量混合 先抓运行日志看取值分布,再定缩放与偏移
密集(大于 9) 9.50 HighNoon/LightingCAN.dbc 位域打包大量开关与枚举 按位拆解,逐位与实车现象对齐

需要强调一点:密度是归档方统计出的 BO_ 与 SG_ 行数之比,它反映的是文件的组织方式,不代表信号已被验证。归档说明写得很清楚——具体车辆修订版本、组件固件与信号准确性均未独立核验。

另一个不该忽略的落差在命名口径上。Daybreak 这一侧按功能块命名(bps、contactor、controls),HighNoon 这一侧则按物理总线命名(CarCAN、BPSCAN、LightingCAN、SteeringCAN)。两套口径不同,意味着不能靠文件名去推断两代车信号的对应关系,跨代比对只能落到逐信号的位与缩放上。

被拦下的文件与权利边界

这一批有五类文件没有进入归档,理由分两种,处理方式也不同。区分清楚很重要,因为「内容为空」与「权利未定」在工程上的后果完全不一样:前者是这份定义本来就没有可用信息,后者是信息可能存在但你不能用。

对象 拦下理由 性质 处理动作
HighNoon/DAqCAN.dbc 不含任何报文与信号定义 内容为空 不收录
Prohelion 组件文件 待原始厂商数据权利审查 权利未定 暂缓收录
TPEE MPPT 组件文件 待原始厂商数据权利审查 权利未定 暂缓收录
Elcon 组件文件 待原始厂商数据权利审查 权利未定 暂缓收录
电机控制器组件文件 待原始厂商数据权利审查 权利未定 暂缓收录

DAqCAN.dbc 值得单独记录:DAQ 这样的名字很容易让人以为它提供采集通道的完整定义,实际上归档时它是空文件。此外,保留下来的 CarCAN.dbc 是一份聚合文件,其中引用了 BPS、MPPT 等组件的信号,但这些信号的原始来源并未独立确认。

校验值与去重:怎样确认拿到的是同一份文件

归档为每份 DBC 都登记了 Git blob 与 SHA-256,快照修订为 04d2b3286f50d8f4119d4dc11b7344140f449d15。两者用途不同:Git blob 用于在仓库内部定位文件版本,SHA-256 用于在仓库之外确认取到的字节是否一致。做二次分发或长期存档时,两个值都该留。

文件 Git blob SHA-256
Daybreak/bps.dbc 27f2385d0e3d316841e73db2b51631cdaad25637 b84a9d61eb276587241b39d24792c6cb1c42eb3b6efaad3ecfa727d279f8de32
Daybreak/contactor.dbc 11745daca9b071eb933a59471ed630c79510eaaf 58ae79db80cb0d20e3dd2b585231b72f8a50bf41800fdd0d0f1878200a134672
Daybreak/controls.dbc db2678346ce5e7ded982f56ecfa1971a87cfc96d 5484aa7a1ea8e4cc3925d5e714d5f37e58bd022569a4a106fa28ce5d1e06ae32
HighNoon/CarCAN.dbc 175bc244c2a250857d393a27db6ffff1451bb906 fdd068b71ee3c891e3733d716c8ab4b8df211187892f5ed351dfe4f6f3076fbd
HighNoon/BPSCAN.dbc 56048d7c6f5d0fad5c655be31f00af5516717a6c 4619aa34e75767a5e05557fa092fa883f90045147cb5e875ac352e7d9f95031f
HighNoon/LightingCAN.dbc bcae89e10bf3dcb9088465061ceaf4eefcfac5de 0a5fdefcc7f4bdbe5fa23161b544561704600e0fb7675360551381872d2d06ed
HighNoon/SteeringCAN.dbc a6548a3e1ea4e5ba12af333e622be03efd10f121 64e87d4458729fed6b3d9e8866e26d95d20d113be29dc117fe57fd449e37f6cb

比对时还有一个容易踩的坑:同一份逻辑文件在不同检出环境下可能呈现 CRLF 与 LF 两种字节序,直接按字节比较会把同一份文件误判成两份。归档方在其他项目上正是用 CRLF 归一化来识别重复的,这里同样应当先归一化再比对。

工程侧:MCU 端口移植的四项硬要求

随附的上游文档描述的是一套面向定制 STM32 PCB 的共享嵌入式代码仓库,本身不是 CAN 数据集。它与 DBC 的关联在于:DBC 里定义的报文最终由这些 MCU 上的固件收发,端口是否移植完整,直接决定某条报文在车上有没有对应的实现。

顶层 Makefile 编译 STM32 所需的全部文件,但设计上不打算被直接调用,而应由另一个 Makefile 调用。测试统一放在 test/ 目录,测试文件以 _test.c 结尾,命令形如 make TEST=blinky PROJECT_TARGET=stm32g473xx,烧录用 make flash。CI 侧提供 makeAllTests.py,支持 -v、-t TESTS、-p PORTS、-h 四个选项,默认对所有端口编译全部测试。

一个合法端口必须齐备的四样东西

要素 命名规则 文档给出的示例
端口目录 位于 stm/stm32f4xx、stm/stm32l4xx 或 stm/stm32g4xx 之下,用 MCU 通用名命名 stm32f413、stm32l431
链接脚本 形如 STM32*_FLASH.ld,须包含处理器全名 STM32F413RHTx_FLASH.ld、STM32L431CBTx_FLASH.ld
启动汇编 startup_stm32 加四位系列与线别再加 xx,含向量表与基础异常处理(最关键的是 Reset_Handler) startup_stm32f413xx.s
配置文件 以精确 MCU 名命名,空格分隔列出要禁用的 BSP 模块 stm32l432kcu.cfg,内容 BSP_DISABLE=CAN UART ADC

文档特别提醒:请核对 MCU 上实际存在的外设再填写 BSP_DISABLE,否则会遇到奇怪的构建错误。对 CAN 相关项目来说这条尤其重要——如果误把 CAN 写进禁用列表,DBC 里定义得再完整,固件侧也发不出对应的帧。

常见问题

两代车的 DBC 能不能按文件名直接对齐?

不能。Daybreak 侧的命名偏功能块(bps、contactor、controls),HighNoon 侧则偏物理总线(CarCAN、BPSCAN、LightingCAN、SteeringCAN),两套命名口径不同。加上 CarCAN.dbc 是聚合文件,其中引用的 BPS、MPPT 等组件信号的原始来源并未独立确认,跨代只能逐信号比对位与缩放,不能靠文件名推导。

为什么 bps.dbc 有 15 条报文却只有 22 条信号?

它平均每条报文只挂 1.47 条信号,是 7 份文件里最稀疏的一份。这种密度通常意味着报文主要承载状态或告警位,而不是连续测量量。在拿它做趋势分析之前,需要逐条确认每个位的含义与有效性,不能假定它自带完整的物理量定义。

DAqCAN.dbc 与四类组件文件为什么没被收录?

理由不同。DAqCAN.dbc 在归档时不含任何报文与信号定义,属于内容为空,因此不收录;Prohelion、TPEE MPPT、Elcon 与电机控制器这四类组件文件,则是因为原始厂商数据权利尚待审查而暂缓收录,属于权利未定。前者没有可用信息,后者可能有但你不能用。

CarCAN.dbc 有 305 条信号,能当作整车信号全集吗?

不能。归档说明指出它是聚合文件,引用了 BPS、MPPT 等组件的信号,而这些信号的原始来源未经独立确认;同时归档方明确写明,车辆修订版本、组件固件与信号准确性均未核验。它适合作为总线结构的索引,不能直接当作已验证的信号全集使用。

这些 DBC 对应的 MCU 端口移植要准备什么?

四样东西:一是在 stm/stm32f4xx、stm/stm32l4xx 或 stm/stm32g4xx 下以 MCU 通用名建立端口目录;二是形如 STM32*_FLASH.ld 且含处理器全名的链接脚本;三是 startup_stm32 加四位系列名加 xx 的启动汇编,内含向量表与 Reset_Handler;四是以精确 MCU 名命名的配置文件,用空格分隔列出要禁用的 BSP 模块,例如 BSP_DISABLE=CAN UART ADC。

延伸阅读

参考资料

  • 项目 01 —— public-can-dbc-datasets/additional/lhr-solar-daybreak-highnoon/SOURCE.md(7 份字节互异 DBC 的目录归属、逐文件报文与信号数、各文件 Git blob 与 SHA-256、DAqCAN.dbc 为空故不收录、四类组件文件待厂商数据权利审查、CarCAN.dbc 为聚合文件且信号来源未独立确认、车辆修订与固件未核验的说明)
  • 项目 01 —— public-can-dbc-datasets/additional/lhr-solar-daybreak-highnoon/README.md(顶层 Makefile 需由另一 Makefile 调用、test 目录与 _test.c 命名约定、make TEST 与 PROJECT_TARGET 用法、make flash、makeAllTests.py 的四个 CI 选项、STM32 端口四要素与 BSP_DISABLE 配置格式)

免责声明

本文所述报文数、信号数与文件路径均来自公开开源仓库的说明文档,属第三方逆向工程与团队自建产物,未经独立实车核验,也不代表车辆制造商的官方数据。不同车辆修订版本、组件固件与市场可能存在差异。涉及安全相关用途时请仅作参考,并以实际测量与官方资料为准。

更新记录

  • 2026-10-14 初稿

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注