一、什么是DBC?
DBC(CAN data base)是描述网络上所有电子节点(ECU)之间CAN通信信息的数据库文件。注意三个关键词:网络、电子节点和CAN信息,DBC文件只用于描述CAN通信,通常一个DBC文件只能包含一个CAN网络的节点信息,因此,为了描述整车的网络拓扑信息,需要多个DBC文件。
例如下面的整车网络拓扑示意图:
众多电子节点划分为不同的功能区块,区块内的节点通过CAN总线相互连接形成独立的功能子网(如动力子网PTCAN、车身子网BodyCAN等),中央网关(GateWay)将不同的功能子网相连为跨网通信提供支持,不同子网上的节点还可以通过单独连接建立私有通信,某些节点(如BCM)还会通过LIN总线建立下属网络。这里功能子网的通信就需要用DBC来描述,并且每一个功能子网都有自己的DBC文件。
二、如何打开DBC?
使用Vector CANdb++ Editor工具可以打开、编辑以及创建DBC文件,通常在安装了CANoe或CANalyzer软件之后会带有该工具:CANdb.exe,执行文件位于软件安装目录下的Exec32文件夹下:
一般如果安装了CANdb工具系统会自动关联DBC文件格式(.dbc),这样便可以直接双击DBC文件打开。
DBC文件也可以通过文本方式打开(如使用windows系统的记事本程序),但是可读性远不如CANdb工具,但这种方式在研究DBC某些内容或想要通过脚本解析DBC文件时比较有用。
另外,需要说明的是CANdb工具分两个版本,CANdb++ Standard和CANdb++ Admin,Admin版支持的功能更多更强,我们一般使用的都是Standard版,后文介绍均基于该版本进行。
三、DBC里有什么?
下图是用CANdb工具打开DBC文件后的窗口界面,左侧窗格含有一个树型导航目录,右侧窗格展示当前选中目标的详细内容:
树型目录的分类与前面提到的三个关键词刚好对应:
Networks —— 网络
Network nodes —— 电子节点
Messages & Signals —— CAN信息
除此之外,这里还有ECUs和Environment variables两项,ECUs下包含的其实是每个ECU的Network Node和Environment Variables,Network Node就是上面说的电子节点,这个在后面会讲,Environment Variables在使用CANoe仿真节点时会用到。
Networks
Networks从网络的视角来观察总线上存在的节点、报文及信号,我们展开Networks下的PTCAN网络可以看到下面包括Tx Messages、Signals和本网络上的多个节点,如下图所示:
Tx Messages下列出了该网络总线上所有的报文,其实就是每个节点发送报文的集合。Signals下列出了该网络总线上所有的信号。节点部分列出了每个节点自身的发送和接收信号。
下面来看一下Network的属性参数,通过右击网络名(PTCAN)选择Edit Network打开网络编辑对话框,在Attributes选项卡下可以查看当前支持的参数项:
下面简要说明一下图示中各项属性参数的含义:
参数项 | 说明 |
NmType | 指定网络管理类型:NmAsr(AutosarNm) |
NmAsrBaseAddress | 指定网络报文ID的基址,即此网络上所有节点的网络报文ID要基于此地址增加不同的偏移量来确定,这里为0x600,那么其它节点网络报文ID为0x6XX,如0x610、0x611、0x612等 |
NmAsrCanMsgCycleTime | 指定网络报文的周期时间:500ms |
NmAsrMessageCount | 指定网络上最大支持的网络报文数量:32 |
NmAsrRepeatMessageTime | 指定网络管理处于RepeatMessage状态的时间:1500ms |
NmAsrTimeoutTime | 指定网络处于Network Mode下的超时时间:4000ms |
NmAsrWaitBusSleepTime | 指定网络从PrepareBusSleep状态进入BusSleep状态需要等待的时间:4000ms |
BusOffRecoveryTime | 指定BusOff的恢复时间:160ms |
BusType | 指定总线协议类型:CAN |
Baudrate | 指定总线的通信波特率:500kbps |
SamplePointMax | 指定采样点的最大值:85 |
SamplePointMin | 指定采样点的最小值:75 |
SyncJumpWidthMax | 指定同步跳转宽度的最大值:4 |
SyncJumpWidthMin | 指定同步跳转宽度的最小值:3 |
Manufacturer | 制造商信息:Vector |
VersionNumber | 版本信息 |
VersionWeek | |
VersionYear |
这些参数和Autosar NM以及CAN协议密切相关,除了图示里的这些参数,也可以创建自定义参数,点击工具栏的Attribute Definitions按钮可以查看当前创建的属性信息,如下图所示:
从Type Of Object列可以看到除了Network以外,Node、Message及Signal都有自己的属性定义,需要注意的是虽然可以任意新建用户自定义的属性项,但是某些属性(那些可以被协议栈配置工具识别的属性)必须按照要求(名称、类型、取值)定义才能起作用。最简单的增加属性方式就是直接导入现有的属性信息:
通过点击File菜单下的Import Attribute Definitions可以选择导入其它DBC里的属性信息,注意:如果当前DBC和导入DBC有同名属性,这些同名属性不会导入。
Netwrok的属性主要是对涉及整个网络或多个节点的一些行为进行定义,比如波特率、采样点需要所有节点遵守才能保证总线正常通信,又如网络管理相关的参数需要相关节点遵守才能实现整个网络内的管理功能。
Network nodes
与Networks不同,Nodes部分从单个节点的视角来观察与节点相关的总线报文及信号,以VBU节点为例,展开后下面包含Tx Messages、Rx Messages、Mapped Tx Signals以及Mapped Rx Signals,见下图所示:
其中Tx Messages下包含本节点所有的发送报文。
Rx Messages下包含本节点所有的接收报文。
Mapped Tx Signals下包含本节点所有的发送信号。
Mapped Rx Signals下包含本节点所有的接收信号。
那这里的收发报文信号和树型目录最下部的Messages和Signals有什么区别呢:
有两点区别:
1. Messages与Signals下包含的报文信号比节点下的报文信号要多,并且有可能会包含实际没用到的报文信号,因为所有创建的报文信号都会在Messages与Signals下显示,但只有映射到节点的报文信号才会在Network及Node下显示。
2. 针对同一条报文,从节点的Rx Messages下看到的信号数量可能会比从Messages下看到的要少。比如我们观察下图所示的AC_0x254这条报文:
对于某一条报文而言,节点可能只关心其中的几个信号,那么只接收这几个有用的信号当然是最佳选择。
基于以上两点原因,建议从节点下去查看相关的报文信号。
下面来看一下Node的属性参数,同样我们以下面的图示为例说明:
简要说明一下图示各项属性参数的含义:
参数项 | 说明 |
NodeLayerModules | 指定dll文件可以配合CANoe实现仿真测试功能 |
ILUsed | 指定是否使用交互层(对Geny或Davinic Configuration工具很重要) |
NmAsrNode | 指定节点是否为AutosarNM节点 |
NmAsrCanMsgCycleOffset | 指定网络报文的偏移时间 |
NmAsrCanMsgReducedTime | 指定BusloadReduction功能相关的时间参数 |
Nodes属性主要涉及各个节点自身,通常每个节点根据需要可以做不同的配置,比如节点是否使用ILUsed,是否支持AutosarNM等。
Messages
Message是CAN总线上传输信息的最小单位,一条Message最大包含8个Byte的数据(CAN FD则最大支持64个Byte的数据),Messages从用途角度可以分为三大类:应用(APP)报文、网络(NM)报文和诊断(DIAG)报文。通过点击Node下的Tx Messages或RxMessages,可以查看报文属性:
下面是对报文属性的简要说明:
属性名 | 描述 | 备注 |
Message | 报文名称 | 通常报文名会用于生成代码,请确保符合C语言标识符命名规范 |
Node | 发送节点名称 | 只有发送报文有此项属性 |
ID | 报文ID | 标准帧ID为11bit,扩展帧ID为29bit |
ID-Format | CAN帧类型:标准帧或扩展帧 | |
DLC[Byte] | 报文长度 | 通常为8个字节 |
Tx Method | 报文发送方式: Cyclic、 NoMsgSendType | 同GenMsgSendType |
Cycle Time | 报文周期时间,单位ms | 同GenMsgCycleTime |
Comment | 注释信息 | |
NmAsrMessage | 是否为Autosar NM报文 | 网络报文该项设置为Yes |
DiagState | 功能寻址请求报文,该项设置为Yes | 诊断报文相关属性 |
DiagRequest | 物理寻址请求报文,该项设置为Yes | |
DiagResponse | 物理寻址响应报文,该项设置为Yes | |
GenMsgSendType | 报文发送方式: Cyclic、 NoMsgSendType | 报文最终的表现形式取决于报文和信号发送类型的逻辑或 |
GenMsgCycleTime | 报文周期时间,单位ms | |
GenMsgCycleTimeFast | 报文快发阶段周期时间,单位ms | |
GenMsgNrOfRepetition | 报文快发阶段发送次数 | |
GenMsgDelayTime | 报文发送最小间隔时间,单位ms | |
GenMsgILSupport | 报文是否由IL或COM层处理 | APP报文设置为Yes,NM和DIAG报文设置为No |
GenMsgStartDelayTime | 报文首次发送的延迟时间,单位ms |
Signals
Signal是Message里最小的元素单位,通过在某条报文上右击选择Edit Message打开报文编辑窗口,然后选择Layout选项卡可以查看当前报文的信号布局:
Layout中纵向表示字节顺序,从上到下为Byte0~Byte7,横向表示字节内的bit位顺序,从左至右为Bit7~Bit0,Signal在Message里的位置由Byte Order、Startbit和Length三个参数决定,Byte Order主要用于跨多个字节的信号,例如上图中横跨Byte1和Byte2的粉色信号,如果选择Motorola格式,则Byte1为信号的高bit位,Byte2为低bit位,选择Intel的话正好相反;Startbit用于确定信号的起始位置,通常要么为信号的最高bit位(msb)要么为最低bit位(lsb);length决定了信号的实际有效长度。从这里可以看出报文里的信号数量是可变的,对于一条8个Byte的报文,其信号数量最小为1个,最大为64个。
和查看Messages属性类似,通过点击Tx Mesasges或Rx Messages下的任意一条报文,可以查看信号属性:
属性名 | 描述 | 备注 |
Name | 信号名称 | 通常信号名会用于生成代码,请确保符合C语言标识符命名规范 |
Message | 信号所在的报文名 | |
Multiplexing/Group | 复用/组信号 | |
Startbit | 信号起始位 | |
Length[Bit] | 信号长度 | |
Byte Order | 信号在报文内的字节序,分Motorola和Intel两种格式 | 通常使用Motorola格式,两种格式的区别主要体现在跨字节分布的信号上,对于Motorola信号的高位在前低位在后,而Intel则是信号的低位在前高位在后 |
Value Type | 信号值类型:Signed、Unsigned、IEEE Float、IEEE Double | 通常使用Unsigned类型 |
Initial Value | 信号初始值 | 物理值 |
Factor | 信号因子 | 这两项构成信号的计算公式: Physical value = (Raw value * Factor) + Offset, 其中Raw value表示总线值 |
Offset | 信号偏移量 | |
Minimum | 信号最小值 | 物理值 |
Maximum | 信号最大值 | 物理值 |
Unit | 信号值单位 | 信号表示的物理值单位,如Kg、m |
Value Table | 信号的取值表 | 定义信号取值含义 |
Comment | 注释信息 | |
GenSigSendType | 信号发送方式: Cyclic、 OnWrite、 OnWriteWithRepetition、 OnChange、 OnChangeWithRepetition、 IfActive、 IfActiveWithRepeition、 NoSigSendType | 报文最终的表现形式取决于报文和信号发送类型的逻辑或 |
GenSigSendTopBottom | 信号边界发送方式: None、 SendOnTop、 SendOnBottom、 SendOnTopBottom | 用于无符号数值,SendOnTop-信号值达到Maximum时发送;SenOnBottom-信号值达到Minimum时发送;SendOnTopBottom-信号值达到Maximum或Minimum时均发送 |
GenSigDeltaValue | 信号的Delta量值 | 如果信号的当前值与上次发送的值差值大于Delta,则再次发送信号 |
GenSigStartValue | 信号的默认值 | 发送信号的默认值 |
GenSigInactiveValue | 指示信号无效的值 | 用于IfActive型的发送 |
GenSigTimeoutValue | 信号超时值 | 接收信号超时后的值 |
Messages和Signal的大部分属性配合表格里的说明应该很容易看明白,少部分属性包括Byte Order的细节区别、Multiplexing/Group的含义用法以及报文信号的组合发送形式和涉及到的控制参数,这些内容留在后面介绍。
再次强调一下,Node、Message和Signal的属性参数不是一成不变的,像Message和Signal除了基本的属性以外,其它的属性(尤其是“Gen-”开头的属性)都是不定的,根据你使用的功能多少,这些属性或多或少,而对于每种类别下具体支持哪些属性,建议参考Vector官方文档或者咨询有经验人士。
四、DBC的用途
DBC的用途主要体现在软件开发和软件测试两个方面:
软件开发方面主要配合Vector的Geny或Davinic Configuration协议栈配置工具来实现CAN通信栈的配置及代码生成,如果DBC的各种属性设置得当,可以简化不少手动配置及调整代码的工作。ETAS的ISOLAR工具也支持导入DBC,但是对DBC属性参数的支持不太完善,只能识别一部分基础参数。
软件测试方面主要配合Vector的CANoe、CANalyzer、CANape等测试工具来实现节点仿真、报文解析等功能,此外,其它的一些工具如英特佩斯的neoVI FIRE也支持导入DBC。