一文搞懂系列——DBC数据库信号解析规则及案例

背景

最近在项目中,同事遇到了一个dbc数据库解析错误的问题:基于ekuiper 对can报文解析,发现实际输出结果与预期差距较大。当时他第一反应是ekuiper的解析规则有误,因此就没有跟踪下去了。因为之前我用过ekuiper的CAN报文解析功能,是没有问题的。因此我更倾向于是他的dbc数据库有问题,于是研究了一下DBC文件解析的规则,并实际验证。过程中也踩了一些坑,在此记录。希望能帮助到有需要的人。

DBC 数据库介绍

DBC是vector公司定义的can网络通信文件格式。网上介绍的文章很多,有兴趣的朋友可以去搜索一下。本文的主要核心是解析DBC信号部分,对于相关信息进行简略描述。

dbc文件一般包含了如下信息:

  1. 版本与新符号
  2. 波特率定义
  3. 网络节点的定义
  4. 报文帧的定义
  5. 信号的定义
  6. 注解部分
  7. 特征部分
  8. 数值表部分

版本与新符号

这两个参数一般在文件的开头,tag为VERSIONNS_。其中VERSION可以为空或自定义,NS_一般固定,不需要修改。如下:

VERSION ""NS_ :NS_DESC_CM_BA_DEF_BA_VAL_CAT_DEF_CAT_FILTERBA_DEF_DEF_EV_DATA_ENVVAR_DATA_SGTYPE_SGTYPE_VAL_BA_DEF_SGTYPE_BA_SGTYPE_SIG_TYPE_REF_VAL_TABLE_SIG_GROUP_SIG_VALTYPE_SIGTYPE_VALTYPE_BO_TX_BU_BA_DEF_REL_BA_REL_BA_DEF_DEF_REL_BU_SG_REL_BU_EV_REL_BU_BO_REL_SG_MUL_VAL_

波特率

格式为BS_:[baudrate:BTR1,BTR2]; 含义如下:

  • BS_为关键字,用于定义CAN网络的波特率;
  • [ ]内容表示为可选部分,可以省略
    注:但关键字BS_:必须存在,省略则会出错。如下:
BS_:

网络节点的定义

格式为BU_: Nodename1 Nodename2 Nodename3 ……含义如下:。

  • BU_为关键字,表示网络节点;
  • Nodename1、Nodename2表示网络节点名字,由用户自己定义。通过网络节点方便地进行CAN网络的设计、开发和测试。如下:
BU_:  EOCM_F_FO Dummy_FO

报文帧的定义(重点)

格式为BO_ MessageId MessageName: MessageSize Transmitter含义如下:

  • BO_,为关键字,表示报文;
  • MessageId,报文ID,是以10进制数表示的
  • MessageName,报文的名字,命名规则和C语言变量相同;
  • MessageSize,报文数据域字节数,为无符号整型数据,CAN 2.0为最大8字节,CAN FD 最大64字节
  • Transmitter,该报文的网络节点;如果该报文没有指定发送节点,则该值需设置为” Vector__XXX”
    如下:定义了一个报文ID为0x586的报文,报文名称为RVB_TVR_Debug2_FO, 报文长度仅7Byte,由EOCM_F_FO网络节点发出。
BO_ 1414 RVB_TVR_Debug2_FO: 7 EOCM_F_FO

信号的定义(核心)

格式为:SG_ SignalName (SigTypeDefinition) : StartBit|SignalSize@ByteOrder ValueType (Factor,Offset) [Min|Max] Unit Receiver含义如下:

  • SG_为关键字,表示信号;
  • SignalName表示该信号的名字;
  • SigTypeDefinition是可选项,有3种格式:
    a)空,表示普通信号。
    b)M,表示多路选择器信号。
    c)m50,表示被多路选择器选择的信号,50,表示当M定义的信号的值等于50的时候,该报文使用此通路。
  • StartBit、 SignalSize表示该信号起始位、信号长度,不同的字节序,StartBit含义不同
  • ByteOrder表示信号的字节顺序:0代表Motorola格式,1代表Inter格式
  • ValueType表示该信号的数值类型:+表示无符号数,-表示有符号数;
  • Factor,Offset 表示因子,偏移量;这两个值用于信号的原始值与物理值之间的转换。转换如:物理值=原始值*因子+偏移量
  • Min|Max表示该信号的最小值和最大值,即指定了该信号值的范围;这两个值为double类型;
  • Unit表示该信号的物理单位,为字符串类型;
  • Receiver表示该信号的接收节点;若该信号没有指定的接收节点,则必须设置为” Vector__XXX”

如下:定义了一个VBTOSLonPstn的普通信号,它的起始值在bit7,长度为12。字节序为Motorola,有符号。因子为0.125,偏移为0。数值的范围为-256~255.875,单位是m,由Dummy_FO网络节点接收。

SG_ VBTOSLonPstn : 7|12@0- (0.125,0) [-256|255.875] "m"  Dummy_FO

注解部分,特征部分,数值表部分在dbc文件中属于非必须部分,本文不再进一步介绍。综上所述,我们得到最小的dbc文件,后续基于该文件进行解析。

VERSION ""NS_ :NS_DESC_CM_BA_DEF_BA_VAL_CAT_DEF_CAT_FILTERBA_DEF_DEF_EV_DATA_ENVVAR_DATA_SGTYPE_SGTYPE_VAL_BA_DEF_SGTYPE_BA_SGTYPE_SIG_TYPE_REF_VAL_TABLE_SIG_GROUP_SIG_VALTYPE_SIGTYPE_VALTYPE_BO_TX_BU_BA_DEF_REL_BA_REL_BA_DEF_DEF_REL_BU_SG_REL_BU_EV_REL_BU_BO_REL_SG_MUL_VAL_BS_:BU_:  EOCM_F_FO Dummy_FOBO_ 1414 RVB_TVR_Debug2_FO: 7 EOCM_F_FOSG_ VBBrkCntlAccel : 45|12@0- (0.01,0) [-20.48|20.47] "m/s^2"  Dummy_FOSG_ VBTOSObjID : 35|6@0+ (1,0) [0|63] ""  Dummy_FOSG_ VBTOSTTC : 31|12@0+ (0.025,0) [0|102.375] "s"  Dummy_FOSG_ VBTOSLatPstn : 11|11@0- (0.125,0) [-128|127.875] "m"  Dummy_FOSG_ VBTOSLonPstn : 7|12@0- (0.125,0) [-256|255.875] "m"  Dummy_FO

案例分析

根据上面的dbc文件,我们进行如下示例分析。向can0网卡发送数据 cansend can0 586#d465737400000000,ekuiper输出以下结果:

[{"VBBrkCntlAccel": 0,"VBTOSLatPstn": 87.125,"VBTOSLonPstn": -87.25,"VBTOSObjID": 0,"VBTOSTTC": 46.400000000000009}
]

我们尝试通过对dbc数据库文件的理解进行分析,看看是否与ekuiper的计算结果一致。在分析前,我们需要了解几点内容:

  1. 位序
    我们知道字节序是一个对象中的多个字节之间的顺序问题,比特序就是一个字节中的8个比特位(bit)之间的顺序问题。一般情况下系统的比特序和字节序是保持一致的。

比如:二进制数11010100,若比特序为大端msb,则最高有效比特位在高位,最低有效比特位在低位,那么它代表的值为0xd4;若比特序为lsb,则最高有效比特位在低位,最低有效比特位在高位,那么它代表的值为0x2bCAN 总线协议中规定,位序都是大端模式,即 msb

  1. motorola和inter字节序
    在dbc文件解析中,信号定义中有一个参数ByteOrder表示信号的字节顺序。分别为inter和Motorola两种格式。
  • Intel格式跟小端格式一样,低地址代表低字节,高地址代表高字节
  • Motorola格式跟大端格式一样,低地址代表高字节,高地址代表低字节
    注:Motorola格式有2种表达方式,一种是Motorola_LSB,另一种是Motorola_MSB。Motorola_LSB的起始位是从低字节开始的,而Motorola_MSB的起始位是从高字节开始的。dbc文件默认表示Motorola_MSB表达方式,而CANdb++则是Motorola_LSB
  1. 信号传输,都是以补码的形式传输。

分析:

  1. 586#d465737400000000表示报文ID为0x586=1414,与RVB_TVR_Debug2_FO报文匹配。其中d465737400000000则为该报文的数据部分。
  2. 因为CAN总线协议规定,位序都是大端模式,即可得到下面的layout 图。其中蓝色背景为数据内容,因为RVB_TVR_Debug2_FO报文长度仅有7Byte。

  1. VBBrkCntlAccel信号的起始位bit45,且为Motorola字节序,则bit45是信号VBBrkCntlAccel最高有效比特位,因此信号内容如下。即信号原始值为000000000000,物理值=原始值*(0.01)+0 = 0;

  1. 同理,可得到其它信号的layout如图。

  • VBTOSObjID原始值为000000,物理值=0*1+0=0;
  • VBTOSTTC原始值为011101000000,物理值=1856*0.025+0=46.4。至于最终的打印结果为什么是46.400000000000009,可以参考我的博客flaot 数据类型的一些坑(大数吃小数)。
  • VBTOSLatPstn原始值为01010111001,物理值=697*0.125+0=87.125。
  • VBTOSLonPstn原始值为110101000110。</font color=blue>因为该信号为有符号数,因此最高位1,则表示该值为负。其原始值的补码为110101000110,则原始值为101010111010=-698。物理值=-698*0.125+0=-87.25。

同样的dbc文件,若由CANdb++进行解析,如下。可知Startbit与dbc文件不一致。因为CANdb++默认是Motorola_LSB表达方式

若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。
我的宗旨:
踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途。

在这里插入图片描述

总结

经过两天的查阅资料,以及咨询同事,算是熟悉了dbc数据库的解析规则。希望本篇文章,能够帮助到各位小伙伴。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284846.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

采购oled屏幕,应注意什么

在采购OLED屏幕时&#xff0c;应注意以下几点&#xff1a; 规格和参数&#xff1a;了解OLED屏幕的规格和参数&#xff0c;包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性&#xff1a;选择具有可靠品质和稳定性的OLED屏…

Shell三剑客:sed(命令)二

一、插入命令&#xff1a;i&#xff08;之前&#xff09; [rootlocalhost ~]# sed -r 2i aaaaaaa passwd.txt root:x:0:0:root:/root:/bin/bash aaaaaaa bin:x:1:1:bin:/bin:/sbin/nologin[rootlocalhost ~]# sed -r 2i aaaaaaa\ > bbb\ > ccc passwd.txt root:x:0:0:r…

Stable-Diffusion|从图片反推prompt的工具:Tagger(五)

stable-diffusion-webui-wd14-tagger 前面几篇&#xff1a; Stable-Diffusion|window10安装GPU版本的 Stable-Diffusion-WebUI遇到的一些问题&#xff08;一&#xff09; 【Stable-Diffusion|入门怎么下载与使用civitai网站的模型&#xff08;二&#xff09;】 Stable-Diffusi…

【深度强化学习】确定性策略梯度算法 DDPG

前面讲到如 REINFORCE&#xff0c;Actor-Critic&#xff0c;TRPO&#xff0c;PPO 等算法&#xff0c;它们都是随机性策略梯度算法&#xff08;Stochastic policy&#xff09;&#xff0c;在广泛的任务上表现良好&#xff0c;因为这类方法鼓励了算法探索&#xff0c;给出的策略是…

档案数字化管理可以提供什么服务?

档案数字化管理提供了便捷、高效和安全的档案管理服务&#xff0c;帮助组织更好地管理和利用自己的档案资源。 具体来说&#xff0c;专久智能档案数字化管理可以提供以下服务&#xff1a; 1. 档案扫描和数字化&#xff1a;将纸质档案通过扫描仪转换为数字格式&#xff0c;包括文…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差&#xff0c;不利于在不同规模的数据集上有效运行若输入维度发生变化&#xff0c;需要修改并重新训练网络容易过拟合 全连接导致参数量特别多&#xff0c;容易过拟合如果增加更多层&#xff0c;参数量会翻倍无法有效利用局部特征 输入…

python接口自动化测试-unittest-批量用例管理

我们日常项目中的接口测试案例肯定不止一个&#xff0c;当案例越来越多时我们如何管理这些批量案例&#xff1f;如何保证案例不重复&#xff1f;如果案例非常多&#xff08;成百上千&#xff0c;甚至更多&#xff09;时如何保证案例执行的效率&#xff1f;如何做&#xff08;批…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

建行江门市分行致力数字人民币加速融入百姓生活

数字金融是“数字中国”建设的重要组成部分。建行江门市分行主动拥抱数字经济浪潮&#xff0c;全力探索数字金融赋能实体经济和社会民生&#xff0c;不断助力增强人民群众对金融服务的获得感、幸福感和安全感。 缴交住维如此简单&#xff01; 江门是著名侨乡&#xff0c;有40…

Java小案例-RocketMQ的11种消息类型,你知道几种?(死信消息)

前言 在RocketMQ中&#xff0c;死信消息&#xff08;Dead-Letter Message&#xff09;是指那些在正常情况下无法被消费者消费的消息。这些消息会被存储在死信队列&#xff08;Dead-Letter Queue&#xff0c;简称DLQ&#xff09;中。 死信消息的特性包括&#xff1a; 不会再被…

RocketMQ EventBridge 核心概念

理解EventBridge中的核心概念&#xff0c;能帮助我们更好的分析和使用EventBridge。本文重点介绍下EventBridge中包含的术语&#xff1a; EventSource&#xff1a;事件源。用于管理发送到EventBridge的事件&#xff0c;所有发送到EventBridge中的事件都必须标注事件源名称信息…

关键字、标识符、变量、基本数据类型

一、关键字&#xff08;Keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; 特点&#xff1a;全部关键字都是小写字母 Java关键字查询关键地址&#xff1a; http:// https://docs.oracle.com/j…