


文章目录
>>>>>>>>>>返回专栏总目录《AUTOSAR从入门到精通专栏》<<<<<<<<<<
关注文章末尾公众号,回复“资料”领取汽车电子入门资料,回复“加群”加入汽车电子交流群
提到通信,就不得不提到DBC文件,相信从事汽车行业的同学在工作过程中,应该多多少少都接触过该格式的文件。
一、DBC文件简介
DBC文件全称是Database CAN,是CAN的数据库文件,用于定义CAN总线网络中的消息和信号。其起源于90年代中期,当时汽车制造商采用CAN总线作为主要通信网络,因电子设备增加致总线复杂性上升,需标准化方式描述管理数据,DBC文件格式便应运而生,它能记录CAN消息的ID、长度、周期及信号信息,后被各大汽车制造商采用成为行业标准之一。
随着技术发展,DBC文件使用范围已不限于汽车行业,还广泛应用于工业自动化、医疗设备、航空航天等领域,现代的DBC编辑器和阅读器支持更复杂数据结构与高级验证机制,可适用于LIN、FlexRay、MOST等其他车辆网络标准。
在车辆通信系统中,DBC文件至关重要,它是实现车辆内部通信标准化的关键,能让不同制造商的ECU无缝交换信息,还可简化车辆诊断和维护过程,提高售后服务效率与可靠性。
1.1. DBC文件的常见应用场景
- ECU开发:为工程师编写ECU软件代码提供消息、信号属性定义,实现数据收发处理。
- 汽车诊断:诊断工具依其了解诊断请求、响应消息格式,判断车辆故障。
- 测试验证:模拟生成CAN消息测试ECU响应,监控实际通信数据,验证通信准确性。
- 网络设计优化:助力规划CAN总线网络,合理分配消息ID、规划信号传输,避免冲突。
- 售后维修保养:为维修工具提供协议信息,便于读取故障和配置参数,进行维修。
- 软件更新升级:保障新软件与CAN总线通信协议兼容,调整通信逻辑。
- 供应商协作:作为通用标准,确保各供应商ECU产品与整车通信系统兼容。
1.2. DBC文件的关键组成部分
- 版本信息:记录文件版本号,标识更新情况。
- 命名空间:管理元数据,包含描述、注释、属性定义等。
- 总线定义:明确CAN总线连接的ECU名称。
- 消息定义:含消息ID、名称、长度及发送ECU等信息,它包含了多个信号。。
- 信号定义:消息中的数据单元,定义了如何从消息数据中解析出具体的值。每个信号包括名称、位宽、缩放系数、偏移量、范围、单位等信息。
- 属性定义和值:前者定义属性类型范围,后者为元素设属性值。
- 注释:解释消息、信号等元素含义用途。
- 值表:定义信号取值范围及对应含义。
二、DBC文件格式详解
为了更深入地理解DBC文件的结构和内容,我们通过一个简单的示例来展开说明:
VERSION "v00.04.00_00"
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER_
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_
BS_:
BU_: ECU2 BMS_UPDATED CCU_UPDATED ECCU_NEW HVCS_MODIFIED HVDI_NEW_VERSION LBM_ENHANCED PEU_F_NEW PEU_R_NEW VCU_UPDATED
BO_ 270 ECU2_04: 8 ECU2
SG_ Vehicle_SafetyBlitzActive : 40|3@0+ (1,0) [0|7] "" Vector__YYY
SG_ CGW_04_Checksum : 5|8@0+ (1,0) [0|255] "" PEU_F_NEW,PEU_R_NEW,VCU_UPDATED
SG_ CGW_04_MessageCounter : 13|4@0+ (1,0) [0|15] "" PEU_F_NEW,PEU_R_NEW,VCU_UPDATED
SG_ ComfortEnable_SIL : 16|2@0+ (1,0) [0|3] "" LBM_ENHANCED,PEU_F_NEW,PEU_R_NEW
BA_DEF_ "Baudrate" INT 0 1000000;
BA_DEF_ "BusType" STRING;
BA_DEF_ BO_ "CANFD_BRS" ENUM "0","1";
BA_DEF_ "DBName" STRING;
BA_DEF_ BO_ "DiagRequest" ENUM "no","yes";
BA_DEF_ BO_ "DiagResponse" ENUM "no","yes";
BA_DEF_DEF_ "Baudrate" 250000;
BA_DEF_DEF_ "BusType" "CAN_BUS_TYPE_UPDATED";
BA_DEF_DEF_ "CANFD_BRS" "1";
一般来说,DBC文件包含以下8种关键信息:
2.1 版本与新符号
在DBC文件格式中,各个部分都以特定的关键字起始,这些关键字让文件的结构化内容更易于阅读和解析。紧随着版本声明(VERSION)的是NS_段,它是一种灵活的扩展机制。借助该机制,在DBC文件里引入新的关键字时,既能确保与旧版本的兼容性,又不会干扰解析器的基础解析功能。
- VERSION:用于明确指定DBC文件的版本号。其内容既可以为空,也可由用户根据实际需求自行定义。通过版本号,开发者能够清晰地了解文件的更新情况和适用范围。
- NS__:即“New Symbol”的缩写,主要用于定义DBC文件中所使用的额外符号或关键字。这些定义能够帮助解释器或相关工具准确识别哪些是预期的关键字,从而更好地理解文件中特定功能或特性的含义。在创建DBC文件时,该段通常会自动生成,多数情况下保持默认设置即可满足需求。
2.2 波特率定义(以BS_ 开头)
DBC文件中波特率的定义格式如下:
BS_:[baudrate:BTR1, BTR2]
其中,“BS_”是固定的关键字,专门用于定义CAN网络的波特率。中括号“[ ]”内的内容为可选部分,可以根据实际情况选择省略,但“BS_:”这一关键字必须存在,否则会导致文件解析出错。
提示:通常情况下,这一行会保持为空。这是因为CAN网络的波特率配置大多是在CAN控制器中进行设置的,而不是在DBC文件中。
2.3 网络节点的定义(以BU_ 开头)
网络节点在DBC文件中的定义格式为:
BU_: Nodename1 Nodename2 Nodename3 ……
组成部分 | 说明 |
---|---|
BU_ | 这是用于标识网络节点定义的关键字 |
Nodename1, Nodename2 | 代表节点的名称,由用户根据实际情况自行定义 |
提示:在定义节点名称(Nodename)时,务必确保其唯一性,以避免在网络通信中出现混淆和错误。
2.4 消息定义和结构(以BO_ 开头)
消息定义是DBC文件的核心内容,它详细描述了CAN总线上每个消息(Message)的具体信息。从结构上看,消息定义主要包含以下关键要素:
组成部分 | 说明 |
---|---|
BO_ | 作为标识报文定义的关键字 |
MessageId | 是CAN总线上消息的唯一标识符,是区分不同消息的关键依据 |
MessageName | 为了便于理解和维护,每个消息都有一个具有明确含义的名称 |
MessageSize | 指定消息的字节数,为无符号整型数据。在CAN总线上,一般消息的字节数为8字节,而CAN FD最大可支持64字节 |
Transmitter | 表示发送该报文的网络节点。若该报文未指定发送节点,则需将该值设置为“Vector__XXX” |
示例:
BO_ 500 CAN_Messages: 8
SG_ Speed : 0|16@1+ (1,0) [0|300] "km/h"
SG_ Engine_RPM : 16|16@1+ (1,0) [0|8000] "rpm"
SG_ Temp : 32|16@1+ (1,0) [-40|125] "C"
上述示例表示的是由某个节点(未明确指定,按规则若未指定发送节点,实际解析时需特殊处理)发出的消息,其msg_id = 500,报文名称为“CAN_Messages”,数据长度为8字节。该消息包含三个信号:Speed、Engine_RPM和Temp。每个信号前面的数字表示其在消息中所占的起始位和长度,信号注释部分则给出了信号的取值范围和单位。
2.5 信号的定义和属性(以SG_ 开头)
信号定义位于消息定义内部,用于详细描述消息中每个信号的具体信息。信号的关键属性如下:
组成部分 | 说明 |
---|---|
SG_ | 作为标识信号定义的关键字 |
SignalName | 用于标识信号的名称,在软件中通过该名称引用该信号 |
SigTypeDefinition | 为可选项,存在3种格式: 空:代表普通信号 M:表示多路选择器信号 m50:表示被多路选择器选择的信号,其中50表示当M定义的信号值等于50时,该报文使用此通路 |
StartBit | 表示信号在消息中的起始位 |
SignalSize | 即信号的长度 |
ByteOrder | 用于表示信号的字节顺序:0代表Motorola格式(大端序),1代表Intel格式(小端序) |
ValueType | 表示该信号的数值类型:“+”表示无符号数,“-”表示有符号数 |
Factor, Offset | 分别表示因子和偏移量,用于实现信号原始值与物理值之间的转换,转换公式为:物理值 = 原始值 * 因子 + 偏移量 |
Min | Max |
Unit | 表示信号的测量单位,如常见的度、米、帕斯卡等 |
Receiver | 表示接收该信号的网络节点。若该信号未指定接收节点,则必须设置为“Vector__XXX” |
示例:
SG_ CGW_03_CRC : 7|8@0+ (1,0) [0|255] "" PEU_F,PEU_R,VCU
该示例表示定义了一个名为“CGW_03_CRC”的普通信号,其起始位是第7位,信号长度为8bit;信号采用Motorola格式(大端序),数值类型为无符号数;因子为1,偏移量为0;信号的取值范围是0到255;该信号没有物理单位;接收该信号的节点为PEU_F、PEU_R和VCU这三个节点。
大端和小端的解释:
在DBC文件的信号定义中,“0”代表Motorola(Big Endian,大端序)格式,“1”代表Intel(Little Endian,小端序)格式。这两种格式主要用于描述多字节数据中字节的排列顺序:
- Motorola格式(大端序):从人类常规的阅读习惯(从左到右)来看,数据的表示方式与我们日常书写习惯一致。例如,对于十六进制数0x1234,在内存中它会按照0x12 0x34的顺序存储。这种格式在网络协议以及汽车制造商领域中较为常用。
- Intel格式(小端序):在这种格式下,十六进制数0x1234在内存中的存储顺序变为0x34 0x12。大多数现代的PC架构,如x86和x86 - 64架构,都采用小端序格式。
2.6 注释部分(以CM_ 开头,为可选部分)
为了增强DBC文件的可读性,我们可以为消息、信号等元素添加注释信息。注释的格式如下:
CM_ BO 1234 "This is a message for ECU1 communication";
CM_ SG 1234 SignalName "This signal represents the speed of the vehicle";
组成部分 | 说明 |
---|---|
CM_ | 表示注释内容的起始关键字 |
BO 或 SG | 用于指明注释的对象是消息(BO)还是信号(SG) |
1234 | 若注释对象是消息,则为该消息的ID;若注释对象是信号,则为该信号所属消息的ID |
“…” | 具体的注释内容,用于对消息或信号进行详细说明 |
2.7 特征属性部分
2.7.1 BA_DEF 特征名称类型定义
其定义格式为:BA_DEF_ Object AttributeName ValueType Min Max;
组成部分 | 说明 |
---|---|
BA_DEF_ | 作为标识特征名称类型定义的关键字 |
Object | 表示特征类型,可以是BU_(用于节点特征定义)、BO_(用于报文特征定义)、SG_(用于信号特征定义)、空格(用于项目特征定义) |
AttributeName | 代表特征的名称,需采用C语言变量的格式 |
ValueType | 表示特征值的类型,仅限于十进制、十六进制、浮点数、枚举、字符这5种类型 |
Min Max | 对于数值类型,这里表示取值范围;对于枚举类型,这里是具体的枚举值;对于字符类型,此处为空 |
示例:
BA_DEF_ BO_ "CANFD_BRS" ENUM "0","1";
上述示例表示“CANFD_BRS”是一个枚举类型的变量,其取值只能为0和1。
2.7.2 BA_DEF_DEF_ 特征默认值定义
定义格式为:BA_DEF_DEF_ AttributeName DefaultValue;
组成部分 | 说明 |
---|---|
BA_DEF_DEF_ | 用于标识特征默认值定义的关键字 |
AttributeName | 代表特征的名称,同样采用C语言变量的格式 |
projectValue | 表示该特征的默认设置值 |
示例:
BA_DEF_DEF_ "Baudrate" 500000;
此示例表明波特率(Baudrate)的默认值被设置为500000。
2.7.3 BA_ 特征项目设置值定义
定义格式为:BA_ AttributeName Object MessageId/NodeName projectValue;
组成部分 | 说明 |
---|---|
BA_ | 作为标识特征项目设置值定义的关键字 |
AttributeName | 代表属性的名称,需遵循C语言变量的格式 |
Object | 表示特征类型,可以是BU_(用于节点特征定义)、BO_(用于报文特征定义)、SG_(用于信号特征定义)、空格(用于项目特征定义) |
MessageId/NodeName | 若前面的对象类型是信号或者报文,则此处应为报文的ID(以十进制数表示);若前面的对象类型为节点,则此处应为节点的名字 |
projectValue | 表示该属性的具体设置值 |
示例:
BA_ "ILUsed" BU_ BGW 1;
该示例表示对于特征名称为“ILUsed”的属性,其对应的网络节点名为“BGW”,该特征的设置值被设定为1。
2.8 数值表部分
数值表的定义格式为:VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;
组成部分 | 说明 |
---|---|
VAL_ | 作为标识数值表定义的关键字 |
MessageId | 表示该信号所属的报文ID,以十进制数表示 |
SignalName | 即信号的名称 |
N “DefineN” …… 0 “Define0” | 用于定义数值表的具体内容,也就是该信号的各个有效值分别对应的符号表示 |
示例:
VAL_ 268 ComfEna_ASIL 3 "Invalid" 2 "Reserved" 1 "Comfort enabled" 0 "Comfort not enabled" ;
上述示例表示对msg_id = 268的报文中名为“ComfEna_ASIL”的信号进行数值表定义:将数值3用“Invalid”表示,数值2用“Reserved”表示,数值1用“Comfort enabled”表示,数值0用“Comfort not enabled”表示。
三、总结
DBC文件作为定义汽车内部通信的标准,确保了不同供应商和开发团队可以高效地协作,标准化了汽车行业的通信协议,其重要性不言而喻。正确地使用和理解DBC文件对于确保汽车系统的顺畅通信和高效开发至关重要。正确理解和应用DBC文件对于汽车系统集成商和ECU开发人员而言,也是一项重要的技能!!!
扫码关注公众号,回复“资料”领取汽车电子入门资料,回复“加群”加入汽车电子交流群