详细解析DBC文件

详细解析DBC文件

0、概述:

通常我们拿到某个ECU的通信矩阵数据库文件,dbc后缀名的文件。 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图:

在这里插入图片描述

现在要把上图呈现的信号从.dbc文件中解析出来,供实现自动化仿真总线信号使用,比如使用python+支持can收发的硬件即可替代canoe实现信号仿真(性能上不够用,可满足功能测试所需)。

一个标准CAN帧中包含的信息有,消息ID、报文发送周期、 报文长度、信号信息等。

开始解析前,先了解一下报文帧。下表体现了摩托罗拉字节位序的报文发送时的字节序和bit序,一会儿可以帮助我们理解dbc中的定义

在这里插入图片描述

我使用了notepad++打开数据库文件,提取数据库文件中的关键信息。此处随意选取了其中一个ID=1015(dec)作为例子讲解。全文本搜索1015,结果如下:

Line 62: BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
Line 883: CM_ BO_ 1015 “Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption”;
Line 884: CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
Line 1265: BA_ “GenMsgCycleTime” BO_ 1015 1000;
Line 1463: BA_ “GenSigStartValue” SG_ 1015 IPK_EVDTEodometer 4095;
Line 1967: VAL_ 1015 IPK_EVDTEodometer 4095 “Invalid” ;

挨个戳开每条搜索结果查看详细内容,逐句解释:

说明:

dbc文件以空格符拆分数据信息,类似于csv文件以",“拆分数据的意思,” “属于分隔符。还有其他分割信息的符号,如 “|”,”,“,”()“,”[]"等

1、报文消息数据格式解读

举例:

以下是DBC中代表一条消息的描述信息

BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX

解释:

BO_        代表一条消息的起始标识

1015         消息ID的十进制形式,=0x3f7

IPK_ODO_Consump  消息名

:           分割符号

8           消息报文长度,帧字节数

Vector__XXX      发出该消息的网络节点,标识为Vector__XXX时未指明具体节点

2、信号信息数据格式解读

每条报文消息里面有多个报文信号,报文信号的信息的起始标识为"SG_", 它以一个"BO_"开始至下一"BO_"之间的内容止,详细报文消息以缩进1或2个空格符形式类似树图子节点的方式呈现。

举例:

一条消息下的一个信号的信息,此处缩进一个空格

SG_ IPK_EVDTEodometer : 7|12@0+ (1,0) [0|999] “km” TBOX

解释:

SG_          代表一个信号信息的起始标识

IPK_EVDTEodometer   信号名,分长名与短名,此处是短名。长名非必须存在,可以不定义
分割符号

7           信号起始bit

|           分割符号

12           信号总长度

@0+          @0表示是Motorola格式(Intel格式是1),+表示是无符号数据

(1,0)          (精度值,偏移值)

[0|999]         [最小值|最大值], 物理意义的最小与最大,现实世界的有物理意义的值,比如此处仪表续航里程最大999KM

“km”          “单位”

TBOX          接收处理此信号的节点,同样可以不指明,写为Vector__XXX

1)Motorola格式与Intel格式

这个决定了信号起始bit, 生成报文计算信号值时的大小端算法。

Motorola格式:

信号以高字节低位起始,此处占了12bit, 以第二字节的低bit 12位算起,计12个bit总长度,信号是连续的(此处连续针对低字节在前的字节发送序,参看LSB与MSB)。

比如我设置续航里程998KM, 它的信号值在整条报文中表现为 3E,60,00,00,00,00,00,00

发送字节序:

在这里插入图片描述

信号布局图 :

(横轴bit序,纵轴字节序;先从左至右,再由上至下阅读信号)

在这里插入图片描述

Intel格式:

信号以低字节低位起始,此处占了12bit, 以第一字节的低bit 0位算起,计12个bit总长度,信号是非连续的(发送的字节序体现出的信号值非连续,但是bit位是由低到高连续的)。

比如我设置续航里程998KM, 信号值在报文中为 E6,03,00,00,00,00,00,00

信号布局图:

(横轴bit序,纵轴字节序;先从右至左,再由上至下阅读信号)

在这里插入图片描述

2)精度值与偏移量,物理值与信号值的关系公式:

  信号值*精度值 + 偏移量 = 物理值

总线上报文消息中传递的是信号值,当此信号传递到ECU时,需转换为物理意义的值在输出接口显示。

举例:

SG_ TCU_TransOilTemp : 7|8@0+ (1,-40) [-40|214] “°C” TBOX

若传感器显示16度,则 信号值=(物理值-偏移量)/精度值 = (16 - (-40))/1 = 56(dec) = 0x38, 报文呈现为“38,00,00,00,00,00,00,00” (此处00表示未设置信号,","分割字节,以上同)

3、消息与信号的详细描述

CM_ BO_ 1015 “Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption”;
CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";

解释:

CM_    起始标识,我猜测CM_为comment缩写

4、消息发送周期

BA_ “GenMsgCycleTime” BO_ 1015 1000;

解释:

BA_  起始标识,描述消息与信号更详尽的信息。 以上语句描述了消息的周期,单位ms

5、信号默认值,起始值

BA_ “GenSigStartValue” SG_ 1015 IPK_EVDTEodometer 4095;

解释:

BA_  起始标识,描述消息与信号更详尽的信息。 以上语句描述了消息中具体信号的初始值,十进制表示

6、值枚举或特殊值列举或取值范围描述

VAL_ 1015 IPK_EVDTEodometer 4095 “Invalid” ;

解释:

VAL_  起始标识符,对信号值的描述

以上是DBC解析的的完整内容。

《AUTOSAR谱系分解(ETAS工具链)》之总目录

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解析一个 dbc 文件,可以使用 Java 编程语言的各种库和工具。DBC 文件是一种用于描述 Controller Area Network (CAN) 消息的文件格式,它包含有关 CAN 消息、信号和节点的定义。 首先,我们可以使用 Apache POI 或其他类似的库来读取 DBC 文件的内容。这些库提供了用于读取 Excel 文件的 API,我们可以使用这些 API 来打开和读取 DBC 文件中的工作表、行和单元格。 接下来,我们需要解析 DBC 文件中的各个部分。通常,DBC 文件由多个节(section)组成,每个节都包含有关 CAN 网络中的不同方面的信息。常见的节包括: 1. `VERSION` 节:它包含有关 DBC 文件版本和创建日期的信息。 2. `BU_` 节:它定义了 CAN 网络中的节点。 3. `BO_` 节:它定义了 CAN 消息。 4. `SG_` 节:它定义了信号。 5. `VAL_` 节:它定义了信号的值。 我们需要遍历 DBC 文件中的每个节,并提取所需的信息。可以使用正则表达式或字符串操作来提取每个节的名称和内容。 一旦我们获取了节的名称和内容,我们可以进一步解析每个节。例如,对于 `BU_` 节,我们可以解析节点的名称和属性,并将其存储在相应的对象中。对于 `BO_` 节,我们可以解析消息的名称、ID 和长度。对于 `SG_` 节,我们可以解析信号的名称、起始位、长度和属性。 最后,我们可以将解析后的信息用于任何我们想要的用途,例如生成代码、执行数据转换或进行数据分析。 需要注意的是,解析 DBC 文件可能会涉及到一些复杂的逻辑和处理,这取决于 DBC 文件的结构和复杂性。因此,我们需要仔细阅读 DBC 文件的规范,并可根据需要进行适当的调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值