概述
序言:
此文转自:解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真 - 水一年 - 博客园 (cnblogs.com)
下图是用CANdb++打开的某ECU的通信矩阵数据库文件的视图(".dbc"后缀名的文件),视窗具备较好的阅读性,可以轻松帮助我们读懂信号矩阵。
此博文主讲我们利用文本工具阅读.dbc文件。
典型的应用场景:在ECU的自动化测试实现中,为了批量布置测试环境,从降成本考虑,我们遵循通信矩阵的协议定义使用代码编写好CAN报文的生成和解析算法 + 集成了CAN收发器的硬件板达到总线仿真的效果。
此方案可替代 canoe+VN系列设备(或PCAN,ValueCAN等搭配busmaster)实现总线信号仿真,可满足普通功能的自动化测试环境的批量布置,但可能不满足高时间精度的性能要求。
开始解析前,先了解一下报文帧。 CAN帧中包含的信息有,消息ID、报文发送周期、 报文长度、信号信息等。
下图表展示了摩托罗拉字节位序(CAN协议的一种字节序格式)的报文发送时的字节序和bit序。
正章:
下截图所示是我使用notepad++打开的某数据库文件,并搜索CAN ID "1015"(dec格式)的结果,后文以它作为例子讲解。
注意1:后面的例子解释时,每一句原.dbc数据库文件的源码将以3个单引号形式圈注,单引号不属于原语句内容。
注意2:dbc文件主要以空格符拆分数据信息,类似于csv文件以","英文逗号拆分数据。" "空格符属于分隔符,dbc文件还有其他分割信息的符号,如 "|",",","()","[]"等
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" ;
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”
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通信矩阵,实现车内信号仿真的全部内容,希望文章能够帮你解决解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复