01什么是DBC
DBC是Database Can的缩写,其代表的是CAN的数据库文件,在这个文件中把CAN通讯的信息定义的非常完整清楚,而CAN网络的通讯就是依据这个文件的描述进行的,所以DBC文件的作用非常强大,正是因为有了它才可以使得整个CAN网路的节点控制器无差错的协同同步开发。
DBC数据库文件是用来描述CAN网络节点间数据通讯的一种文件,包含了CAN总线协议中协议数据及其所代表的具体意义。
简单的讲,dbc文件描述了在CAN网络上有哪些报文信息;这些报文上又携带了哪些信号信息;该报文是从哪个节点发出,哪个节点进行接收的等信息。
是通讯的核心文件,通过创建一个DBC文件可以使你非常深刻的理解文件所包含的含义,同时有助于你理解已经存在的DBC文件,本质上都是相通的。
DBC是vector公司定义的can网络通信文件格式,vector的规范《DBC File Format Document》从下面链接获得
百度网盘:https://pan.baidu.com/s/1GUvfEHv1NQbJ2bL2e7ZL5w 提取码:d622
02DBC文件长什么样
Version 和 new_symbols
如下图,Dbc文件头部包含着”version”与”new symbol”的信息
- version信息可以为空,也可以由用户自定定义;
- new symbol信息在我们创建dbc文件时就已经自动生成,所以这一部分的信息我们无需过多留意,一般默认即可
波特率BS_
BS:[baudrate:BTR1,BTR2];
其中BS为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略(如下图例子中即把该部分省略了)
网络节点定义BU_
BU: Nodename1 Nodename2 Nodename3 ……
BU 为关键字,表示网络节点
Nodename1、Nodename2 网络节点名字,由用户自己定义;(需要保证节点命名的唯一性)
举例:
BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX :
表示定义了:
VCU_Vehicle_Control_Unit
MotorCtrol
SCU
PC
Vector__XXX这五个网络节点
报文帧的定义BO_
BO MessageId(10进制数表示) MessageName: MessageSize Transmitter
BO 为关键字,表示报文;
- MessageId 报文ID,是以10进制数表示的;(如例子中的996,代表报文ID为0x3E4,是longlong类型,也就是CAN ID的值;)
- MessageName 报文的名字,命名规则和C语言变量相同;
- MessageSize 报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节;
- Transmitter 该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”。
举例:
BO_ 201959408 MSG1: 8 VCU_Vehicle_Control_Unit
报文ID:201959408(0xC09A7F0)
报文名:MSG1
分隔符 : “:”
报文长度:8字节
信号的定义SG_
SG SignalName (SigTypeDefinition) : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver
SG 为关键字,表示信号;
SignalName(SigTypeDefinition) : 表示该信号的名字 和 多路选择信号的定义;
SigTypeDefinition是可选项,有3种格式:
- a)空,表示普通信号。
- b)M,表示多路选择器信号。
- c)m50,表示被多路选择器选择的信号,50,表示当M定义的信号的值等于50的时候,该报文使用此通路。
StartBit、 SignalSize 表示该信号起始位、信号长度;
ByteOrder 表示信号的字节顺序:0代表Motorola格式,1代表Inter格式;
ValueType 表示该信号的数值类型:+表示无符号数,-表示有符号数;
Factor,Offset 表示因子,偏移量;这两个值用于信号的原始值与物理值之间的转换
转换如下:物理值=原始值*因子+偏移量;
Min|Max 表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为double类型;
Unit 表示该信号的物理单位,为字符串类型;
Receiver 表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为” Vector__XXX”
举例子:
SG_ AngRateZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
AngRateZ表示定义了一个命名为AngRateZ的普通信号,40|20其起始位是第40位,信号长度20 bit;
1信号是Inter格式,-数值类型为有符号类型数;因子为0.01,偏移量为0;信号取值范围为-500|500;
信号物理单位为字符串”deg/s”;该信号接收节点没有指定,所以就是Vector__XXX
注解部分CM_
CM Object MessageId/NodeName “Comment”
CM 为关键字,表示注解信息;
Object 表示进行注解的对象类型,可以是节点“BU”、报文“BO”、消息”SG_”;
MessageId/NodeName 表示进行注解的对象,
- 若前面的对象类型是信号或者报文,则这里的值应为报文的ID(10进制数表示);
若前面的对象类型为节点,则这里的值应为节点的名字;
Comment 表示进行注解的文本信息;
举个例子: ```c CM SG 996 HUD_HeightLv “Control hud height level”
表示对ID为996(0x3E4)这条报文下的名为”HUD_HeightLv ”的信号进行注解说明,说明的内容为”Control hud height level”。
注释以 “” 包围,注释内部不允许出现“号。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/29409159/1670679898539-0d69b2bd-4a41-463f-a4fd-3700161ffa5a.png#averageHue=%23f2efed&clientId=u6c56ff66-0dfb-4&from=paste&height=283&id=u65433f37&originHeight=399&originWidth=1457&originalType=url&ratio=1&rotation=0&showTitle=false&size=109405&status=done&style=none&taskId=u0405f1a5-0484-43d0-8113-20623eb1790&title=&width=1035)
<a name="wwDCW"></a>
## 特征(属性)定义部分**BA_**
**BA_DEF_ 特征名称类型定义**
```c
BA_DEF_ Object AttributeName ValueType Min Max;
BA_DEF 标签
Object 特征类型,可以是BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义);
AttributeName 特征名称(C语言变量格式)
ValueType 特征值类型(只能是十进制、十六进制、浮点数、枚举、字符5种类型)
Min Max 数值类型这里出现范围,枚举类型这里是枚举值,字符类型,这里是空。
BADEF_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_
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。只有自然数类型的信号才可以使用数值表表示。
03一个实例
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_: IMU
BO_ 814 Latitude: 8 Vector__XXX
SG_ PosLat2 : 0|64@1- (1E-008,0) [-90|90] "deg" Vector__XXX
BO_ 813 Longitude: 8 Vector__XXX
SG_ PosLon2 : 0|64@1- (1E-008,0) [-180|180] "deg" Vector__XXX
BO_ 812 AngRateVehicle: 8 IMU
SG_ AngRateZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
SG_ AngRateY : 20|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
SG_ AngRateX : 0|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
BO_ 811 HeadingPitchRollSigma: 8 IMU
SG_ AngleRollSigma : 40|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
SG_ AnglePitchSigma : 20|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
SG_ AngleHeadingSigma : 0|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
BO_ 810 HeadingPitchRoll: 6 IMU
SG_ AngleRoll : 32|16@1- (0.01,0) [-180|180] "deg" Vector__XXX
SG_ AnglePitch : 16|16@1- (0.01,0) [-90|90] "deg" Vector__XXX
SG_ AngleHeading : 0|16@1+ (0.01,0) [0|360] "deg" Vector__XXX
BO_ 809 Accel_Vehicle: 8 IMU
SG_ AccelZ : 40|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
SG_ AccelY : 20|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
SG_ AccelX : 0|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
BO_ 808 VelocityLevelSigma: 8 IMU
SG_ VelSigma : 48|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
SG_ VelUSigma : 32|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
SG_ VelNSigma : 16|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
SG_ VelESigma : 0|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
BO_ 800 Time: 6 IMU
SG_ GpsTime : 16|32@1- (0.001,0) [0|2147483.647] "s" Vector__XXX
SG_ GpsWeek : 0|16@1+ (1,0) [0|65535] "w" Vector__XXX
BO_ 807 VelocityLevel: 8 IMU
SG_ Vel : 48|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
SG_ VelU : 32|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
SG_ VelN : 16|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
SG_ VelE : 0|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
BO_ 806 PosSigma: 8 IMU
SG_ PosUsigma : 40|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
SG_ PosNsigma : 20|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
SG_ PosESigma : 0|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
BO_ 805 Altitude: 4 IMU
SG_ PosAlt : 0|32@1- (0.001,0) [-2147483.648|2147483.648] "m" Vector__XXX
BO_ 804 LatitudeLongitude: 8 IMU
SG_ PosLon : 32|32@1- (1E-007,0) [-214.7483648|214.7483648] "deg" Vector__XXX
SG_ PosLat : 0|32@1- (1E-007,0) [-214.7483648|214.7483648] "deg" Vector__XXX
BO_ 803 InsStatus: 8 IMU
SG_ GpsNumSats2 : 56|8@1+ (1,0) [0|255] "" Vector__XXX
SG_ GpsNumSats : 48|8@1+ (1,0) [0|255] "" Vector__XXX
SG_ GpsAge : 32|16@1+ (0.01,0) [0|655.35] "" Vector__XXX
SG_ GpsNumSats2Used : 24|8@1+ (1,0) [0|255] "" Vector__XXX
SG_ system_state : 0|8@1+ (1,0) [0|9] "" Vector__XXX
SG_ satellite_status : 16|8@1+ (1,0) [0|9] "" Vector__XXX
SG_ GpsNumSatsUsed : 8|8@1+ (1,0) [0|255] "" Vector__XXX
BO_ 802 Accel_IMU_Raw: 8 IMU
SG_ AccelRawZ : 40|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
SG_ AccelRawY : 20|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
SG_ AccelRawX : 0|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
BO_ 801 Ang_Rate_Raw_IMU: 8 IMU
SG_ AngRateRawZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
SG_ AngRateRawY : 20|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
SG_ AngRateRawX : 0|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
BA_DEF_ SG_ "GenSigInactiveValue" INT 0 0;
BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","not_used","not_used","not_used","not_used","Cyclic","not_used","IfActive","NoMsgSendType";
BA_DEF_ BU_ "NmStationAddress" HEX 0 0;
BA_DEF_ "DBName" STRING ;
BA_DEF_ "BusType" STRING ;
BA_DEF_ BU_ "NodeLayerModules" STRING ;
BA_DEF_ BU_ "ECU" STRING ;
BA_DEF_ BU_ "CANoeJitterMax" INT 0 0;
BA_DEF_ BU_ "CANoeJitterMin" INT 0 0;
BA_DEF_ BU_ "CANoeDrift" INT 0 0;
BA_DEF_ BU_ "CANoeStartDelay" INT 0 0;
BA_DEF_DEF_ "GenSigSendType" "Cyclic";
BA_DEF_DEF_ "GenSigInactiveValue" 0;
BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
BA_DEF_DEF_ "NmStationAddress" 0;
BA_DEF_DEF_ "DBName" "";
BA_DEF_DEF_ "BusType" "CAN";
BA_DEF_DEF_ "NodeLayerModules" "";
BA_DEF_DEF_ "ECU" "";
BA_DEF_DEF_ "CANoeJitterMax" 0;
BA_DEF_DEF_ "CANoeJitterMin" 0;
BA_DEF_DEF_ "CANoeDrift" 0;
BA_DEF_DEF_ "CANoeStartDelay" 0;
BA_ "DBName" "CANProtocol";
SIG_VALTYPE_ 800 GpsTime : 1;