您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



文章 咨询 工具 课程  
会员   
   
嵌入式软件架构-高级实践
12月11-12日 北京+线上
LLM大模型与智能体开发实战
12月18-19日 北京+线上
需求分析与管理
2026年1月22-23日 北京+线上
     
   
 订阅
关于汽车ECU DBC文件的使用和功能详细解释
 
作者:没必要
  147   次浏览      7 次
 2025-11-20
 
编辑推荐:
本文介绍了汽车ECU DBC文件的使用和功能详细解释相关内容。希望对您的学习有所帮助。
本文来自于微信公众号汽车电子与软件,由火龙果软件Alice编辑、推荐。

01 - 简 介

DBC文件是汽车行业,特别是车载网络(如CAN, LIN, FlexRay, Ethernet SOME/IP)中至关重要的一种数据格式文件。它不是一个真正的数据库,而更像是一个“字典”或“蓝图”,用于描述网络上的所有通信信息。DBC 的全称是 Data Base Container,它是一种基于ASCII文本的、人类和机器都可读的文件格式,用于定义和描述CAN总线网络中的通信规则。其核心思想是CAN总线本身只负责传输原始的、无意义的二进制数据(0和1的序列),DBC文件的作用就是为这些原始数据赋予意义。

02 - DBC使用方法

CAN是一种广泛用于汽车内部的分布式实时控制系统通信总线。其协议标准ISO 11898定义了帧格式、仲裁机制和错误检测等,但并未规定数据域中每一位、每一字节的具体含义。这意味着,面对一条ID为0x100、数据为0x3D 0x98 0x1A 0x04 ...的CAN报文,不同厂商或不同部门的工程师无法就其含义达成一致。

为了解决这一“语义鸿沟”问题,Vector公司提出了DBC文件格式。它作为一种简单、高效的文本描述语言,完整地定义了CAN网络上的所有通信行为,包括发送节点、报文ID、周期、以及报文内所有信号的物理意义、布局和数值描述。如今,DBC文件已成为汽车行业内部以及主机厂与供应商之间进行网络数据交换的标准媒介,是CAN网络管理、仿真、测试、诊断和标定的基础。以下是对DBC的使用进行详解介绍:

首先需要在Vector官网下载CANdb++

CANDBC类似于一种表格,将信号和CANID进行归类,统一称为Communication Matrix即通信矩阵。通过信号复用,可以根据复用值在消息中的相同数据字节上传输不同的信号。包含多路复用值的信号称为Multiplexor Signal(模式信号)。根据多路复用值发送的信号称为Multiplexed(与模式有关)Signals。信号1和信号2可以复用同时定义参数值为0。

选择菜单栏中的新建文档,选择CANTemplate.dbc进行构建,然后保存在一个路径下。

具体的窗口中有以下内容:Network nodes是网络节点,网络节点我们可以新建两个节点的名称OBC和VCU

随后我们需要新建CANID即消息(Message),表示CAN的标识符。一个CAN网络当中往往存在多个Message,但CAN网络中Message的CAN ID必须是唯一的,即每个CAN ID在一个CAN网络中只能使用一次。右键点击Message进行新建,其中Name可以自己定义为名字,Type是CANID的类型,有CAN Standard(标准帧)和CAN Extended(扩展帧)。ID是该CAN的ID,DLC代表长度。找到Transmitters点击add,将该消息添加到对应的发送节点上。

2.1 创建多个信号signal

该图里面具体的内容

name:信号的命名由自己定义;

Length:信号的长度;

Byte Order:CAN报文字节Intel(英特尔格式)和Motoroal(摩托罗拉格式)

Unit:定义该信号单位,比如电流就定义为A;

Value Type:参数类型选择无符号还是有符号;

Factor:一般参数因子为1

Offset:根据诊断表定义偏移量Minimum与Maximum:该信号的参数最大值和最小值范围随后在该信号的Message栏中将其添加到对应的消息中

调整信号的排列位置方法点击新建的Message的New_Signal_1,右键选择Edit mapped Signal…,将该信号的起始位置进行改变。

给信号添加“无效值”描述,选择菜单栏中的View,下拉选择Value Tables,随后右键新建,在Value Description栏中点击Add可以定义数值;将上一步的值描述添加到信号中,注意,长度需要符合。

添加GenMsgCycleTime属性,可以用来给Message定义周期,也就是CAN ID的周期。

添加GenericFrameRequirementNb属性,可以用来给Message定义需求编号。

添加GenMsgSendType属性,可以用来给Message定义触发的类型,也就是CAN ID发送方式:周期帧发送,事件帧发送,混合帧发送。

添加ProjectFrameRequirementNb属性,可以用来给Message定义需求编号。

添加Manufacturer属性,可以用来定义制造商名称;添加GenSigStartValue属性,可以用来给Signal信号的定义初始值;添加ProjectSignalRequirementNb属性,可以用来给Signal信号的需求编号;为了确定CAN数据库的对象及其相互关系是否一致,可以使用CANdb ++执行自动一致性检查,查看创建/修改的DBC是否有误错误。

多路复用这个词语Multiplexing,那么根据复用值消息中的相同数据字节上传输不同的信号。一起发送的多路复用信号必须每个都合并到一个Multiplex Group中。具体的用法如下图:

内容含义有:Signal:信号没有多路复用Multiplexor Signal:多路复用信号,此消息的其他信号复用到其值的信号Multiplexed Signal:多路信号,仅当复用信号的值与多路复用值一致时,才发送的一种信号。注意

a) 每条消息的multiplexor signals的数量只有一个;

b) 信号可以是multiplexor signal或multiplexed signal,但不能同时是两者。

当New_Signal_1 = 0,后面的信号表示New_Signal_4,New_Signal_5;当Package_Num = 1,后面的信号表示New_Signal_2,New_Signal_3。

信号New_Signal_1是Multiplexor Signal类型;信号New_Signal_4、New_Signal_5、New_Signal_2、New_Signal_3是Multiplexed Signal类型。

我们可以将定义的信号进行创建符号名称和备注,枚举出信号有可能出现的值,并进行描述,将定义的Value Tables放置在定义的信号中。

以Message消息Autosar_CAN_Test中New_Signal_1为例,选中New_Signal_1并鼠标右键,在其上下文中选择“Edit mapped Signal…”。或者双击Autosar_CAN_Test下的New_Signal_1信号,也有同样的效果。

2.2 DBC表达信号的负值

CAN总线数据域本质上是原始的字节序列,其本身并不携带数据类型信息。诸如0xFF 这样的字节,既可以表示无符号的 255,也可以表示有符号的 -1。DBC文件的强大之处在于,它通过明确的语法,为这些原始比特位赋予了确切的物理意义,其中包括如何解读负值。具体的公式:Phy值 = Hex值 * Factor + Offset。如果一个CAN信号有负数/值,则Offset必须为负数;负数区间的范围:[Offset,0),既Offset决定了负数/值的下限。

首先给定一个正整数(原码),将其所有比特位取反(得到反码),在反码的基础上加1(得到补码)。举个简单的案例:

(1) 当Factor为1,Offset为0时

如果最高位为0:物理值(Phy值)就是十六进制值(或原码)本身(Phy值 = Hex值)。

如果最高位为1:物理值(Phy值)需要通过取反加一(即求补码)的操作来得到其负数值(Phy值 = - ((~Hex值) + 1))。

以12位信号为例,最高位Bit = 12,数值范围-(2^(N-1))到+(2^(N+1)-1)。则12位信号:-2048到2047。

原始值设为0x456 (二进制 0100 0101 0110)

假设最高位为0(正数);phy值 = 0x456 – 1110(十进制)

原始Hex值:0x856 (二进制 1000 0101 0110)

假设最高位为1(负数);phy值 = 0x456 – 1110(十进制);

使用公式:

1.先取反:0x856二进制1000 0101 0110

2.取反后是0111 1010 1001,即0x7A9,然后0x7A9+1=0x7AA,

3.再加负号:-(0x7AA) = -(1962)

所以0x856表示的是-1962。

(2) 当Factor不为1,Offset不为0时

具体的公式:Phy = Raw * Factor + Offset。Raw:原始的十六进制值(在MCU里被理解为有符号整数)。Phy:最终的物理值(工程师可读的工程值,如速度、温度、压力)。

假设原始值的最高位为0 (Raw >= 0)。原始状态:Raw 是一个非负数。物理值公式:Phy = (正数或零) * Factor + Offset。

描述负数的条件:

1. 只有当 Offset 是负数,并且其绝对值足够大,能够“抵消”掉 Raw * Factor 的正向贡献时,物理值才可能为负。

2. 概括为:Offset < 0 且 |Offset| > (Raw * Factor)。

举例:Raw = 100,Factor = 0.1, Offset = -20。Phy = 100 * 0.1 + (-20) = 10 - 20 = -10 (物理值为负)。

假设原始值的最高位为1 (Raw < 0)。原始状态:Raw 是一个负数(在计算机中以补码存储,您描述的 -(~Hex + 1) 正是从补码计算其负数值的过程)。物理值公式:Phy = (负数) * Factor + Offset

描述负数的条件:这里有两种子情况,物理值可能为负:

a) 偏移量为负 (Offset < 0)

逻辑:一个负数 (Raw * Factor) 加上一个更大的负数 (Offset),结果肯定是负数。概括:只要Offset < 0,无论 Raw 是多少,Phy 一定为负。

举例:Raw = -100(Hex值最高位为1),Factor = 0.1, Offset = -5。Phy = (-100 * 0.1) + (-5) = -10 - 5 = -15。

b) 偏移量为正 (Offset > 0),但较小

逻辑:一个负数 (Raw * Factor) 加上一个正数 (Offset)。如果正数偏移量不够大,无法把整个结果“拉”到零以上,那么结果依然是负数。概括:Offset > 0且 Offset < |Raw * Factor|。

举例:Raw = -150(Hex值最高位为1),Factor = 0.1, Offset = 10。Phy = (-150 * 0.1) + 10 = -15 + 10 = -5。

03 - DBC两种格式介绍

在CAN报文的数据域(通常为8字节) 中,一个信号(如车速、发动机转速)可能分布在多个不连续的字节和位上。DBC文件使用这两种格式来精确描述信号在数据字节中的布局。如果解析时使用的格式与定义不符,将会得到完全错误的数据,可能导致严重故障。

以下分别对Intel和Motorola两种格式进行详细介绍。

3.1 Intel(英特尔格式)DBC

Intel格式的信号一般是通过Byte0到Byte7的发送顺序

Intel的数据一般为小端编码格式,当信号在同一个字节实现时,没有跨字节那么该信号的高位(MSB)放在该字节的高位,信号的低位(LSB)放在该字节的低位。起始位在该信号的低位。如果是跨字节其与同一字节时一样的放置,即该信号的高位(MSB)放在该字节的高位,信号的低位(LSB)放在该字节的低位。起始位在该信号的低位。具体的如图所示:我们假设test1的数值为58,则排列顺序为0011 1010,test2的数值为240,则二进制为1011 1001,具体的如图所示。

当我们对某些Intel格式的信号进行代码处理的时候,对于多信号可以进行结构体或者结合体对于信号进行处理,那么我们在具体实现的时候怎么做呢,假设信号CANID为110,假设某个信号值(CAN_RX1)输出或者进行判断处理,该信号在某个字节中的占了3个bit,则CAN_RX1的代码为:

uint8_ttest1_RX = 0;uint8_t test2_RX = 0;
test1_RX= (uint8_t) ((CAN_RX1>> 5) & 0x07);
test2_RX= (uint8_t) CAN_RX2;
 

如果是一个信号占据一个字节的话,且是跨字节的话,那么具体的代码如下,假设具体的值test3_RX = 187,则(uint8_t) ((CAN_RX1>> 5) & 0x07) = 3,(uint8_t) ((CAN_RX1 << 3) & 0xF8) = 184。

uint8_ttest3_RX = 0;
test3_RX = (uint8_t) ((CAN_RX1[3] >>5) & 0x07) +(uint8_t) ((CAN_RX1[5] >> 3) & 0xF8);

3.2 Motorola格式DBC

Motorola编码格式的信号在一个字节时和Intel编码格式一样,信号高位(MSB)放在字节的高位,信号低位(LSB)放在字节的低位。但是当该信号为跨字节时,信号高位(MSB)放在低字节的高位,信号低位(LSB)放在高字节的低位。

具体的如图所示:我们假设test1的数值为58,则排列顺序为0011 1010,test2的数值为240,则二进制为1011 1001。

当我们对某些Intel格式的信号进行代码处理的时候,对于多信号可以进行结构体或者结合体对于信号进行处理,那么我们在具体实现的时候怎么做呢,假设信号CANID为110,假设某个信号值(test3)输出或者进行判断处理,该信号在某个字节中的占了4个bit,则test3的代码为

uint8_tCAN_RX1 = 0;
uint8_tCAN_RX2 = 0;
test1= uint8_t(CAN_RX1 & 0x0F);
test3= uint8_t((CAN_RX2 & 0xF0) >> 4);

当信号跨字节时具体的代码:

typedefstruct
{uint8_t test2_Lo;
uint8_t test2_Hi;
}CAN_RX;CAN_RXCAN110;
CAN110.test2_Lo = uint8_t(CAN_RX3& 0x1F);
CAN110.test2_Hi = uint8_t((CAN_RX3& 0xe0) >> 5);

04 - 总 结

DBC文件是汽车CAN总线网络的“通用语言翻译官”。它将底层硬件的二进制数据流,转换成为上层应用和工程师能够理解的、具有明确工程意义的物理参数。它是整个汽车电子开发生态系统中不可或缺的一环,确保了不同供应商提供的ECU之间能够正确、高效地通信。

随着汽车以太网和SOME/IP等新技术的发展,出现了如ARXML等更复杂的描述文件,但DBC文件以其简洁的文本格式、清晰的语法结构和强大的描述能力,成功地解决了CAN总线应用层数据标准化的问题。它作为连接汽车电子电气系统设计、实现、测试和运维各个环节的“通用语言”,其价值在数十年的行业实践中得到了不可辩驳的证明。尽管面临新架构和新协议的挑战,但DBC文件及其核心思想仍将在未来很长一段时间内,持续作为汽车网络通信领域不可或缺的基石。

   
147   次浏览       7 次
相关文章

中央计算的软件定义汽车架构设计
汽车电子控制系统中的软件开发过程
一文读懂汽车芯片-有线通信芯片
OTA在汽车上有哪些难点痛点?
相关文档

汽车设计-汽车的整体结构及动力系统
自动驾驶汽车软件计算框架
SysML在汽车领域的应用实践
电子电气架构-大陆汽车系统架构平台
相关课程

AutoSAR原理与实践
功能安全管理体系(基于ISO26262)
MBSE(基于模型的系统工程)
基于SOA的汽车电子架构设计与开发

最新活动计划
基于模型的数据治理与中台 11-11[北京]
软件架构设计方法、案例实践 11-13[北京]
AI智能化软件测试方法与实践11-20[北京]
UML与面向对象分析设计 11-25[北京]
LLM大模型与智能体开发实战 11-13[北京]
配置管理方法、实践、工具 12-11[北京]
 
 
最新文章
ASPICE中配置管理是个什么东西?
了解软件安全分析与组件鉴定
掌握Autosar ComStack的精髓!
基于整车功能的正向诊断需求开发
搞定Autosar SWC开发秘籍,码住!
汽车OTA更新的系统性威胁评估
最新课程
基于SOA的汽车电子架构设计与开发
Auto SAR原理与实践
AUTOSAR架构与实践(从CP到 AP )
AUTOSAR架构建模方法与工具(EA)
ASPICE4.0核心开发过程指南
MBSE(基于模型的系统工程)
更多...   
成功案例
某知名车企 AUTOSAR应用设计与开发
吉利汽车 MBSE工程体系汽车建模及评估
某整车企业 《功能需求分析与设计》
富奥汽车零部件 建模工具EA
零跑汽车 建模工具EA及服务
北汽福田 建模工具EA
小鹏汽车 建模工具EA
更多...