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
下图中,点击此处可以查看ValueDescription,其实也就是查看ValueTable,但是注意仅仅只能查看而已,如果需要编辑则需采用以下步骤:
**1)步骤1:单独建立一个ValueTable
**1.1)回到主界面,点击下图界面
**1,2)得到如下界面,先右键单击空白处,选择新建New,就可以新建一个ValueTable
之后双击这个新的值表,按照1,2的步骤,设置好,1处其实没啥,就是改个名字
我们主要看2处如何设置:按照图示,依次点击即可
此处我们添加了,两个ValueDescription,然后点击确定即可
然后等信号设置好时,直接从Signal编辑界面直接选择,刚刚设计好的ValueTable即可(记住刚刚修改的名称)
- 问题思考1?ValueTable的描述的值的范围:是否必须和对应的Signal长度保持一致,如·signal是unsigned类型长度为2,则取值范围为0,1,2,3。那么ValueTable的类型是否必须将0,1,2,3全部描述?
答:不需要,并没有规定强制规定signal的值和Value必须存在一一对应的映射关系,Value的值本身就不需要时连续定义的,如我定义raw值0=off,直接跳到3=ON也是可以的
- 思考问题2?如何尽量少的Value来描述尽量较多的Signal
(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.1.3)Attribute属性设置,关注红框内的选项即可
3.1.4 如何导入Attribute
这里还有一个比较隐晦的知识点,就是一些模板中几乎没有attribute选项(如:周期,网络管理,或ISO15765)。需要导入,步骤如下。
选择好的模板;
选择好后,attribute会自动导入。
上图中,因为我已经导入成功过了,再次导入,显示导入失败。这一点无需纠结。
此外点击如下界面:中的attributeDefine也可以手动定义,但是一般不介意这样做,很容易出错。
我们一般是直接导入,如果有不需要的attribute可以直接删除。
(4):Network Node节点创建
(4.1.1),新建一个Network Node节点
需要注意的是:节点文件创建后,会直接生成一个同名的ECU节点,同样的选择右击新建一个Network Node,并直接跳出Network Node设置界面
(4.1.2) Network Node设置界面Mapped Rx sig
我们知道,一个NetworkNode 节点会接受多个帧不同数据中的Signal,(可理解为接受多个Message中的若干个Signal),于是便要在这里添加该节点,需要接受的Signal信号。
(4.1.4)返回Message界面,设置Message发送节点
这点需要被注意,因为DBC文件由下而上的创建方式。我们一开始创建Message时,是没有指定发送节点的。大家又都知道Message发送是依赖NetworkNode为基础的。点击下午设置Add添加
NetworkNode即可
(5)NetworkNode节点创建
5.1.1新建Network节点
鼠标右单击NetworkNodes节点,选择新建,系统会自动创建以下弹窗
该界面中,我们先定义节点名称和地址,
MappedTxSig:可以观察该节点发送的信号,注意不能添加,只能观察
MappedRxSig :这个界面下,可以添加映射的接收信号
TxMessage :可以添加该节点可以发送的Message
Networks:可以观察该节点所属的网络。目前vector candb++一次只能支持一路can的DBC文件的编辑。
control就是本节点,这个选项说实话很多余。
attributes(属性列表),按照需求填写Attribute
5.1.2每次创建一个NetworkNode就会同步产生一个同名的ECU节点。属性和NetworkNode是一样的。
(6)db文件编辑器的Seting
必须要知道,DB文件编辑的过程中主菜单中option->seting中的设置也非常重要。如下图
单击seting,出现以下配置界面:
Display(显示)Edit(编辑)Consistency check(连续性检测)Default(默认值)LongNames(长名字)
6.1 Display(显示)
6.1.1ID或attribute显示的格式
方框1内,都是选择数字是16进制显示,还是10进制显示。一般选择Hexadecimal。右边两个框建议勾选。
int-attribute always decimal ,整形属性总是显示10进制。
hex-attribute always hexadecimal 十六进制属性总是显示为16进制
6.1.2 如何自定义attribute和导入attribute
这里很多人不明白int-attribute hex-attribute是什么意思。这里还有一个比较重要的知识点,在这里补充一下。在CANdb中,我们可以自定义attribute
点击以上界面:
可以看到属性的设置,可以设置ValueType,这里我们可以设置hex和int类型的属性。这就是上面说的 int-attri和hex-attri
6.1.4 设置信号默认的排序方式和ID显示方式
推荐勾选strat position(起始位)和ID(name)
6.1.5StratPositionFormat。
起始位置,这个有点学问了,先看motorola格式起始位的选择。
先来回忆一下,motorola和intel格式。之前说motorola格式是信号的是高位放低Byte,低位放低Byte。
首先我们需要明确两个概念
首先要搞清楚Signal的MSB/LSB。和帧Byte中的bit7和bit0。再搞清楚帧实际发送的过程中(即收发器在向总线上输出电平信号时,先发送bit7位表示的电平,然后依次发送bit6.。。。bit0)
(1)我们定义信号时只能明确MSB和LSB,如我们定义一个车速信号 VehicleSpeed 长度为8bit
注意以上的格式1和格式2都是可以的。
帧的固定格式是这样的:
Byte发送过程中,应该也是先发送Byte0-Byte1-》依次到Byte7
VehicleSpeed 长度为8。我们知道,在信号不跨字节时,intel和motorola格式是完全相同的,即LSB放Byte中的低bit位,MSB放Byte高bit位。
如果仅能确定信号长度,我们是无法判断信号是否跨字节的。还需要一个起始位。如果我们设置起始位为Byte0的bit0。那么VehicleSpeed就不会跨字节。如果起始位放其他字节就可能跨字节
看以下几种情况
后面两种情况下,起始位该怎么算?这就是这里需要着重来讲的知识点
(1)motorola forward MSB:就是以信号的MSB在字节的那个位,哪里就算起始位。然后根据长度往右数,等数完一个字节,再跳到下一个字节,从下个字节的bit7开始数,直到凑够length,最后数到的。
motorola forwardMSB |
motorola forwardLSB |
motorola sequential |
motorola backwa |
(2)motorola forward LSB:先将将LSB作为起始点,上例中的起始位就变为19bit.然后开始向左数,本Byte数完,在到上个Byte,从上个字节的bit0开始,直到数够信号长度,作为MSB
小结:
1:Motorola存在两种起始位 MSB和LSB。两种格式只对起始位存在影响,对Signal的排列不存在影响。
2:Motorola格式的信号,在layout界面拖动,使其跨字节时
(3)motorola sequential
这个比较特殊,先在Seting界面设置好:
第二步看,起始位:
(4)intel standard (英特尔标准模式)
不跨字节时的信号,如图先设置好
看结果
接下来拖动New_Signal_1
可以看到strat bit =4;移位后,当向高Byte1移位时,可以等效于左移,LSB左移,MSB首先移位到Byte1的bit0位,然后按照依次bit1,bit2.。。bit4
然后修改Seting中的起始位
此时起始位变成7
拖动Signal_1移动
可以看到,移位 上的逻辑和标准没有区别,只是起始位变化了。