前言

之前写了一篇简单版的 DBC 文件解析,下面详细介绍下 DBC 文件里的各个字段。

总体概览

DBC文件是以 Tag(标签)来标识每一个元素。

img

如上图所示,一般 dbc 文件中包含了如下的 8 种信息:

  • 版本与新符号
  • 波特率定义
  • 网络节点的定义
  • 报文帧的定义
  • 信号的定义
  • 注解部分
  • 特征部分
  • 数值表部分

详细解释

版本的定义

VERSION 信息可为空,也可以由用户自定义;
NS_ 表示 New Symbol,在外面创建 dbc 文件时已经自动生成,所以无需过多留意,默认即可;

波特率的定义

格式为 BS_: [baudrate:BTR1,BTR2]

其中 BS_ 为关键字,用于定义 CAN 网络的波特率;[] 内容表示为可选部分,可以省略;
但关键字 BS_: 必须存在,省略则会出错。《DBC File Format Document》规范中明确提醒,必须保留 BS_: 标签。

网络节点的定义

格式为 BU_: Nodename1 Nodename2 Nodename3 ……

BU_ 为关键字,表示网络节点;Nodename1、Nodename2 为网络节点名字,由用户自己定义。注意需要保证节点命名的唯一性。

报文帧的定义

格式为 BO_ MessageId MessageName: MessageSize Transmitter

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

BO_ 996 HUD_1_B: 8 HUD 来举例,这个报文是由 HUD 这个节点发出的,数据域长度为 8 字节,ID 为 996(0x3E4),名字命名为 HUD_1_B。

信号的定义

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

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

如示下面的例中:
第一个信号 SG_ S_Check : 45|10@0+ (0.00625,0) [0|160] "M" EL3160_60,ESC
表示定义了一个命名为 S_Check 的普通信号,其起始位是第 45 位,信号长度 10 bit;
信号是 Motorola 格式,数值类型为无符号类型数;因子为 0.00625,偏移量为 0;信号取值范围为 0 到 160;
信号物理单位为字符串 “M”,该信号接收节点为 EL3160_60 和 ESC 这两个节点。

第二个信号 SG_ Send_Mux M : 7|8@0+ (1,0) [0|0] "" EL3160_60,ESC
表示定义了一个命名为 Send_Mux 的多路选择器信号,其起始位是第 7 位,信号长度 8 bit;
信号是 Motorola 格式,数值类型为无符号类型数;因子为1,偏移量为 0;信号取值范围为 0 到 0;
信号物理单位为字符串 “”;该信号接收节点为 EL3160_60 和 ESC 这两个节点。该信号做选择通道使用。

第三个信号 SG_ S_Level_A_Voltage m50 : 15|16@0+ (0.00625,0) [0|160] "V" EL3160_60,ESC
表示定义了一个命名为 S_Level_A_Voltage 的被选择信号,其起始位是第 15 位,信号长度 16 bit;
信号是 Motorola 格式,数值类型为无符号类型数;因子为 0.00625,偏移量为 0;信号取值范围为 0 到 160;
信号物理单位为字符串 “V”;该信号接收节点为 EL3160_60 和 ESC 这两个节点。
img
img
Send_Mux 作为选择通路使用,这个例子中,当 Send_Mux 等于 50、51、52、54 时,代表后面的选择的通路。

注解部分

格式为 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”。

注意注释以 “” 包围,注释内部不允许再出现双引号。

特征定义部分

和特征相关的 Tag 一共有三条:

  • BA_DEF_ 特征名称类型定义。格式为 BA_DEF_ Object AttributeName ValueType Min Max;
       - BA_DEF 标签

  • Object 特征类型,可以是 BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义);

  • AttributeName 特征名称(C 语言变量格式)

  • ValueType 特征值类型(只能是十进制、十六进制、浮点数、枚举、字符 5 种类型)

  • Min Max 数值类型这里出现范围,枚举类型这里是枚举值,字符类型,这里是空。

  • BA_DEF_DEF_ 特征默认值定义。格式为 BA_DEF_DEF_ AttributeName DefaultValue;

    • BA_DEF_DEF_ 标签
    • AttributeName 特征名称(C 语言变量格式)
    • DefaultValue 该特征的默认设置值
  • BA_ 特征项目设置值定义,格式为 BA_ AttributeName projectValue;

    • BA_ 标签
    • AttributeName 特征名称(C 语言变量格式)
    • projectValue 该特征的设置值

举例:
BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65535; BA_DEF_DEF_ "GenMsgCycleTime" 2200; BA_ "GenMsgCycleTime" BO_ 400 100;

表示对定义了一个针对消息类型的特征,特征名为 “GenMsgCycleTime”,特征值是整型数据,取值范围在 0 到 65535 之间;
默认值为 2200;
项目设置值 “CAN ID == 400” 的消息,其特征值设置为 100;

数值表部分

格式为 VAL_ MessageId SignalName N "DefineN" …… 0 "Define0"

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

如示例中的 VAL_ 996 HUD_OffSt 1 "Active" 0 "Not Active";

表示对 ID 为 996(0x3E4)的这条报文下的,一个命名为 “HUD_OffSt” 的信号,进行其数值表的定义;
用 “Active” 取代 1;用 “Not Active” 取代 0。只有自然数类型的信号才可以使用数值表表示。


©2018 - Felicx 使用 Stellar 创建
总访问 113701 次 | 本页访问 326
共发表 83 篇Blog · 总计 127.5k 字