解析.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解析的的完整内容,转载注明出处。
转载于:https://www.cnblogs.com/yao-zhang/p/10220665.html
解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真相关推荐
- 10句话读懂图像频域滤波——不能不知道的信号与系统基本理论
10句话读懂图像频域滤波--不能不知道的信号与系统基本理论 今天的图像处理依靠各类方便易用的工具箱与函数库似乎已然成为上手就能用的应用科学.但没有那种算法是普适的,知其所以然才能真正理解原理,深刻的理 ...
- dds通信中间件_车内的中间件协议:是面向服务,还是以数据为中心,或是RESTful?...
如今,用户希望像自己的移动设备一样,可以根据自己的喜好来调整自己的汽车,扩展它的功能,并对其进行定期更新.实现这些需求的基本技术要素是基于IP(Internet Protocol)的通信.IP为新的设 ...
- 解析oracle的dump文件,读懂数据块dump文件信息
尊重作者著作,转自http://blog.csdn.net/guoyjoe/article/details/8567076 -------------------------------------- ...
- 一文读懂 WebSocket 通信过程与实现
什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是一种基于 TCP 的一种独立实现. 以前客户端想知道服务 ...
- 一文读懂责任分配矩阵,解决你80%的项目难题
成功的项目管理取决于整个团队对角色和职责的理解,使用责任分配矩阵分配和定义角色是使项目保持在正轨并为成功做好准备的好方法. 如果设计得当,责任分配矩阵能够促进项目的成功交付. 一.什么是责任分配矩阵 ...
- 解析|一文读懂AGV的关键技术——激光SLAM与视觉SLAM的区别
来源:新机器视觉 移动机器人(AGV)是工业机器人的一种.它由计算机控制,具有移动.自动导航.多传感器控制.网络交互等功能,在实际生产中最主要的用途是搬运,可以说只要有搬运需求的地方,就有移动机器人的 ...
- 串口通信 校验码_一文读懂S7-200 SMART自由口通信!
学习S7-200 SMART时了解到,基于RS485接口可实现一下几种通信: 1)modbus RTU通信 2)PPI协议通信 3)USS协议通信 4)自由口通信 何为自由口通信呢? 前三种通信必须要 ...
- DBC文件解析——基于DBCView工具
关于dbc最全的文章在这里:https://blog.csdn.net/u010808702/article/details/104152745 最新的DBCView的使用方法在(一):https:/ ...
- 一文读懂BloomFilter
# 前言 你在开发或者面试过程中,有没有遇到过**海量数据需要查重**,**缓存穿透**怎么避免等等这样的问题呢?下面这个东西超屌,好好了解下,面试过关斩将,凸显你的不一样. Bloom Filter ...
最新文章
- python代码需要背吗-20个Python代码段,你需要立刻学会,好用到哭!
- 尼康单反相机测试软件,尼康D4S数码单反相机专题测试
- Linux下的编程入门
- 体绘制的原理和Raycasting的实现
- logstash mysql 准实时同步到 elasticsearch
- 上拉加载下拉刷新控件WaterRefreshLoadMoreView
- JavaScript闭包 懂不懂由你反正我是懂了
- python调用按键精灵插件_【按键精灵】三分钟教你实现自动解决各种验证码
- plt是什么格式文件
- android studio改java,Android Studio如何修改快捷键
- .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
- 爱创科技行业观察:中药全链条监管进入新阶段!
- 第12周前端学习周报
- 三种常用的LED驱动电源电路图详解
- 笑傲江湖手3D有服务器端文件,笑傲江湖网游单机版
- 涛哥、星哥即段海涛、赵星本人已不在属于传智播客
- maven不能加载ojdbc14.jar的解决方法(亲测有效)
- Unreal4 VS Unity
- c++ opencv实现图像对比度增强
- 【数据结构】二叉树的前中后序遍历
热门文章
- java整数翻转_Java程序反转数字
- 怎么查看电脑有没有python_python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学...
- Java 多线程 —— AQS 详解
- 笔记本超频会烧吗_笔记本电脑cpu超频是什么意思?超频会怎样啊?
- java getparametermap_重写getParameterMap后,报错 ,
- (递归3)最大公约数
- 微型计算机十号功能,青岛理工大学练习题微机原理(10页)-原创力文档
- JAVA回调函数的例子_javascript : 回调函数例子
- 用计算机探索规律反思,用计算器探索规律教学反思
- java 8 foreach_Java 8 forEach Stream()与旧版forEach循环