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文件长什么样

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

Version 和 new_symbols

如下图,Dbc文件头部包含着”version”与”new symbol”的信息

  • version信息可以为空,也可以由用户自定定义;
  • new symbol信息在我们创建dbc文件时就已经自动生成,所以这一部分的信息我们无需过多留意,一般默认即可

image.png


波特率BS_

BS:[baudrate:BTR1,BTR2];
其中BS
为关键字,用于定义CAN网络的波特率;[ ]内容表示为可选部分,可以省略(如下图例子中即把该部分省略了)
image.png

网络节点定义BU_

BU: Nodename1 Nodename2 Nodename3 ……
BU
为关键字,表示网络节点
Nodename1、Nodename2 网络节点名字,由用户自己定义;(需要保证节点命名的唯一性)
举例:

  1. BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX
  2. 表示定义了:
  3. VCU_Vehicle_Control_Unit
  4. MotorCtrol
  5. SCU
  6. PC
  7. Vector__XXX这五个网络节点

在CAN总线上就是这样的:
image.png

报文帧的定义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”。

举例:

  1. BO_ 201959408 MSG1: 8 VCU_Vehicle_Control_Unit
  2. 报文ID2019594080xC09A7F0
  3. 报文名:MSG1
  4. 分隔符 : “:”
  5. 报文长度:8字节

image.png

信号的定义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”
举例子:

  1. SG_ AngRateZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  2. AngRateZ表示定义了一个命名为AngRateZ的普通信号,40|20其起始位是第40位,信号长度20 bit
  3. 1信号是Inter格式,-数值类型为有符号类型数;因子为0.01,偏移量为0;信号取值范围为-500|500
  4. 信号物理单位为字符串”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”。

  1. 注释以 “” 包围,注释内部不允许出现“号。<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)
  2. <a name="wwDCW"></a>
  3. ## 特征(属性)定义部分**BA_**
  4. **BA_DEF_ 特征名称类型定义**
  5. ```c
  6. BA_DEF_ Object AttributeName ValueType Min Max;
  7. BA_DEF 标签
  8. Object 特征类型,可以是BU_(节点特征定义)、BO_(报文特征定义)、SG_(信号特征定义)、空格(项目特征定义);
  9. AttributeName 特征名称(C语言变量格式)
  10. ValueType 特征值类型(只能是十进制、十六进制、浮点数、枚举、字符5种类型)
  11. Min Max 数值类型这里出现范围,枚举类型这里是枚举值,字符类型,这里是空。

image.png
BADEF_DEF 特征默认值定义

  1. BA_DEF_DEF_ AttributeName DefaultValue;
  2. BA_DEF_DEF_ 标签
  3. AttributeName 特征名称(C语言变量格式)
  4. DefaultValue 该特征的默认设置值

image.png
BA_ 特征项目设置值定义

  1. BA_ AttributeName projectValue;
  2. BA_ 标签
  3. AttributeName 特征名称(C语言变量格式)
  4. projectValue 该特征的设置值

image.png
举例:

  1. 举例:
  2. BA_DEF_ BO_ GenMsgCycleTime INT 0 65535;
  3. BA_DEF_DEF_ GenMsgCycleTime 2200;
  4. BA_ GenMsgCycleTime BO_ 400 100;
  5. 表示对定义了一个针对消息类型的特征,特征名为”GenMsgCycleTime”,特征值是整型数据,取值范围在065535之间;
  6. 默认值为2200
  7. 项目设置值 CAN ID ==400的消息的该特征值设置为100

数值表部分VAL_

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

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

image.png

03一个实例

  1. VERSION ""
  2. NS_ :
  3. NS_DESC_
  4. CM_
  5. BA_DEF_
  6. BA_
  7. VAL_
  8. CAT_DEF_
  9. CAT_
  10. FILTER
  11. BA_DEF_DEF_
  12. EV_DATA_
  13. ENVVAR_DATA_
  14. SGTYPE_
  15. SGTYPE_VAL_
  16. BA_DEF_SGTYPE_
  17. BA_SGTYPE_
  18. SIG_TYPE_REF_
  19. VAL_TABLE_
  20. SIG_GROUP_
  21. SIG_VALTYPE_
  22. SIGTYPE_VALTYPE_
  23. BO_TX_BU_
  24. BA_DEF_REL_
  25. BA_REL_
  26. BA_DEF_DEF_REL_
  27. BU_SG_REL_
  28. BU_EV_REL_
  29. BU_BO_REL_
  30. SG_MUL_VAL_
  31. BS_:
  32. BU_: IMU
  33. BO_ 814 Latitude: 8 Vector__XXX
  34. SG_ PosLat2 : 0|64@1- (1E-008,0) [-90|90] "deg" Vector__XXX
  35. BO_ 813 Longitude: 8 Vector__XXX
  36. SG_ PosLon2 : 0|64@1- (1E-008,0) [-180|180] "deg" Vector__XXX
  37. BO_ 812 AngRateVehicle: 8 IMU
  38. SG_ AngRateZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  39. SG_ AngRateY : 20|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  40. SG_ AngRateX : 0|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  41. BO_ 811 HeadingPitchRollSigma: 8 IMU
  42. SG_ AngleRollSigma : 40|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
  43. SG_ AnglePitchSigma : 20|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
  44. SG_ AngleHeadingSigma : 0|20@1+ (0.0001,0) [0|100] "deg" Vector__XXX
  45. BO_ 810 HeadingPitchRoll: 6 IMU
  46. SG_ AngleRoll : 32|16@1- (0.01,0) [-180|180] "deg" Vector__XXX
  47. SG_ AnglePitch : 16|16@1- (0.01,0) [-90|90] "deg" Vector__XXX
  48. SG_ AngleHeading : 0|16@1+ (0.01,0) [0|360] "deg" Vector__XXX
  49. BO_ 809 Accel_Vehicle: 8 IMU
  50. SG_ AccelZ : 40|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
  51. SG_ AccelY : 20|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
  52. SG_ AccelX : 0|20@1- (0.0001,0) [-8|8] "g" Vector__XXX
  53. BO_ 808 VelocityLevelSigma: 8 IMU
  54. SG_ VelSigma : 48|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
  55. SG_ VelUSigma : 32|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
  56. SG_ VelNSigma : 16|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
  57. SG_ VelESigma : 0|16@1+ (0.001,0) [0|65.535] "m/s" Vector__XXX
  58. BO_ 800 Time: 6 IMU
  59. SG_ GpsTime : 16|32@1- (0.001,0) [0|2147483.647] "s" Vector__XXX
  60. SG_ GpsWeek : 0|16@1+ (1,0) [0|65535] "w" Vector__XXX
  61. BO_ 807 VelocityLevel: 8 IMU
  62. SG_ Vel : 48|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
  63. SG_ VelU : 32|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
  64. SG_ VelN : 16|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
  65. SG_ VelE : 0|16@1- (0.01,0) [-327.68|327.67] "m/s" Vector__XXX
  66. BO_ 806 PosSigma: 8 IMU
  67. SG_ PosUsigma : 40|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
  68. SG_ PosNsigma : 20|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
  69. SG_ PosESigma : 0|20@1+ (0.0001,0) [0|100] "m" Vector__XXX
  70. BO_ 805 Altitude: 4 IMU
  71. SG_ PosAlt : 0|32@1- (0.001,0) [-2147483.648|2147483.648] "m" Vector__XXX
  72. BO_ 804 LatitudeLongitude: 8 IMU
  73. SG_ PosLon : 32|32@1- (1E-007,0) [-214.7483648|214.7483648] "deg" Vector__XXX
  74. SG_ PosLat : 0|32@1- (1E-007,0) [-214.7483648|214.7483648] "deg" Vector__XXX
  75. BO_ 803 InsStatus: 8 IMU
  76. SG_ GpsNumSats2 : 56|8@1+ (1,0) [0|255] "" Vector__XXX
  77. SG_ GpsNumSats : 48|8@1+ (1,0) [0|255] "" Vector__XXX
  78. SG_ GpsAge : 32|16@1+ (0.01,0) [0|655.35] "" Vector__XXX
  79. SG_ GpsNumSats2Used : 24|8@1+ (1,0) [0|255] "" Vector__XXX
  80. SG_ system_state : 0|8@1+ (1,0) [0|9] "" Vector__XXX
  81. SG_ satellite_status : 16|8@1+ (1,0) [0|9] "" Vector__XXX
  82. SG_ GpsNumSatsUsed : 8|8@1+ (1,0) [0|255] "" Vector__XXX
  83. BO_ 802 Accel_IMU_Raw: 8 IMU
  84. SG_ AccelRawZ : 40|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
  85. SG_ AccelRawY : 20|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
  86. SG_ AccelRawX : 0|20@1- (0.0001,0) [-50|50] "g" Vector__XXX
  87. BO_ 801 Ang_Rate_Raw_IMU: 8 IMU
  88. SG_ AngRateRawZ : 40|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  89. SG_ AngRateRawY : 20|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  90. SG_ AngRateRawX : 0|20@1- (0.01,0) [-500|500] "deg/s" Vector__XXX
  91. BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
  92. BA_DEF_ SG_ "GenSigInactiveValue" INT 0 0;
  93. BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0;
  94. BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","not_used","not_used","not_used","not_used","Cyclic","not_used","IfActive","NoMsgSendType";
  95. BA_DEF_ BU_ "NmStationAddress" HEX 0 0;
  96. BA_DEF_ "DBName" STRING ;
  97. BA_DEF_ "BusType" STRING ;
  98. BA_DEF_ BU_ "NodeLayerModules" STRING ;
  99. BA_DEF_ BU_ "ECU" STRING ;
  100. BA_DEF_ BU_ "CANoeJitterMax" INT 0 0;
  101. BA_DEF_ BU_ "CANoeJitterMin" INT 0 0;
  102. BA_DEF_ BU_ "CANoeDrift" INT 0 0;
  103. BA_DEF_ BU_ "CANoeStartDelay" INT 0 0;
  104. BA_DEF_DEF_ "GenSigSendType" "Cyclic";
  105. BA_DEF_DEF_ "GenSigInactiveValue" 0;
  106. BA_DEF_DEF_ "GenMsgCycleTime" 0;
  107. BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
  108. BA_DEF_DEF_ "NmStationAddress" 0;
  109. BA_DEF_DEF_ "DBName" "";
  110. BA_DEF_DEF_ "BusType" "CAN";
  111. BA_DEF_DEF_ "NodeLayerModules" "";
  112. BA_DEF_DEF_ "ECU" "";
  113. BA_DEF_DEF_ "CANoeJitterMax" 0;
  114. BA_DEF_DEF_ "CANoeJitterMin" 0;
  115. BA_DEF_DEF_ "CANoeDrift" 0;
  116. BA_DEF_DEF_ "CANoeStartDelay" 0;
  117. BA_ "DBName" "CANProtocol";
  118. SIG_VALTYPE_ 800 GpsTime : 1;

参考

DBC文件到底是个啥
DBC文件解析_bitbug123的博客-CSDN博客_dbc解析