首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

DBC的结构详细分析

  • 23-11-14 08:43
  • 3730
  • 9716
blog.csdn.net

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_:

本文出现的符号:

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

波特率的结构(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_                         为关键字,表示网络节点

Nodename1、Nodename2    网络节点名字,由用户自己定义;

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

如示例中的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,代表报文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字节

    报文发送者:VCU_Vehicle_Control_Unit

(由VCU_Vehicle_Control_Unit这个节点发出的,数据域长度为8字节,ID为201959408(0xC09A7F0),名字命名为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)空,表示普通信号。

     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_ S_Check : 45|10@0+ (0.00625,0) [0|160] “M” EL3160_60,ESC

表示定义了一个命名为 S_Check的普通信号,其起始位是第45位,信号长度10 bit;

信号是Motorola格式,数值类型为无符号类型数;因子为0.00625,偏移量为0;信号取值范围为0到160;

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

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

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

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

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

Intel格式

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

Motorola格式

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

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

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

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

注解的结构(CM_):

CM_ Object MessageId/NodeName “Comment”

解释:

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

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

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

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

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

表示对ID为996(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”,特征值是整型数据,取值范围在0到65535之间;

默认值为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   表示该信号所属的报文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。只有自然数类型的信号才可以使用数值表表示。

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

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

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

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

格式如下:

VAL_TABLE_ value_table_name value_table_value “value_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" ;

注:本文转载自blog.csdn.net的PlutoZuo的文章"https://blog.csdn.net/PlutoZuo/article/details/131087295"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top