DBC文件是什么?和为什么有时候,需要自己创建DBC文件

      一:简介:DBC是DateBase Can的缩写,是CAN的数据库文件。系统的定义了signal,message,frame,network,node的性质以及他们之间的关系。本文不详细描述如何创建DBC文件,只讲DBC文件创建过程中的注意事项和容易犯的错误。

      二:技术应用背景:DBC文件是汽车电子开发中非常重要的文件。是汽车设计和验证过程中必须得用。通常是由整车厂提供给供应商。但是有时候也需要供应商的开发人员需要自行根据需要创建DBC文件

     三:闲话少说,接下来便看,DBC文件是该如何创建,以及创建过程中的注意要点

     四: 技术应用工具:Vector CANdb++Editor来编辑,俗话说工欲善其器,必需利其器。目前市场主流的DBC编辑工具还是Vector CANdb++Editor。集成在FIRE工具中的VDB文件算是一个半成品,只能适用一些简单场景,且与其他工具没有兼容性。暂时本人知道的DBC编辑工具就这两种。如果各位高工还知道有哪些nb的工具,希望不吝赐教。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档



一、模板选择

如图所示:在点击File->Create Datebase之后,会出现模板选择对话框

 

 (1)首先选择Temple For(目前本人安装的Vector CANdb++Editor,只有bdc一个选项

       如果安装了 CANdb++ Admin(管理版本)是可以选择MDC数据库编辑,本人暂时还没遇见过需要编辑MDC文件的。如果需要编辑MDC,需要先确定是否安装了 CANdb++ Admin(管理版本)。CANdb++ Admin还添加了以下功能数据库比较功能,数据库版本管理,,数据库报告,和时间与总线负载模拟功能。按照实际工程的需要。采用不同版本的编辑器。

如,主机厂的产品工程师或总线工程师,在设计一条CAN的DBC时,涉及Node和Message较多,负载模拟就很重要。如果是供应商为了验证功能,只要和本公司ECU相关的信息写到DCB库就可以,可以不考虑总线负载。

(2)模板选择

     模板就是上图中,各种xxx_Template.dbc 文件,需根据实际应用,采取合适的模板,如:采用autosar的ASR_NM.dbc,航空can数据库就采用,CANaero_ARINC825.dbc,以太网数据库就采用Ethnet.Template.dbc模板。不同的模板确定了数据的格式,不同的attribute(后面详细说),选择了合适的模板。

2、创建DBC步骤

创建signal,->message->networknode

(2.1)首先signal创建

   (2.1.1)新建signal

右单击,选择New,就可以在下拉菜单中出现新建New Signal_404,双击该新建信号,进入编辑模式

 如图所示:按照要求填写信息,其中需要特别注意的有两点

(1)Byte Order(字节顺序)   (2)ValueType(变量类型,也可以理解为信号类型)

(1)Byte Order(字节顺序)分为两种intel格式和Motorola格式。

这两种格式只有对跨字节,信号才有意义

      举例说明,如下图所示,我们设置了一个Vehiclespeed_ABS的信号,信号长度为32bit(暂定startbit=0bit)

当raw值为0x1058时,车速=0.1*0x1058+30=448km/h

intel格式就会把0x1058拆分为低字节0x58和高字节0x10。将0x58放入帧中Byte0,将0x10放入帧中的Byte1中。

很好理解,信号的低字节就放入帧中编号低的字节中,信号的高字节就放入帧中的高字节。即高放高。低放低。

Motorola格式与intel格式相反,其将0x1058拆分为低字节0x58和高字节0x10。将0x10放入帧中Byte0,将0x58放入帧中的Byte1中。

本人第一次看到关于intel格式和Motorola格式,非常不理解,为什么要搞出两套不同的方案,我看到的解释是Motorola格式是更符合书写的习惯。其实我更倾向于是intel和Motorol对CAN协议话语权的争夺。

(2.1.2)ValueType(变量类型,也可以理解为信号类型)

 DBC给出了三种信号类型

(1)signed 有符号整型

(2)unsigned 无符号整型

(3)IEEE.Float  单精度浮点型

(4)IEEE.Double 双精度浮点型

(1) signed 是默认类型,可以表示负数,这里需要特别注意的点,如果信号选为有符号型,如下图

 signed 8bit位能表示的范围为-128-127,最高位为符号位,这一点上和C和c++相似。

(2)unsigned 类型 8bit位能够表示的范围为0-255

      选择不同的Value 能表示的范围是不同的,可以看出来,如果用一个8bit 来表示车速信息,应该选择为unsigned 类型更加合适,如果选择为signed则最少需要使用9bit位(-256-255)才能合适的表示车速,(当前汽车(指燃油车)大部分最高时速都能达到150。新能源汽车基本限速在130最高车速)

(3)IEEE.Float  单精度浮点型

浮点型数据,是可以表示小数的,固定为32Bit,且可以表示为负值。如果开发过程中需要表示小数,则需要用到float类型,比如想把温度信号 20.5℃表示出来。但是实际开发过程中,基于单片机芯片的RAM大小,和算力限制。很少使用此类信号。这种Value Type其实很少用到,

 (4)IEEE.Double 双精度浮点型

比较float可知,Double类型64Bit,表示数值范围也变大,同理在实际工程中也很少用到。

(2.1.3)信号Attribute设置

Attribute属性设置,一般情况下,主要关注红框部分即可。主要设置信号无效值,信号起始值,信号发送类型。如果是网络管理信号,可以射中红框下的选项。

 

(2.1.4)Value Table

    不知道为什么,本人使用的这个模板,无法新建Value Table,希望有大佬指教一下

实际创建中,将信号与对应的状态对应即可。

(3):Message创建

       同样的选择右击新建一个Message,并直接跳出Message设置界面,参考下面两张图片()如果新建后没有自动弹出第二张图片,也可手动双击新建Message打开。
   

这里需要注意两点

(3.1.1)添加已经设置好的signal,

 添加好之后如图所示

 添加完成后

 这里还有一点需要注意,就是注意观察添加signal信号的起始位(startbit),是不是我们想要的,如果想要更改signal的起始位(startbit)

先展开Message,再双击想要更改的Signal

 得到如下界面

 在这里,就可以修改signal,就可以修改起始位(startbit)

(3.1.2)layout 设置

此窗口可以很直观的观察,信号在帧中的结构,如果需要修改可以在此窗口进行修改,

需要注意的一点就是,实际CAN在发送数据段的过程中,先发送Bit7>bit0。就是先发送高bit位,后发送低bit位。

另外,CAN协议中,一个帧先发送Byte0——》Byte7。还是先Byte7——》Byte0,协议没有具体规定,设计DBC文件前,应该先咨询主机厂相关人员。

(3)Attribute属性设置,关注红框内的选项即可

这里还有一个比较隐晦的知识点,就是一些模板中几乎没有attribute选项(如:周期,网络管理,或ISO15765)。需要导入,步骤如下。

选择好的模板;

选择好后,attribute会自动导入。

上图中,因为我已经导入成功过了,再次导入,显示导入失败。这一点无需纠结。

此外点击如下界面:中的attributeDefine也可以手动定义,但是一般不介意这样做,很容易出错。

我们一般是直接导入,如果有不需要的attribute可以直接删除。

 (3):Network   Node节点创建

(3.1.1),新建一个Network   Node节点

需要注意的是:节点文件创建后,会直接生成一个同名的ECU节点,同样的选择右击新建一个Network   Node,并直接跳出Network   Node设置界面

(3.1.2) Network   Node设置界面Mapped Rx sig

我们知道,一个NetworkNode 节点会接受多个帧不同数据中的Signal,(可理解为接受多个Message中的若干个Signal),于是便要在这里添加该节点,需要接受的Signal信号。

 (3.1.4)返回Message界面,设置Message发送节点

这点需要被注意,因为DBC文件由下而上的创建方式。我们一开始创建Message时,是没有指定发送节点的。大家又都知道Message发送是依赖NetworkNode为基础的。点击下午设置Add添加

NetworkNode即可

(4)NetworkNode节点创建

4.1.1新建Network节点

鼠标右单击NetworkNodes节点,选择新建,系统会自动创建以下弹窗

该界面中,我们先定义节点名称和地址,

MappedTxSig:可以观察该节点发送的信号,注意不能添加,只能观察

MappedRxSig :这个界面下,可以添加映射的接收信号

TxMessage :可以添加该节点可以发送的Message

Networks:可以观察该节点所属的网络。目前vector candb++一次只能支持一路can的DBC文件的编辑。

control就是本节点,这个选项说实话很多余。

attributes(属性列表),按照需求填写Attribute

4.1.2每次创建一个NetworkNode就会同步产生一个同名的ECU节点。属性和NetworkNode是一样的。

(5)db文件编辑器的Seting

必须要知道,DB文件编辑的过程中主菜单中option->seting中的设置也非常重要。如下图

单击seting,出现以下配置界面:

Display(显示)Edit(编辑)Consistency check(连续性检测)Default(默认值)LongNames(长名字)

5.1 Display(显示)

5.1.1ID或attribute显示的格式

方框1内,都是选择数字是16进制显示,还是10进制显示。一般选择Hexadecimal。右边两个框建议勾选。

int-attribute always decimal ,整形属性总是显示10进制。

hex-attribute always hexadecimal 十六进制属性总是显示为16进制

这里很多人不明白int-attribute hex-attribute是什么意思。这里还有一个比较重要的知识点,在这里补充一下。在CANdb中,我们可以自定义attribute

点击以上界面:

可以看到属性的设置,可以设置ValueType,这里我们可以设置hex和int类型的属性。这就是上面说的 int-attri和hex-attri

5.1.2 设置信号默认的排序方式和ID显示方式

推荐勾选strat position(起始位)和ID(name)

5.1.3StratPositionFormat。

起始位置,这个有点学问了,先看motorola格式起始位的选择。

先来回忆一下,motorola和intel格式。之前说motorola格式是信号的是高位放低Byte,低位放低Byte。

首先我们需要明确两个概念

(1)我们定义信号时只能明确MSB和LSB,如我们定义一个车速信号 VehicleSpeed 长度为8bit

注意以上的格式1和格式2都是可以的。

帧的固定格式是这样的:

VehicleSpeed 长度为8。我们知道,在信号不跨字节时,intel和motorola格式是完全相同的,

如果仅能确定信号长度,我们是无法判断信号是否跨字节的。还需要一个起始位。如果我们设置起始位为Byte0的bit0。那么VehicleSpeed就不会跨字节。如果起始位放其他字节就可能跨字节

看以下几种情况

后面两种情况下,起始位该怎么算?这就是这里需要着重来讲的知识点

(1)motorola forward MSB:就是以信号的MSB在字节的那个位,哪里就算起始位。然后根据长度往右数,等数完一个字节,再跳到下一个字节,从下个字节的bit0开始数,直到凑够length。

motorola forwardMSB
motorola forwardLSB
motorola sequential

motorola backwa

(2)motorola forward LSB:先将将LSB作为起始点,上例中的起始位就变为19bit.然后开始向左数,本Byte数完,在到上个Byte,从上个字节的bit0开始,直到数够信号长度

(3)motorola sequential

这个比较特殊,(写不动了,未完待续)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐