深入理解DBC文件:汽车行业的数据通信蓝图

----------------往期精品文章专栏回顾,点赞收藏不迷路----------------

学习ISO-14229 UDS协议 >>>>>>>>> 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<

嵌入式开发知识硬核文章集锦 >>>>>>>>> 《嵌入式工程师自我修养/C语言》<<<<<<<<<

  在汽车行业,确保不同电子控制单元(ECU)之间的顺畅通信是至关重要的。为了实现这一点,行业标准化了一种称为DBC(Database CAN)文件的格式,它作为一种通信网络中消息和信号的描述文件,使得汽车系统间的通信更加高效、明确。本文将深入探讨DBC文件的结构和应用,同时提供一个示例并详细解释各个字段的含义。

一、DBC文件简介

  DBC文件是一种文本文件,用于定义和描述控制器局域网络(CAN)总线上的数据通信。它不仅包括消息的ID,还详细描述了每个消息内部的信号,如信号的名称、大小、缩放系数、偏移量、单位、接收者等信息。通过这种方式,DBC文件为软件开发人员、系统工程师和测试人员提供了一种共享和理解CAN总线上数据通信方式的方法。

——DBC文件的常见应用场景

  • 自动代码生成:从DBC文件自动生成源代码,用于实现ECU软件的发送和接收CAN消息。
  • 系统测试和验证:利用DBC文件,测试工具可以解析CAN消息,对系统进行模拟和测试。
  • 车辆诊断:为诊断工具提供必要的信息,以解释车辆的诊断数据。

——DBC文件的关键组成部分

  • 消息(Message):每条消息都有一个唯一的标识符(ID)和名称,它包含了多个信号。
  • 信号(Signal):消息中的数据单元,定义了如何从消息数据中解析出具体的值。每个信号包括名称、位宽、缩放系数、偏移量、范围、单位等信息。
  • 属性(Attribute):为消息或信号定义额外的元数据,如注释或物理单位。
  • 值表(Value Table):为信号的原始值定义了具体的含义或描述。

二、DBC文件格式详解

  为了更好地理解DBC文件的结构和内容,下面通过一个简单的示例来说明:

VERSION "v00.03.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_: ECU1 BMS CCU ECCU HVCS HVDI LBM PEU_F PEU_R VCU

        
BO_ 268 ECU1_03: 8 ECU1
 SG_ Body_ActvSftyBltReq : 42|3@0+ (1,0) [0|7] "" Vector__XXX
 SG_ CGW_03_CRC : 7|8@0+ (1,0) [0|255] "" PEU_F,PEU_R,VCU
 SG_ CGW_03_MsgCntr : 15|4@0+ (1,0) [0|15] "" PEU_F,PEU_R,VCU
 SG_ ComfEna_ASIL : 17|2@0+ (1,0) [0|3] "" LBM,PEU_F,PEU_R
 
 
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" 500000;
BA_DEF_DEF_  "BusType" "";
BA_DEF_DEF_  "CANFD_BRS" "0";

  一般DBC文件中包含了如下的8种信息:

2.1 版本与新符号

  VERSION:指定了DBC文件的版本(内容可以为空也可以由用户自定义)。

  NS__:New symbol,其主要作用是定义在该DBC文件中使用的额外符号或关键字。这些定义可以帮助解释器或相关工具更好地理解在DBC文件中可能使用到的特定功能或特性(创建dbc文件时自动生成,一般保持默认即可)。

  在DBC格式中,每个部分都以特定的关键字开始,这些关键字使得文件的结构化内容易于被阅读和解析。NS_段紧跟在版本声明(VERSION)之后,是一种扩展机制,允许在DBC文件中引入新的关键字,而不影响旧版本的兼容性或解析器的基本解析功能。通过NS_段的定义,DBC文件的解析器可以知道哪些是期望的关键字,从而正确地解析文件内容。这对于确保DBC文件的兼容性和扩展性至关重要,特别是在复杂的车辆网络系统中,不同版本和不同制造商间的兼容性是一个重要考量。

2.2 波特率定义

  BS_:[baudrate:BTR1, BTR2];

  其中BS_为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略,但关键字”BS_:”必须存在,省略则会出错。

Tip📌:通常该行会保持为空,因为波特率配置往往在CAN控制器中设置

2.3 网络节点的定义

  BU_: Nodename1 Nodename2 Nodename3 ……

BU_ 关键字,表示网络节点
Nodename1, Nodename2 节点名字,由用户自己定义

Tip📌:要注意Nodename的唯一性

2.4 报文帧的定义(消息 - Message)

  BO_ MessageId(10进制数表示) MessageName: MessageSize Transmitter

  BO_ :关键字,表示报文;
  MessageId :报文ID,是以10进制数表示的;
  MessageName :报文的名字,命名规则和C语言变量相同;
  MessageSize :报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节;
  Transmitter :发送该报文的网络节点。

    BO_ 关键字,表示报文
MessageId 报文ID,是以10进制数表示的
MessageName 报文的名字,命名规则和C语言变量相同
MessageSize 报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节
Transmitter 发送该报文的网络节点,如果该报文没有指定发送节点,则该值需设置为Vector__XXX

——举例如下

BO_ 268 ECU1_03: 8 ECU1
// 表示由ECU1节点发出的 msg_id = 268,报文名为ECU1_03,数据长度为8字节的报文

2.5 信号的定义

  SG_ SignalName (SigTypeDefinition) : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver

    SG_ 关键字,表示信号
SignalName (SigTypeDefinition) 表示该信号的名字 和 多路选择信号的定义
SigTypeDefinition 是可选项,有3种格式:
空:表示普通信号
M:表示多路选择器信号
m50:表示被多路选择器选择的信号,50,表示当M定义的信号的值等于50时,该报文使用此通路
StartBit 表示该信号起始位
SignalSize 信号长度
ByteOrder 表示信号的字节顺序:0代表Motorola格式,1代表Intel格式
ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数
Factor, Offset 表示因子,偏移量。用于信号的原始值与物理值之间的转换,转换公式为:物理值 = 原始值 * 因子 + 偏移量
Min|Max 表示该信号的最小值和最大值,即指定了该信号值的范围(这两个值为double类型)
Unit 表示该信号的物理单位,为字符串类型
Receiver 表示该信号的接收节点(若该信号没有指定的接收节点,则必须设置为"Vector__XXX"

——Motorola格式和Inter格式?(实际上就是字节序的大端模式和小端模式)

  DBC文件中,信号的定义包括了信号的格式,其中“0”表示Motorola(Big Endian)格式,“1”表示Intel(Little Endian)格式。这两种格式指的是在多字节数据中字节的排列顺序。

  • Motorola格式(Big Endian):当以人类阅读的方式(从左到右)查看数据时,数字的表示与我们通常书写的方式一致。例如,0x1234在内存中将被存储为0x12 0x34(主要用于网络协议中,汽车制造商中较为常见)。

  • Intel格式(Little Endian):0x1234在内存中将被存储为0x34 0x12(多数现代PC架构采用这种格式,包括x86和x86-64架构)。

——举例如下

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这三个节点。

2.6 注释部分

  CM_ Object MessageId/NodeName “Comment”

    CM_ 关键字,表示注解信息
Object 表示进行注解的对象类型,可以是节点“BU_”、报文“BO_”、信号“SG_”
MessageId/NodeName 表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);
若前面的对象类型为节点,则这里的值应为节点的名字
Comment 表示进行注解的文本信息

——举例如下

CM_ SG_ 996 HUD_HeightLv “Control hud height level”;
// 表示对ID为996(0x3E4)这条报文下的名为”HUD_HeightLv ”的信号进行注解说明,说明的内容为"Control hud height level"。

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;
// 表示波特率的默认值为500000;

2.7.3 BA_ 特征项目设置值定义

  BA_ AttributeName Object MessageId/NodeName projectValue;

BA_ 表示特征项目设置值定义
AttributeName 属性名称(C语言变量格式)
Object 特征类型,可以是BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义)
MessageId/NodeName 表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);
若前面的对象类型为节点,则这里的值应为节点的名字
projectValue 该属性的设置值

——举例如下

BA_ "ILUsed" BU_ BGW 1;
// 表示特征名称为ILUsed的网络节点名为BGW的特征设置值为1

2.8 数值表部分

  VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;

  VAL_ 关键字,表示数值表定义
MessageId 该信号所属的报文ID(10进制数表示)
SignalName 信号名
N “DefineN” …… 0 “Define0” 表示定义的数值表内容,即该信号的有效值分别用什么符号表示

——举例如下

VAL_ 268 ComfEna_ASIL 3 "Invalid" 2 "Reserved" 1 "Comfort enabled" 0 "Comfort not enabled" ;
// 表示对msgid = 268下的名为ComfEna_ASIL进行数值表定义:
//用"Invalid"取代3,
//用"Reserved"取代2 
//用"Comfort enabled"取代1 
//用"Comfort not enabled"取代0

四、总结

  DBC文件作为定义汽车内部通信的标准,确保了不同供应商和开发团队可以高效地协作,标准化了汽车行业的通信协议,其重要性不言而喻。正确地使用和理解DBC文件对于确保汽车系统的顺畅通信和高效开发至关重要。正确理解和应用DBC文件对于汽车系统集成商和ECU开发人员而言,也是一项重要的技能!!!

----------------往期精品文章专栏回顾,点赞收藏不迷路----------------

学习ISO-14229 UDS协议 >>>>>>>>> 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<

嵌入式开发知识硬核文章集锦 >>>>>>>>> 《嵌入式工程师自我修养/C语言》<<<<<<<<<

相关推荐

  1. 深入理解DBC文件汽车行业数据通信蓝图

    2024-03-25 09:08:05       37 阅读
  2. Perl与数据库交互:深入理解DBI模块

    2024-03-25 09:08:05       22 阅读
  3. 数据库DBMS,DBS,DBA

    2024-03-25 09:08:05       47 阅读
  4. 深入理解WebSocket协议:实现实时通信利器

    2024-03-25 09:08:05       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 09:08:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 09:08:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 09:08:05       82 阅读
  4. Python语言-面向对象

    2024-03-25 09:08:05       91 阅读

热门阅读

  1. Simulink学习教程分享

    2024-03-25 09:08:05       48 阅读
  2. 滴滴基于 Clickhouse 构建新一代日志存储系统

    2024-03-25 09:08:05       41 阅读
  3. 精读《如何做好 CodeReview》

    2024-03-25 09:08:05       40 阅读
  4. 复习Day2_

    2024-03-25 09:08:05       43 阅读
  5. TCP重传机制详解——03DSACK

    2024-03-25 09:08:05       37 阅读
  6. 【boost_search搜索引擎】2.正排索引和倒排索引

    2024-03-25 09:08:05       37 阅读
  7. P1873 [COCI 2011/2012 #5] EKO / 砍树

    2024-03-25 09:08:05       37 阅读
  8. AI大模型的训练与优化

    2024-03-25 09:08:05       38 阅读
  9. 第三十二章 配置服务器访问

    2024-03-25 09:08:05       40 阅读
  10. 大数据实时计算的Windows功能?

    2024-03-25 09:08:05       37 阅读