解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
通常我们拿到某个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解析的的完整内容,转载注明出处。
解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真的更多相关文章
- [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图
MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...
- DBC文件小结
Vector的DBC文件描述了CAN网络的通信规范,通过定义signal可以表示CAN帧中的各个物理信号的含义.通过CANdb++ Editor软件可以创建和修改DBC文件,一般监控或控制CAN网络内 ...
- 一篇读懂HTTPS:加密原理、安全逻辑、数字证书等
1.引言 HTTPS(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.本文,就来深入介绍下其 ...
- 使用 10046 查看执行计划并读懂 trace 文件
查看 sql 执行计划的方法有许多种, 10046 事件就是其中的一种. 与其他查看 sql 执行计划不同, 当我们遇到比较复杂的 sql 语句, 我们可以通过 10046 跟踪 sql 得到执行计划 ...
- 读懂CCS链接命令文件(.cmd)
链接器的核心工作就是符号表解析和重定位,链接命令文件则使得编程者可以给链接器提供必要的指导和辅助信息.多数时候,由于集成开发环境的存在,开发者无需了解链接命令文件的编写,使用默认配置即可.但若需要对计 ...
- 通信矩阵转DBC
DBC的制作对于一些人来时比较陌生,熟悉的人做他感觉浪费时间(像我这样的),于是自己用PYTHON写了一个脚本,还挺好用的,只需要填写表格就好了,省出来大部分的时间. 分享下思路, 来看下DBC的文本 ...
- [转帖] 读懂YML文件.. 书买了还没看完...
Copy From https://www.cnblogs.com/CloudMan6/p/8370501.html 读懂 Deployment YAML - 每天5分钟玩转 Docker 容器技 ...
- 一文读懂HTTP/2及HTTP/3特性
摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何 ...
- 一篇文章,读懂Netty的高性能架构之道
一篇文章,读懂Netty的高性能架构之道 Netty是由JBOSS提供的一个java开源框架,是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架, ...
随机推荐
- C# 添加Word页眉、页脚和页码
在Word文档中,我们可以通过添加页眉.页脚的方式来丰富文档内容.添加页眉.页脚时,可以添加时间.日期.文档标题,文档引用信息.页码.内容解释.图片/LOGO等多种图文信息.同时也可根据需要调整文字或 ...
- C# 在PPT中绘制形状(shape)
概述 本篇文章将介绍C# 在PPT幻灯片中操作形状(shape)的方法.这里主要涉及常规形状,如箭头.矩形.圆形.三角形.多边形.不规则形状等.下面的示例中,可以通过绘制形状,并设置相应格式等.示例包 ...
- phpstorm本地怎么上传到服务器
连接服务器 菜单栏找到[工具/Tools]->[Deployment/部署]->[Confinguration…/配置…]. 点加号(+),添加一台服务器,填写名称,选择类型为SFTP,点 ...
- 剑指前端(前端入门笔记系列)—— JS基本数据类型及其类型转换
基本数据类型 ECMAScript中有5中简单数据类型性(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——Object,Obje ...
- Docker-compose command 有多个命令例子
cat docker-compose.yml version: '3.4' services: klvchen: image: python_django:19.03.0 ports: - 8000: ...
- 覆盖ng-zorro样式(非style.scss)
之前发现在模板的样式表里写样式不起作用,然后想起vue里有个/deep/,angular会不会也有一个,果然,发现了一个::ng-deep可以在模板的样式表里覆盖ng-zorro的样式.记录一下(●' ...
- 关于写作那些事之github告诉我构建失败,然后呢?
The page build failed for the master branch with the following error 问题描述 看到这封邮件,一脸懵逼,本地运行 gitbook 服 ...
- Android串口开发
参考资料: https://www.jianshu.com/p/9249ed03e745 GitHUb地址: https://github.com/AIlll/AndroidSerialPort An ...
- Quick Select算法
https://blog.csdn.net/Yaokai_AssultMaster/article/details/68878950 https://blog.csdn.net/mrbcy/artic ...
- spring 纯注解方式 与AOP
spring注解方式 以前我也使用过纯注解方式.现在在这里做个记录 我们先认识几个我们都耳熟能详的注解 @configuration :从spring3.0这个注解就可以用于定义配置类,可以替换xml ...