0. 简介
DBC(CAN DataBase Container)是一种用于描述 Controller Area Network(CAN)通信协议的文件格式,它是行业内广泛认可的标准格式。DBC 文件是用 ASCII 码表示的文本文件,其中包含了与 CAN 通信相关的信息,包括 CAN 消息、信号、节点、周期性消息等。以下是对DBC文件的粗略介绍:(关键核心内容为黑体)
- CAN 消息定义:DBC 文件中定义了每个CAN消息的ID、周期、发送节点等信息。消息ID是CAN消息的唯一标识符,用于区分不同的CAN消息。周期是指CAN消息的发送周期,用于描述CAN消息的发送频率。发送节点是指发送该CAN消息的ECU节点。
- CAN 信号定义:DBC 文件中还定义了每个CAN消息中包含的信号。信号是CAN消息的数据部分,表示特定的物理量或状态。对于每个信号,DBC文件中定义了它的名称、位数、数据类型、单位、缩放因子等信息,以及信号在CAN消息中的起始位和结束位。
- 节点定义:DBC 文件中描述了参与CAN通信的节点,即ECU(Electronic Control Unit)。每个节点都有唯一的名称和地址,用于标识不同的ECU。
- 通信矩阵:DBC 文件就是一个通信矩阵。描述了不同节点之间的通信关系。它指定了哪个节点可以发送哪个CAN消息,以及哪个节点可以接收哪个CAN消息。
- 周期性消息和定时触发消息:DBC 文件中可以定义周期性消息和定时触发消息。周期性消息是按照一定周期发送的消息,而定时触发消息是在特定事件触发时发送的消息。
- 协议版本:DBC 文件中还包含了对文件本身的描述,如文件格式版本、协议版本等信息。
消息、信号、节点的定义基本组成了整个通信矩阵。换言之,这就是 DBC 文件的核心。即,DBC 存在的意义就是为了描述各个节点之间的通信报文及其具体的信号。
DBC 文件是一种非常灵活和可扩展的文件格式,它使得开发人员可以轻松地组织和管理与CAN通信相关的信息,并在不同的CAN通信工具和软件之间进行无缝的集成和交换。由于其广泛应用和行业认可,DBC 文件已成为CAN通信协议描述的主流文件格式,被广泛用于汽车电子系统的开发、测试和集成过程。
行业内广泛使用 DBC(CAN DataBase Container)文件格式。 DBC 文件格式是由 Vector Informatik GmbH(维克托信息技术有限公司)创建和推广的。Vector 是一家德国的汽车电子技术公司,专注于开发和提供汽车电子系统的工程工具和解决方案。他们在汽车领域拥有广泛的经验,并在 AUTOSAR(Automotive Open System Architecture)标准制定过程中发挥了重要作用。
DBC 文件格式是行业内广泛认可和采用的标准格式,用于描述和存储与 CAN 通信相关的信息。它包含了 CAN 消息和信号的定义、布局、周期等信息,以及与 CAN 通信相关的节点和网络配置。DBC 文件是一种文本文件,使用 ASCII 码表示,这使得它易于编辑和分享。
由于 DBC 文件格式的广泛认可和行业应用,几乎所有主流的 CAN 通信工具和软件都支持 DBC 文件的导入和导出。它成为了CAN网络开发和集成过程中的标准文件格式,使得开发人员能够方便地组织和管理与CAN通信相关的信息,实现数据解析和配置,并在不同的工具和系统中进行无缝的集成和交换。
1. 基本理解
1.1 DBC文件的结构
DBC文件是一个用ASCII码表示的文本文件,其内容按照一定规则进行组织。一个典型的DBC文件由多个部分组成,每个部分都以关键字开始,后面跟着相应的定义信息。以下是一个简化的DBC文件结构示例:
VERSION "1.0"
NS_ :
BU_: ECU1 ECU2 ECU3 ;
BO_ 1234 CANMessage1: 8 ECU1
SG_ Signal1 : 0|16@1+ (1,-1) [0|100] "V" ECU1 ;
BO_ 5678 CANMessage2: 4 ECU2
SG_ Signal2 : 0|8@1+ (0,1) [0|100] "A" ECU2 ;
CM_ SG_ 1 "Signal1" ECU1;
CM_ SG_ 2 "Signal2" ECU2;
其中,VERSION 行表示DBC文件的版本信息。NS_ 行用于定义命名空间,BU_ 行定义了参与CAN通信的节点(ECU)。BO_ 行定义了一个CAN消息,包括CAN消息的ID、长度和发送节点。SG_ 行定义了一个CAN消息中的信号,包括信号的名称、起始位、长度、数据类型等。CM_ 行用于指定信号与节点的关联关系。
1.2 CAN消息的定义
在DBC文件中,CAN消息是通信的基本单位。每个CAN消息由一个消息ID(Message ID)唯一标识,用于区分不同的CAN消息。CAN消息还包含了消息的长度、发送节点等信息。以下是一个CAN消息的定义示例:
BO_ 1234 CANMessage1: 8 ECU1
其中,BO_ 是CAN消息定义的关键字,1234是CAN消息的ID,CANMessage1是消息的名称,8表示消息的长度(单位是字节),ECU1是发送该CAN消息的节点。
1.3 信号的定义
CAN消息中的信号是消息的数据部分,表示特定的物理量或状态。每个信号由一个名称唯一标识,还包括了信号的起始位、长度、数据类型、单位等信息。以下是一个信号的定义示例:
SG_ Signal1 : 0|16@1+ (1,-1) [0|100] "V" ECU1 ;
其中,SG_ 是信号定义的关键字,Signal1是信号的名称,0是信号的起始位,16是信号的长度(单位是位),1是信号的因子(即缩放因子),-1是信号的偏移量,[0|100]是信号的物理范围,"V"是信号的单位,ECU1是发送该信号的节点。
1.4 节点和通信矩阵
在DBC文件中,节点表示参与CAN通信的ECU(Electronic Control Unit)。可以使用BU_关键字定义节点,并将节点与相应的CAN消息和信号进行关联。通信矩阵描述了不同节点之间的通信关系。以下是节点和通信矩阵的定义示例:
BU_: ECU1 ECU2 ECU3 ;
CM_ SG_ 1 "Signal1" ECU1;
CM_ SG_ 2 "Signal2" ECU2;
其中,BU_ 是定义节点的关键字,ECU1、ECU2和ECU3是节点的名称。CM_ 是定义通信矩阵的关键字,SG_ 1表示关联信号Signal1,"Signal1"是信号的名称,ECU1是发送该信号的节点。
1.5 周期性消息和定时触发消息
DBC文件中可以定义周期性消息和定时触发消息。周期性消息是按照一定周期发送的消息,而定时触发消息是在特定事件触发时发送的消息。以下是周期性消息和定时触发消息的定义示例:
BA_DEF_ SG_ "GenMsgCycleTime" INT 0 65535;
BA_ "GenMsgCycleTime" BO_ 1234 100;
BA_DEF_ SG_ "GenMsgStartDelayTime" INT 0 65535;
BA_ "GenMsgStartDelayTime" BO_ 5678 500;
其中,BA_DEF_ 是定义属性的关键字,SG_ "GenMsgCycleTime"是定义信号GenMsgCycleTime的周期性属性,INT表示数据类型为整数,0和65535分别是属性的最小值和最大值。BA_ 是定义属性关联的关键字,"GenMsgCycleTime"是信号GenMsgCycleTime的周期性属性名称,BO_ 1234 100表示与消息ID为1234的消息关联,并设置周期为100毫秒。
1.6 dbc 的使用
除了手动编辑DBC文件外,还有一些工具可以将DBC文件转换为JSON格式(dbc2json),或者将JSON文件转换为DBC格式(json2dbc)。JSON格式可以更便于处理和解析,特别适用于与其他工具和系统的集成。
主流的配置工具,Vector 的导入 DBC 后常常和 ARXML 有关系。在Vector的工具中,DBC(CAN DataBase Container)和ARXML(AUTOSAR XML)文件都与汽车电子系统中的通信协议和通信配置有关,但它们服务于不同的领域和标准。
- DBC 文件:DBC文件是Vector CANoe和CANalyzer等CAN网络开发和分析工具中用于描述Controller Area Network(CAN)通信协议的文件格式。它主要用于描述CAN消息、信号、节点、通信矩阵等信息,用于CAN通信网络的开发、测试和分析。DBC文件广泛应用于CAN网络的配置和数据解析,使得开发人员能够更方便地进行CAN通信的开发和测试。
- ARXML 文件:ARXML文件是Vector CANdelaStudio和CANdelaFlash等AUTOSAR开发工具中使用的文件格式。AUTOSAR(Automotive Open System Architecture)是一种开放式的汽车软件架构标准,旨在提高汽车电子系统的可重用性和可扩展性。ARXML文件用于描述AUTOSAR软件组件(SWC)的配置和通信协议,其中包括ECU配置、网络描述、通信矩阵、接口描述等信息。ARXML文件以XML格式表示,它的结构更加复杂,可以包含更多关于AUTOSAR软件架构的信息。
区别和联系:
DBC和ARXML文件都涉及到汽车电子系统的通信配置,但它们在不同的领域和标准中使用。DBC文件主要用于描述CAN通信协议,适用于传统的CAN网络开发和测试。而ARXML文件则是AUTOSAR标准下的一部分,用于描述AUTOSAR架构中的软件组件和通信配置。在AUTOSAR开发中,ARXML文件描述了ECU的配置、软件组件的接口和通信,可以用于生成AUTOSAR应用软件并支持其配置和集成。
虽然DBC和ARXML文件在不同的工具和标准中使用,但它们在整个汽车电子开发过程中共同发挥着重要的作用。DBC文件用于传统CAN网络的开发和测试,而ARXML文件用于支持AUTOSAR架构下的软件组件配置和通信配置,促进了汽车电子系统的标准化和可重用性。
1.7 总结
DBC文件是一种用于描述CAN通信协议的行业标准文件格式,它提供了对CAN消息、信号、节点、通信矩阵等信息的定义和管理。通过DBC文件,开发人员可以更高效地组织和管理CAN通信相关的信息,实现数据解析和配置,并在不同的CAN通信工具和软件之间进行无缝的集成和交换。它是实现CAN通信系统开发、测试和集成的重要工具,为汽车电子系统的开发和应用带来了便利与效率。
2. 更多细节
2.1 NS_
版本与新
波特率 BS_:[baudrate:BTR1,BTR2]
2.2 BU_ 网络节点定义
BU_表示网络节点 BU_:Nodename1 Nodename2 Nodename3 ……
2.3 BO_ 报文帧定义
BO:CANId MessageName: MessageSize Transmitter
- MessageSize 表示该报文数据域字节数
- Transmitter 发送该报文的网络节点, 如果该报文没有指定发送节点, 则该值需设置为” Vector__XXX”
2.4 SG_ Signal 信号定义
SG_ SignalName : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver
- StartBit、 SignalSize 信号起始位、信号长度
- ByteOrder 表示信号的字节顺序: 0代表Motorola格式, 1代表Intel格式
- Intel\小端 编码: 信号在一个字节内, msb 在字节高位, lsb 在字节低位; 跨字节时, msb 在高字节高位,lsb 在低字节低位, 顺序的
- Motorola\大端 编码: 信号在一个字节内, msb 在字节高位, lsb 在字节低位; 跨字节时, msb 在低字节高位,lsb 在高字节低位,逆序的
- ValueType 表示该信号的数值类型: +表示无符号数, -表示有符号数
- Factor 表示因子, Offset 表示偏移量; 这两个值于该信号的原始值与物理值之间的转换。转换: 物理值=原始值*因子+偏移量;
- Min|Max 表示该信号的最小值和最大值, 即指定了该信号值的范围; 这两个值为double类型
- Unit 表示该信号的单位, 为字符串类型
- Receiver 表示该信号的接收节点; 若该信号没有指定的接收节点, 则必须设置为“Vector__XXX”*
2.4.1 编码补充-Bit Numbering
对于一个十进制数8,其二进制1000,
- lsb0 编号:最低有效位 lsb 地址为 0 开始的编码,即 msb first,对于二进制数 1000,编号为 bit3 bit2 bit1 bit0
- msb0 编号:最高有效位 msb 地址为 0 开始的编码,即 lsb first,对于二进制数 1000,编号为 bit0 bit1 bit2 bit3
lsb0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
msb0
bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7
Can DBC 和 Autosar ARXML,它们都采用的是 lsb0 的 bit numbering。
2.4.2 编码补充-Endianness
大小端编码都不影响一个字节内的数据位置,改变的是跨字节时数据的前后排列关系。
字节内始终采用 lsb0,即,信号高有效位在字节内的高位, 信号低有效位在字节内的低位。
对于数据 0x1234,二进制为 0001 0010 0011 0100,高字节为 0x12,低字节为 0x34。msb 为 0001 的首个 0, lsb 为 0100 的最后一个 0。
Intel\小端: 从 lsb 开始延地址增加方向顺序排列,直到排到 msb
Motorola\大端:在 msb0 视图下,从 msb 开始延地址增加方向顺序排列,直到排到 lsb
2.4.3 lsb0 + motorola 计算公式
bit 从 lsb0 转换到 msb0(或 msb0 转换到 lsb0):b = b - (b % 8) + 7 - (b % 8)
- b - (b % 8) 相当于只取 b 的 3 位之前的数字,得到 b 的字节地址
- 7 - (b % 8) 相当于 b 的后 3 位和 7 做异或运算,因为 7 是3位二进制数中最大的数,设属于 [0, 7] 的任何数为 x,7 - x = y,因为 7 是全 1,所以 y 和 x 一定没有重合的 1,所以 x ^ y = 7,因为 x + y = 7,因此这步可以成为异或操作。在 8 位的情况下,每个位的编码 0 - 7,lsb0 和 msb0 标号的同一个位置,相加永远为 7。整步可以优化为 b ^ 0x7u。
- 相加得到结果
msb0时,从 lsb 转换到 msb:
b = b + 1 - length
msb0时,从 msb 转换到 lsb:
b = b + length - 1
从 lsb0 的 msb 转换到 lsb0 的 lsb:
b = b - (b % 8) + 7 - (b % 8)
b = b + length - 1
b = b - (b % 8) + 7 - (b % 8)
2.4.4 lsb0 + intel 计算公式
lsb -> msb:b = b + Length - 1
msb -> lsb:b = b - (Length - 1)
2.5 CM_ 注解、注释
CM_ Object CANId/NodeName SignalName “Comment”
- Object 表示注解的对象,可以是节点 BU_ 报文 BO_ 消息 SG_
- CANId/NodeName 表示进行注解的对象, 若前面的对象类型是信号或者报文, 则这里的值应为报文的ID(10进制数表示); 若前面的对象类型为节点, 则这里的值应为节点的名字;
- SignalName 报文ID 后跟信号名字,表示对信号的注释
- “Comment” 注释内容
2.6 BA_ 属性定义
BA_DEF_ 对报文、信号、节点的属性定义
- BA_DEF_ Object AttributeName ValueType Min Max;
- BA_DEF_DEF_ AttributeName DefaultValue; 声明属性的默认值
BA 感觉像是属性声明
- BA AttributeName Object [CANId] [NodeName|SignalName|env_var_name] AttributeValue
2.7 VAL_ 信号数值表的定义
VAL_ CANId SignalName N “DefineN” …… 0 “Define0”
该信号的有效值分别用什么符号表示, “DefineN” 代表数值 N