DBC的结构详细分析

DBC的结构详细分析

目录

DBC文件的构成:

关键字:

本文出现的符号:

波特率的结构(BS_):

网络节点的结构(BU_):

消息的结构(BO_):

信号的结构(SG_):

注解的结构(CM_):

报文/信号/节点等的属性定义(BA_DEF_)

报文/信号/节点等的属性设置值定义(BA_)

数值表的结构(VAL_):

全局信号值表(用来对信号值解码)的结构(VAL_TABLE_):


DBC文件的构成:

  • Bit_timing 波特率定义,必须部分,但通常为空
  • nodes 定义网络节点
  • messages 定义消息和信号

关键字:

  • VERSION

                版本

                VERSION:

  • NS_

                为new symbol的缩写,后面紧跟着一堆ns,一般是创建dbc时自动生成,不用太关心

                NS_:

  • BS_

                定义CAN网络的波特率

                BS_: [baudrate:BTR1,BTR2]

  • BU_

                网络节点

                BU_: Nodename1 Nodename2 Nodename3 ……

  • BO_

                报文

                BO_:  message_id message_name : message_size transmitter {signal}

  • SG_

                信号

                SG_: signal_name multiplexer_indicator : start_bit | signal_size @ byte_order value_type ( factor , offset ) [ minimum | maximum ] unit receiver {, receiver}

  • CM_

                对报文/信号的注解

                CM_: Object MessageId/NodeName “Comment”

  • BA_DEF_

                对报文/信号/节点等的属性定义

                BA_DEF: _ Object AttributeName ValueType Min Max;

  • BA_DEF_ DEF_

                对报文/信号/节点等的属性初始值定义

                BA_DEF_DEF_: AttributeName DefaultValue;

  • BA_

                对报文/信号/节点等的属性设置值定义

                BA_: AttributeName projectValue

  • VAL_

                数值表定义

                VAL_: MessageId SignalName N “DefineN” …… 0 “Define0”

  • VAL_TABLE_

                全局信号值表,用来对信号值解码

                VAL_TABLE_: name value “value_description” …0 “value_description”

  • EV_

                环境变量

                EV_:

本文出现的符号:

  • ' | ' ——可选择
  • ' ; '——结束定义
  • [...]——内容可选(01次)
  • {...}——内容重复(0或多次)
  • (...)——注释
  • unsigned_integer:无符号整型
  • signed_integer:有符号整型
  • double:双精度小数
  • char_string:字符串
  • C_identifierC语言变量命名

波特率的结构(BS_):

BS_: [baudrate:BTR1,BTR2];

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

网络节点的结构(BU_):

BU_:  Nodename1 Nodename2 Nodename3 ……

BU_: GW ESC SAS ACU FRS FVCM

解释:

BU_                         为关键字,表示网络节点

Nodename1Nodename2    网络节点名字,由用户自己定义;

注意事项:需要保证节点命名的唯一性

如示例中的BU_: VCU_Vehicle_Control_Unit MotorCtrol SCU PC Vector__XXX

表示定义了:

      VCU_Vehicle_Control_Unit

      MotorCtrol

      SCU

      PC

      Vector__XXX这五个网络节点

其中:标识为Vector__XXX时表示未指明具体节点

消息的结构(BO_):

BO_ message_id message_name : message_size transmitter {signal}

BO_ 306 YRS2: 8 FVCM

解释:

BO_             为关键字,表示报文;

MessageId       报文ID,是以10进制数表示的;

(如例子中的996,代表报文ID0x3E4,是longlong类型,也就是CAN ID的值;)

MessageName   报文的名字,命名规则和C语言变量相同;

MessageSize     报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节;

Transmitter      该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”

如示例中的BO_ 201959408 MSG1: 8 VCU_Vehicle_Control_Unit

    报文ID2019594080xC09A7F0

    报文名:MSG1

    分隔符 : “:”

    报文长度:8字节

    报文发送者:VCU_Vehicle_Control_Unit

(由VCU_Vehicle_Control_Unit这个节点发出的,数据域长度为8字节,ID2019594080xC09A7F0),名字命名为MSG1的报文)

信号的结构(SG_):

SG_ signal_name multiplexer_indicator : start_bit | signal_size @ byte_order value_type ( factor , offset ) [ minimum | maximum ] unit receiver {, receiver}

SG_ YRS2_Checksum : 7|8@0+ (1,0) [0|255] "bit" FRS

SG_ YRS_LongitSensorState : 15|2@0+ (1,0) [0|3] "bit" FRS

SG_ YRS_LongitAcce : 23|16@0+ (0.001,-2) [-2|2] "g" FRS

SG_ YRS_AliveCounter : 59|4@0+ (1,0) [0|15] "bit" FRS

解释:

SG_                               为关键字,表示信号;

SignalName(SigTypeDefinition) :     表示该信号的名字 多路选择信号的定义;

SigTypeDefinition是可选项,有3种格式:

     a)空,表示普通信号。

     bM,表示多路选择器信号。

     cm50,表示被多路选择器选择的信号,50,表示当M定义的信号的值等于50的时候,该报文使用此通路。

StartBit SignalSize                表示该信号起始位、信号长度;

ByteOrder       表示信号的字节顺序:0代表Motorola格式,1代表Inter格式;

ValueType       表示该信号的数值类型:+表示无符号数,-表示有符号数;

FactorOffset   表示因子,偏移量;这两个值用于信号的原始值与物理值之间的转换。

转换如下:物理值=原始值*因子+偏移量;

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;信号取值范围为0160

信号物理单位为字符串”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;信号取值范围为00

信号物理单位为字符串””;该信号接收节点为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;信号取值范围为0160

信号物理单位为字符串”V”;该信号接收节点为EL3160_60,ESC这两个节点。

其中byte_order分为motorolaintel两种格式,motorola对应0intel对应1。这两种格式是区别如下:

如果在同一个字节内,则没有区别,如果跨越多个字节则有区别,motorola格式是高位(msb)在低字节(说明:CAN消息的字节排列Byte0 Byte1 … Byte7Byte0是低字节),intel格式是高位(msb)在高字节。

Intel格式

第一字节的bit0对应的是lsb(第一行的红色箭头),第二字节的bit14对应的是msb(第二行的红色箭头)。起始bitlsb对应的bit0

Motorola格式

第二字节的bit9对应的是lsb(第二行的红色箭头),第一字节的bit7对应的是msb(第一行的红色箭头)。起始bitlsb对应的bit9。当然也可以修改起始位置,例如将起始位置改为bit8,如下图:

55~58行定义的是信号的选项值,其结构如下:'VAL_' message_id signal_name { value_description } ';'

注意,行结尾有一个分号。其中value_description的定义如下:value_description = double char_string ;

以上是需要解析的部分,注意字符部分都限制在32字节内,不太方便。

注解的结构(CM_):

CM_ Object MessageId/NodeNameComment

解释:

CM_       为关键字,表示注解信息;

Object     表示进行注解的对象类型,可以是节点“BU_”、报文“BO_”、消息”SG_”

MessageId/NodeName     表示进行注解的对象,若前面的对象类型是信号或者报文,则这里的值应为报文的ID10进制数表示);若前面的对象类型为节点,则这里的值应为节点的名字;

Comment   表示进行注解的文本信息;

如示例中的 CM_ SG_ 996 HUD_HeightLv “Control hud height level”;

表示对ID996(0x3E4)这条报文下的名为”HUD_HeightLv ”的信号进行注解说明,说明的内容为"Control hud height level"

又如 CM_ BU_ HUD “Head Up Display";表示对HUD这个节点进行注解说明,说明的内容为" Head Up Display "

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

特征(属性)的结构(BA_DEF_  BA_DEF_DEF_  BA_)

和特征相关的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”,特征值是整型数据,取值范围在065535之间;

默认值为2200

项目设置值 CAN ID ==400的消息的该特征值设置为100

DBCView4.3里面是把BA_DEF_ BA_DEF_DEF_合并在一起了,用了特征视图来管理,如下图。

然后把 特征项目设置值定义 BA_ AttributeName projectValue; 和元素合并在一起了。

数值表的结构(VAL_):

格式如下:

VAL_ MessageId SignalName N “DefineN” …… 0 “Define0”;

解释:

VAL_        为关键字,表示数值表定义;

MessageId   表示该信号所属的报文ID10进制数表示);

SignalName  表示信号名;

N “DefineN” …… 0 “Define0”   表示定义的数值表内容,即该信号的有效值分别用什么符号表示

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

表示对ID996(0x3E4)的这条报文下的,一个命名为”HUD_OffSt”的信号,进行其数值表的定义;

用”Active”取代1;用”Not Active”取代0。只有自然数类型的信号才可以使用数值表表示。

信号的值的表示方法有两种:

1 物理值=原始值*因子+偏移量;(常规表示,前面有提到)

2 数字表,用来表示逻辑值;

全局信号值表(用来对信号值解码的结构(VAL_TABLE_):

格式如下:

VAL_TABLE_ value_table_name value_table_valuevalue_description” … 0 “value_description”;

描述:

a)一个value table中以空格分隔;

b)value_table_name表示value table的名称, 命名必须满足符号字符串要求;

c) value_table_value表示value table的值,十进制表示;

d) value_description表示value table的值描述;

e)当一个value table存在多个值描述时,以(value_table_value “value_description”)的形式接着追加,value table内的两个值描述以空格分隔;

f)完成一个value table定义,需以分号;结尾;

g)多个value table需要换行。

VAL_TABLE_ ESC_QDCFRS 1 "ERROR" 0 "NO_ERROR" ;

VAL_TABLE_ ESC_BrakeTempTooHigh 1 "ABNORMAL" 0 "NORMAL" ;

VAL_TABLE_ ESC_DTC_Active 1 "ACTIVE" 0 "INACTIVE" ;

VAL_TABLE_ ESC_Vehiclestandstill 3 "RESERVED" 2 "INVALID" 1 "STANDSTILL" 0 "NOT_STANDSTILL" ;

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java DBC文件解析是指使用Java编程语言对DBC文件进行解析和处理的过程。DBC文件是CAN网络通信协议的描述文件,它定义了CAN协议的消息,信号,节点等信息。 在Java中解析DBC文件涉及到以下几个步骤: 1. 导入相关的Java库:首先需要导入相关的Java库来处理和解析DBC文件。比如,可以使用Apache POI库来读取和解析Excel格式的DBC文件,或者使用自定义的DBC解析库。 2. 读取DBC文件:使用Java代码读取和加载DBC文件,可以将DBC文件读取到内存中,以便后续的解析和处理。 3. 解析DBC文件:解析DBC文件的过程包括解析消息、信号、节点等信息。根据DBC文件的格式和结构,可以使用Java代码逐行解析DBC文件,并将解析的结果存储到相应的数据结构中,比如使用Java的类和对象来表示消息、信号和节点等。 4. 处理和利用解析结果:解析完DBC文件后,可以根据解析结果进行各种操作和处理。例如,可以根据解析的节点信息,生成相应的代码来实现CAN节点的功能;或者根据解析的消息和信号信息,构建CAN消息的发送和接收逻辑。 5. 错误处理和异常处理:在解析DBC文件的过程中,可能会遇到各种错误和异常情况,比如文件路径错误、文件格式错误等。在Java代码中需要适当处理这些错误和异常情况,以保证程序的稳定性和可靠性。 总之,Java DBC文件解析是一项比较复杂的任务,需要熟悉DBC文件的格式和结构,以及相关的Java编程知识和技巧。通过解析和处理DBC文件,可以方便地获取和利用CAN协议的消息和信号等信息,从而实现相应的功能和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值