• 解析.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解析的的完整内容,转载注明出处。

  • 相关阅读:
    Java九种基本数据类型的大小,以及他们的封装类
    php之正则表达式
    代码开发注意事项
    提后端需求的要求
    后端上线规范
    关注公众号的微信用户收到非本人操作的充值消费记录,故障记录
    软件三层架构和MVC模式的区别
    HttpClient发送请求和接收参数
    js页面倒计时
    小程序换取openId
  • 原文地址:https://www.cnblogs.com/isAndyWu/p/10789891.html
Copyright © 2020-2023  润新知