编辑推荐: |
本文主要介绍了CAN通信矩阵之DBC文件格式相关内容。
希望对你的学习有帮助。
本文来自于微信公众号嵌入式软件开发园,由火龙果软件Linda编辑,推荐。 |
|
1. DBC文件简介
之前文章《CAN网络通信矩阵》介绍过,OEM制定CAN通信矩阵一般都是使用excel表格来完成,但是没有统一的格式标准;在实际软件开发测试中,会使用CAN工具来完成CAN通信矩阵数据的收发工作,基于excel文件数据难以实现自动读取不同格式的数据内容,因此行业为CAN通信矩阵规定了一种统一的标准文件DBC文件
DBC文件:全称为Data Base CAN,将CAN网络所需的所有信息都存储在CANdb network
file中,CANdb network file的文件扩展名为DBC
如下图所示为一个DBC文件
2. CANdb++工具简介
CANdb ++是一个数据管理程序,可用于创建和修改网络总线系统中的信息以及信息单元之间的相互关系,即建立DBC文件的软件工具
使用CANdb++打开一个DBC文件,打开示例如下图所示:
关于如何使用CANdb++工具去编辑DBC文件,感兴趣的可以查看相关资料进行学习,本文主要讲解DBC文件格式内容,让大家了解DBC文件格式,从而从原理上了解如何将一个CAN矩阵excell表格,通过脚本,自动生成一个DBC文件,为接下来分享自动化脚本工具做铺垫
3. DBC文件格式
通过记事本的方法,打开一个DBC文件,呈现的内容格式如下:
上述使用的DBC文件内容如下,将内容复制到一个.txt文件中,将文件后缀格式转换成.dbc文件,就制作了一个DBC文件,可以通过CANdb++工具打开编辑,也可以加载到CAN工具数据库中,读取相关数据内容
VERSION "" 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_: DCDC VCU OBD
VAL_TABLE_ Package_Num_Value 1 "No.2" 0 "N0.1" ; VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ; VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ; BO_ 530 Test_ID_212: 8 OBD SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-" VCU BO_ 529 Test_ID_211: 8 OBD SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-" DCDC,VCU SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A" DCDC,VCU SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V" DCDC,VCU CM_ BU_ DCDC "DCDC node in CAN network"; CM_ BU_ VCU "VCU node in can network"; CM_ BU_ OBD "OBD node in CAN network"; CM_ BO_ 530 "The CAN_ID of the test message is 0x212."; CM_ SG_ 530 Voltage_6_Value "Value of Voltage_6."; CM_ SG_ 530 Voltage_5_Value "Value of Voltage_5."; CM_ SG_ 530 Voltage_4_Value "Value of Voltage_4."; CM_ SG_ 530 Voltage_3_Value "Value of Voltage_3."; CM_ SG_ 530 Voltage_2_Value "Value of Voltage_2."; CM_ SG_ 530 Voltage_1_Value "Value of Voltage_1."; CM_ SG_ 530 Package_Num "Number of Voltage."; CM_ BO_ 529 "The CAN_ID of the test message is 0x211."; CM_ SG_ 529 OBD_status "OBD working status signal."; CM_ SG_ 529 Current_value "OBD current signal."; CM_ SG_ 529 Voltage_value "OBD voltage signal."; BA_DEF_ SG_ "ProjectSignalRequirementNb" STRING ; BA_DEF_ SG_ "GenSigStartValue" HEX 0 0; BA_DEF_ SG_ "GenericSignalRequirementNb" STRING ; BA_DEF_ "Manufacturer" STRING ; BA_DEF_ BO_ "ProjectFrameRequirementNb" STRING ; BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","OnEvent","Cyclic_And_OnEvent"; BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65535; BA_DEF_ BO_ "GenericFrameRequirementNb" STRING ; BA_DEF_ "BusType" STRING ; BA_DEF_DEF_ "ProjectSignalRequirementNb" ""; BA_DEF_DEF_ "GenSigStartValue" 0; BA_DEF_DEF_ "GenericSignalRequirementNb" ""; BA_DEF_DEF_ "Manufacturer" "BMW"; BA_DEF_DEF_ "ProjectFrameRequirementNb" ""; BA_DEF_DEF_ "GenMsgSendType" "Cyclic"; BA_DEF_DEF_ "GenMsgCycleTime" 0; BA_DEF_DEF_ "GenericFrameRequirementNb" ""; BA_DEF_DEF_ "BusType" "CAN"; BA_ "GenMsgSendType" BO_ 530 2; BA_ "GenMsgCycleTime" BO_ 530 1000; BA_ "GenMsgSendType" BO_ 529 1; BA_ "GenMsgCycleTime" BO_ 529 100; BA_ "GenSigStartValue" SG_ 530 Voltage_6_Value 3000; BA_ "GenSigStartValue" SG_ 530 Voltage_5_Value 3000; BA_ "GenSigStartValue" SG_ 530 Voltage_4_Value 3000; BA_ "GenSigStartValue" SG_ 530 Voltage_3_Value 3000; BA_ "GenSigStartValue" SG_ 530 Voltage_2_Value 3000; BA_ "GenSigStartValue" SG_ 530 Voltage_1_Value 3000; BA_ "GenSigStartValue" SG_ 529 OBD_status 2; BA_ "GenSigStartValue" SG_ 529 Current_value 0; BA_ "GenSigStartValue" SG_ 529 Voltage_value 768; VAL_ 530 Package_Num 1 "No.2" 0 "N0.1" ; VAL_ 529 OBD_status 2 "Shutdown" 1 "Run" 0 "Initialization" ; VAL_ 529 Voltage_value 65535 "Invalid voltage" ;
|
接下来我们来逐一拆解这些关键字,了解各部分内容含义
3.1 符号字符串
DBC文件中除了固定格式的关键字外,还有一些用户自定义的符号字符串,像Node,Message,Signal的命名,其要求为:
以字母字符或下划线开头,并由字母,数字和下划线组成
长度最多为128个字符,为了与较旧的工具兼容,长度最好不得超过32个字符
3.2 标头
关键字:VERSION :版本信息,后面加双引号,双引号中的内容可以为空,也可以是满足要求的字符串命名
关键字:NS_ ,全称:new symbols,新符号条目,该部分格式基本是固定,具体的含义可以不用了解
VERSION "" 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_
|
3.3 Bit Timing 波特率
关键字:BS_ :Bit Timing定义了网络的波特率和BTR寄存器的设置
该部分已过时,不再使用,后面可以不用添加任何信息,但是关键字 BS_必须出现在DBC文件中,不可省略,例如:
3.4 Node 节点定义
关键字:BU_
格式:BU_: node_1_name node_2_name…
描述:
CAN网络汇中所有节点的名称在此处定义,且定义的名称必须唯一,节点不是必须包含的,也可以没有任何节点信息
节点与节点之间以空格分隔
节点的命名必须满足 符号字符串 要求
举例:定义包含两个节点:VCU和OBD,其在DBC文件中的描述为
3.5 Value Table 值表定义
关键字:VAL_TABLE_
格式:
VAL_TABLE_ value_table_name value_table_value “value_description” …0 “value_description”;
|
描述:
一个value table中以空格分隔
value_table_name 表示 value table 的名称,命名必须满足符号字符串要求
value_table_value 表示 value table 的值,十进制表示
value_description 表示 value table 的值描述
当一个 value table 存在多个值描述时,以 :value_table_value “value_description”
的形式接着追加,value table内的两个值描述以空格分隔
完成一个value table定义,需以分号;结尾
多个value table需要换行
Value Table值表内容可以完全不存在
举例:
VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ; VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;
|
3.6 Message 报文定义
关键字:BO_
格式:
BO_ message_id message_name: message_size transmitter
|
描述:
message_id 表示 CAN_ID,以十进制表示,在DBC文件中,CAN_ID必须唯一
message_name 表示 CAN_ID 的消息名称,在在Message中必须是唯一,命名必须满足符号字符串要求
冒号 : 不能少
message_size 表示 Message 消息的长度,以字节为单位,十进制表示
transmitter 表示该 Message 的发送节点,如果Message没有定义发送节点,则必须在此处输入字符串Vector__XXX
举例
BO_ 530 Test_ID_212: 8 OBD
|
3.7 Signal信号定义
多个信号包含在一个报文中,信号紧跟在 Message 报文后
关键字:SG_
格式:
SG_ signal_name multiplexer_indicator : start_bit|signal_size@byte_order+value_type (factor,offset) [minimum|maximum] “unit” receiver
|
描述:
M(大写)将信号定义为 Multiplexor Signal,一个消息中只有一个信号可以是Multiplexor
Signal
m(小写)后跟无符号整数,将信号定义为Multiplexed Signal
省略后,默认将信号定义为普通的Signal,表示没有复用
signal_name 表示 信号的名称,一个Message消息中的信号名称必须唯一,多个Message消息之间可以存在相同名称信号;命名必须满足
符号字符串要求
multiplexer_indicator ,信号复用含义:
冒号:不能少
start_bit 值指定信号在帧的数据域内的位置编号,具体和Intel格式还是Motorola格式和采用的大小端有关
符号|不能少
signal_size 表示信号的长度,以位为单位,十进制表示
符号@不能少
byte_order 表示 字节顺序,如果信号的字节顺序为Intel(小端),则byte_order
为 1;如果字节顺序为Motorola(大端),则byte_order 为 0
value_type 表示值类型,+表示无符号;-表示有符号
(factor,offset) 表示增益和偏移量,这两个值于该信号的原始值与物理值之间的转换;转换如下:物理值
= 原始值* factor + offset
[minimum | maximum] 表示 最小值和最大值,定义了信号的有效物理值的范围
unit 表示 信号的单位,为字符串类型,无单位可以任意字符填充,如"_"
receiver 表示 信号的接收方,信号的接收方可以是多个节点,接收方节点名称必须在关键字BU_中定义;如果信号没有定义接收方,则必须在此处输入字符串Vector__XXX
举例:
BO_ 530 Test_ID_212: 8 OBD SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-" VCU
|
3.8 Comment注释定义
关键字:CM_
1. Node节点的注释举例
格式:
CM_ BU_ node_name “Comment”;
|
举例:
CM_ BU_ VCU "VCU node in can network"; CM_ BU_ OBD "OBD node in CAN network";
|
2 . Message消息的注释举例
格式:
CM_ BO_ message_id “Comment”;
|
举例:
CM_ BO_ 529 "The CAN_ID of the test message is 0x211";
|
3. Signal信号的注释举例
格式:
CM_ SG_ message_id signal_name “Comment”;
|
举例:
CM_ SG_ 529 OBD_status "OBD working status signal"; CM_ SG_ 529 Current_value "OBD current signal"; CM_ SG_ 529 Voltage_value "OBD voltage signal";
|
Comment注释定义是非必要信息,可以省略,一般省略节点注释和Message报文注释,添加信号注释可以
3.9 User Defined Attribute
User defined attributes :用户自定义的属性定义,是扩展DBC文件的对象属性的一种方法;这些附加属性必须使用具有属性默认值的属性定义来定义
对于具有属性定义的值的每个对象,必须定义一个属性值;如果未对对象定义属性值,则该对象的属性值为该属性的默认值
1. Attribute属性定义
关键字:BA_DEF_
关键字:BA_DEF_DEF_
格式:
BA_DEF_ object_type “attribute_name” attribute_value_type ; BA_DEF_DEF_ attribute_name attribute_value ;
|
描述:
object_type 表示 BU_,BO_,SG_,EV_等关键字
attribute_name 表示 属性的名称,一般比较固定,参照相应的标准
attribute_value_type 表示 INT、FLOAT,STRING,ENUM,HEX等数据类型
attribute_value 表示 unsigned_integer ,signed_integer,double
,char_string
完成一个Attribute,需以分号;结尾
多个Attribute与信号绑定需要换行
举例:
BA_DEF_ SG_ "ProjectSignalRequirementNb" STRING ; BA_DEF_ SG_ "GenSigStartValue" HEX 0 0; BA_DEF_ "Manufacturer" STRING ; BA_DEF_ BO_ "ProjectFrameRequirementNb" STRING ; BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","OnEvent","Cyclic_And_OnEvent"; BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65535; BA_DEF_ BO_ "GenericFrameRequirementNb" STRING ; BA_DEF_DEF_ "GenSigStartValue" 0; BA_DEF_DEF_ "GenMsgSendType" "Cyclic"; BA_DEF_DEF_ "GenMsgCycleTime" 0;
|
2. Attribute属性值
关键字:BA_
格式:
BA_ attribute_name BU_ node_name attribute_value; BA_ attribute_name BO_ message_id attribute_value; BA_ attribute_name SG_ message_id signal_name attribute_value; BA_ attribute_name EV_ env_var_name attribute_value;
|
举例:
BA_ "GenMsgSendType" BO_ 530 2; BA_ "GenMsgCycleTime" BO_ 530 1000; BA_ "GenSigStartValue" SG_ 529 OBD_status 2;
|
|