记录DBC制作的基础流程及注意点
1、DBC结构介绍
| 项 | 说明 | 举例 |
| Networks(最顶层) | 代表一整套 CAN 网络,一个 dbc 文件对应一个 Network | |
| ECUs | 是设备对象,可以理解为硬件产品,Network nodes是这个 ECU 在总线上的通信节点身份。一个 ECU 硬件,对应一个 Network Node。 | |
| Network nodes(网络节点) | CAN 总线上的通信端点,谁来发报文、谁收报文。 | 例:VCU、BMS、MCU,每一个都是 Node; |
| Messages(报文 / CAN 帧) | 总线传输的一整帧数据包(CAN 标准帧最大 8 字节,CAN FD 最多 64 字节)。
| 例如: ID=0x123 报文,8 字节数据,里面同时放:电机转速、电机温度、故障状态多个信号。 |
| Signals | DBC 里最小数据单元,是 Message 内部的一段 bit 数据,代表一个物理量。
| 例子:报文第 0~15bit,定义为MotorSpeed,因子 0.1,单位 rpm。 抓到原始值 1500 → 物理转速 = 150 rpm |
2、信号信息(以这两条报文为例)
报文 1:VCU→ECU 扭矩指令报文VCU2ECU_TorqCmd
| 项目 | 参数 |
|---|---|
| 报文名称 | VCU2ECU_TorqCmd |
| CAN-ID | 0x120(标准帧) |
| DLC | 8 |
| 发送节点 (Transmitter) | VCU |
| 接收节点 (Receiver) | ECU |
| 发送类型 | Cyclic 周期 100ms |
报文内信号清单
| 信号名 | 位长 | 起始 Bit | 字节序 | 符号 | Factor | Offset | 单位 | 物理范围 | 说明 |
|---|---|---|---|---|---|---|---|---|---|
| Torque_Cmd | 16 | 0 | Motorola | Signed | 0.1 | 0 | N·m | -200~200 | 目标扭矩指令 |
| Torque_Limit_Max | 16 | 16 | Motorola | Unsigned | 0.1 | 0 | N·m | 0~250 | 最大扭矩限制 |
| Motor_Enable | 2 | 32 | Motorola | Unsigned | 1 | 0 | - | 0~3 | 0: 禁止 1: 使能 2: 故障停机 |
| Reserve1 | 6 | 34 | Motorola | Unsigned | 1 | 0 | - | 0~63 | 保留位,预留扩展 |
| Drive_Mode | 4 | 40 | Motorola | Unsigned | 1 | 0 | - | 0~15 | 0: 经济 1: 动力 2: 蠕行 |
| Reserve2 | 4 | 44 | Motorola | Unsigned | 1 | 0 | - | 0~15 | 保留 |
| Reserve3 | 16 | 48 | Motorola | Unsigned | 1 | 0 | - | 0~65535 | 保留 |
报文 2:ECU→VCU 电机状态反馈报文ECU2VCU_MotorState
| 项目 | 参数 |
|---|---|
| 报文名称 | ECU2VCU_MotorState |
| CAN-ID | 0x121(标准帧) |
| DLC | 8 |
| 发送节点 (Transmitter) | ECU |
| 接收节点 (Receiver) | VCU |
| 发送类型 | Cyclic 周期 100ms |
VCU2ECU_TorqCmd(
| 信号名 | 位长 | 起始 Bit | 字节序 | 符号 | Factor | Offset | 单位 | 物理范围 | 说明 |
|---|---|---|---|---|---|---|---|---|---|
| Motor_Speed | 16 | 0 | Motorola | Signed | 1 | 0 | rpm | -8000~8000 | 电机实际转速 |
| Motor_Torque_Feedback | 16 | 16 | Motorola | Signed | 0.1 | 0 | N·m | -200~200 | 实际输出扭矩 |
| Motor_Temp | 8 | 32 | Motorola | Unsigned | 1 | 0 | ℃ | 0~250 | 电机定子温度 |
| Inverter_Temp | 8 | 40 | Motorola | Unsigned | 1 | 0 | ℃ | 0~250 | 逆变器温度 |
| Motor_Fault_Code | 8 | 48 | Motorola | Unsigned | 1 | 0 | - | 0~255 | 故障码,0 = 无故障 |
| Motor_Status | 4 | 56 | Motorola | Unsigned | 1 | 0 | - | 0~15 | 0: 待机,1: 运行,2: 故障,3: 停机 |
| Reserve | 4 | 60 | Motorola | Unsigned | 1 | 0 | - | 0~15 | 保留位 |
约定:Motorola 大端(汽车行业 DBC 默认)
3、DBC制作流程
(1)新建空白DBC数据库
- 打开 CANdb++ Editor
- 顶部菜单:
File→Create Database - 模板弹窗:选择
CANTemplate.dbc(普通 CAN2.0A/B);如果是 CAN FD 选CAN_FD_Template.dbc,点 OK - 保存弹窗:选择存放路径,文件名建议英文,不要中文空格,保存类型
(*.dbc),点保存
此处模板按自己的需求选择即可,如CAN、CANFD、J1939等
设置DBC文件的名字
(2)节点创建
右键Network nodes,NEW
建好之后如下图,ECUs不用管,在节点中创建了ECU后,ECUs和Networks中会自动出现
Networks:总线网络对象,一套 DBC 代表 1 条 CAN/CAN‑FD 总线。- Tx Messages:本总线全部发送报文集合,所有 Message 都在这里汇总。
Signals:全局信号池,所有信号定义存放于此。
(3)新建 Signals(信号,最小数据单元)
依次把矩阵里全部 12 个信号新建完成:Torque_Cmd、Torque_Limit_Max、Motor_Enable、Reserve1、Drive_Mode、Reserve2、Reserve3、Motor_Speed、Motor_Torque_Feedback、Motor_Temp、Inverter_Temp、Motor_Fault_Code、Motor_Status、Reserve
枚举示例:
Motor_Enable可以添加 Value Table 0=Motor_Disable,1=Motor_Enable,2=Motor_ErrStop
| 你在哪设 | 设成什么 | 结果(树里自动出现的位置) |
|---|---|---|
| 报文 Message | Transmitter = 某个节点 | 该节点的Tx Messages下出现这条报文 |
| 信号 Signal | 属于某条报文 | 该报文下的Signals里出现这个信号;全局Signals列表也出现 |
| 信号 Signal | Receivers = 某些节点 | 这些节点下出现接收的信号(视版本,可能叫 Rx Signals) |
(4)新建 Messages(CAN 报文 / 帧)
1)创建第 1 条报文 VCU2ECU_TorqCmd(ID:0x120,VCU 发送)
修改每个信号的start_bit(在创建信号的时候,没有地方可以设置,在信号加载到对应的CAN帧下后可以在此处设置)
2) 创建第 2 条报文 ECU2VCU_MotorState(ID:0x121,ECU 发送)
与VCU2ECU_TorqCmd一样
(5)一致性检查(必做!)
顶部菜单View→Consistency Check
- 查看结果:Error 必须清零,Warning 可以按需评估 常见错误:
- Signal bit overlap:信号 bit 重叠,需要修改起始 bit
- Message without transmitter:报文没有绑定发送节点
- Duplicate CAN ID:ID 重复冲突
下面针对三种常见错误,给出具体的排查步骤和修改示例。
1) Signal bit overlap(信号 bit 重叠)
排查步骤:
- 双击报错信号,打开信号编辑窗口,查看其
Start Bit和Length。 - 对照同一条报文下其它信号的起始 bit 和位长,确认重叠区间。
- 例如
Torque_Cmd占 bit 0~15,若Torque_Limit_Max误设为起始 bit 8,则两者在 bit 8~15 重叠。
修改示例:将Torque_Limit_Max的起始 bit 从 8 调整为 16,使其占用 bit 16~31,与Torque_Cmd完全错开。
2) Message without transmitter(报文没有绑定发送节点)
排查步骤:
- 双击报错报文,打开 Message 编辑窗口。
- 检查
Transmitter字段是否为空。 - 确认该报文应由哪个节点发送,例如
VCU2ECU_TorqCmd应由 VCU 发送。
修改示例:在Transmitter下拉框中重新选择VCU并确认,保存后该报文会出现在 VCU 节点的Tx Messages下,报错消除。
3) Duplicate CAN ID(ID 重复冲突)
排查步骤:
- 在 Messages 列表中按 CAN ID 排序,检查是否存在相同 ID 的报文。
- 双击其中一条报文,记录其 ID,再与另一条对比。
- 例如两条报文都使用了
0x120,即发生冲突。
修改示例:将其中一条报文的 ID 改为未占用的地址,例如把ECU2VCU_MotorState的 ID 从0x120改为0x121,确保全网 ID 唯一。
(6)保存 DBC,验证
Ctrl+S保存VCU_ECU_CAN.dbc