一种基于正则表达式的DBC文件解析及报文分析方法与流程

文档序号:15567509发布日期:2018-09-29 03:41阅读:832来源:国知局

本发明涉及一种基于正则表达式的dbc文件解析及报文分析方法,属于新能源汽车can总线技术领域。



背景技术:

目前,随着新能源汽车技术的发展,整车的功能越来越复杂,安全性要求也越来越高,所以越来越多的控制器被应用到整车上。为了实现不同控制器之间的实时通讯,can总线也被广泛应用。通过can网络,不同控制器的数据以id作为区分发送到can总线上,控制器从总线上快速找到需要的数据,can总线具有仲裁、检验的功能,能够保证数据的准确性,是一种高可靠性、稳定性的现场总线。但是由于控制器之间的报文id、总线数据都不相同,can网络上的数据量非常大,难以对can网络上的数据进行管理并快速提取需要的数据,由于不同控制器的厂家对can协议的理解不同,会导致对同一帧报文使用不同的解析方式,导致解析错误。

目前,传统的报文解析方式是通过人工进行提取,再进行计算,或是根据通讯协议编写相应的计算脚本,再在excel表格中完成数据的计算,这种方式需要浪费大量人力和时间成本,而且很容易因为操作人员的错误操作和疏漏导致解析的数据错误,尤其是对于can网络数据样本非常大的情况下,操作难度也会随之增加。另外通过脚本的方式也不适用于多种不同车型间的数据解析,因为必须为每个通信协议编写不同的脚本,针对不同车型通讯协议的不同,应用不同的脚本,复杂度和难度都大,兼容性差,修改麻烦,并且不能够支持将数据反向解析,无法快速重新将数据组成can网络报文,应用具有局限性。



技术实现要素:

本发明的目的在于提供一种能够克服上述技术问题的基于正则表达式的dbc文件解析及报文分析方法。

本发明所述方法能够使用数据处理软件的正则表达式对dbc文件进行解析并提取中dbc文件中的can网络消息和信号的结构,然后利用正则表达式匹配与替换的处理方法对dbc文件的内容进行解析,利用解析后的dbc数据(以下简称数据)对整车采集到的can报文进行分析,根据报文id找到dbc文件中对应的can网络消息块以及包含的信号并通过其数据类型、起始位、位长度、偏移量、比例系数、解析类型得到实际数据,并且将数据存储在相应的文件中;解析后的dbc数据以下简称数据;具体包括以下步骤:

步骤1、对dbc文件进行解析,以文本的方式对dbc文件进行读取,然后通过正则表达式进行匹配,查找dbc文件中对应的can网络消息块,提取出对应的can报文id、节点名称、消息名称,然后再向下对can网络中包含的内容进行查找,提取出相应的数据类型、起始位、位长度、偏移量、比例系数、解析类型,存储在结构体数组中。

所述的dbc文件中的can网络消息块是一条消息后立刻会跟随多行信号,直到解析到另外一条消息,说明一个can网络消息块结束,当解析完所有行时则所有can网络消息块都被解析完毕。当can网络消息块不包含信号则忽略不计。

dbc文件中的消息的结构为:

bo报文id报文名称报文长度发送节点;

上式中:

bo:dbc文件中消息的标志前缀;

报文id:十进制的报文id,只有后29位有效;

报文名称:区分不同的消息;

报文长度:报文中包含的数据个数,0~8;

发送节点:发送报文的节点名称。

dbc文件中的信号的结构为:

sg_信号m:起始位|位长度@0+(比例,偏移)[最大|最小]“备注”接收节点;

上式中:

sg_:dbc文件中信号的标志前缀;

m:共享索引值,每个消息只能有一个;

0/1:数据解析格式,0为intel格式,1为motorola格式;

+/-:数据类型,+为有符号数,-为无符号数。

所述的正则表达式能够根据dbc文件的结构直接解析出消息和信号所包含所有信息,并且通过消息和信号所包含所有信息能够进行从报文到数据或者从数据到报文的双向转换。

所述的消息的解析正则表达式结构为:

bo_(?<id>\d+)(?<msg>.*):(?<dlc>\d+)(?<node>.*);

上式中:

id:报文id,十进制表示;

msg:消息名,由字母、数字、下划线组成;

dlc:数据长度,0~8;

node:发送节点名称。

信号的解析正则表达式结构为:

sg_(?<sig>.*)[mm](?<index>\d*):(<stbit>\d+)\|(?<bitl>\d+)@(\d)[+-]

\((?<factor>.*),(?<offset>.*)\)\[(.*)\|(.*)\]“.*”(?<node>.*);

上式中:

sig:信号名,由字母、数字、下划线组成;

index:索引下标,若为空字符则为母索引;

stbit:起始位;

bitl:位长度;

factor:比例系数,为小数、整数、科学计数法;

offset:偏移量,为负数、小数;

node:接收节点名称。

步骤2、将采集的can报文中报文id、报文数据长度提取出来,并转换为所需要的格式以供解析,不同工具采集出的can报文的格式是不同的,读取can报文的脚本对can报文解析程序进行配置,can报文解析是基于正则表达式。

can报文的格式为:

时间是否拓展帧消息id接收/发送帧格式数据;

序号传输方向时间标志消息id帧格式帧类型数据长度数据;

上式中:

时间:以秒为单位的时间;

时间标志:按照时分秒组成的字符串;

消息id:以0x开头或者以x结尾或者只保留id,以十六或者十进制表示;

数据:8个字节的数据,以十六或者十进制表示,以逗号或者空格分隔。

所述can报文需要提取的信息包括时间、id和数据,所述can报文最终都转换为十进制的数值类型进行保存以便于用统一的格式进行解析、计算和存储。

第一种can报文解析的正则表达式为:

(.*).*(\w+)x[tr]x\w\d(\w{2}){8};

对应的转换计算函数为:

$1,hex2dec($2),hex2dec($3);

第二种can报文解析的正则表达式为:

\d+.*(\d+):(\d+):(\d+)\.(\d+)\.00x(\w+).*.*0x\d+(\w{2}){8};

对应的转换计算函数为:

$1*3600+$2*60+$3+$4/1000,hex2dec($5),hex2dec($6);

将can报文解析后得到了can报文中所包含的时间、id、报文数据的信息,保存在工作空间中以供解析调用。

步骤3、根据步骤1、2得到的数据对can报文进行解析,以dbc文件中信号名的方式进行存储,保存在mat、excel、txt的文件中以供程序使用并能够选择保存的格式。

步骤4、数据分析;

步骤4.1:读取can报文id,并根据can报文id查找对应解析方式,当未查找到则跳过此步骤。

步骤4.2:将can报文多个字节的数据按照顺序组合成一个n字节的数据的大数值,将每个字节从最低字节到最高字节向右移动n*字节序号位,然后相加得到一个数据,当是intel格式需要高字节在前,低字节在后。

步骤4.3:根据起始位和位长度将can报文数据中的需要的部分提取出来,先计算出起始位和终止位,然后根据can报文数据的位长度计算出向右移动的位数,然后屏蔽掉高位,得到的即是需要使用的can报文数据。

步骤4.4:将需要使用的can报文数据转换为十进制数,乘以比例因子,加上偏移量,得到最终的can报文数据。

步骤4.5:将最终的can报文数据和时间填充到经过解析之前的can报文数据中,当没有变量则重新创建一个新变量。

步骤4.6:重复上述步骤,直到所有的can报文数据解析完成为止。

步骤4.7:将解析完的can报文数据存储在文件中。

本发明的优越效果是:

1、能够根据dbc文件对can报文进行解析,统一对can报文中的信号进行定义,减少报文定义错误的概率,能够快速移植使用,编写简单、高效,能够自定义属性和解析值。

2、能够配置dbc及can报文的解析模板,即使是不同厂家、工具采集得到的不同格式的can报文也能够使用,弥补了传统软件只能解析自带报文格式的不足,另外利用数据处理软件强大的函数功能,能够批量实现数据的自定义解析。

3、能够自动存储为多种数据格式,根据需要对解析出的数据进行存储和分析,能够直接使用数据处理软件进行画图和计算,不仅支持离线的can报文解析,还能够支持实时的can报文解析并将采集的数据以报文或者曲线的方式显示出来以便于对数据的分析,提高了采集后再分析的效率。

4、能够支持数据的反向解析,将数据根据dbc文件转换为can报文,再通过can盒将报文发送到can总线上,能够完成对程序功能的验证,能够搭建实时的控制器模型。

本发明所述方法使用简单且拓展性强,不仅能够进行can报文解析,还能够进行xcp、ccp的协议的使用完成数据的采集和标定。

附图说明

图1是本发明所述方法的流程示意图。

具体实施方式

下面结合附图对本发明的实施方式进行详细描述。如图1所示,本发明所述方法包括以下步骤:

步骤1、对dbc文件进行解析,以文本的方式对dbc文件进行读取,然后通过正则表达式进行匹配,查找dbc文件中对应的can网络消息块,提取出对应的can报文id、节点名称、消息名称,然后再向下对can网络中包含的内容进行查找,提取出相应的数据类型、起始位、位长度、偏移量、比例系数、解析类型,存储在结构体数组中。

所述的dbc文件中的can网络消息块是一条消息后立刻会跟随多行信号,直到解析到另外一条消息,说明一个can网络消息块结束,当解析完所有行时则所有can网络消息块都被解析完毕。当can网络消息块不包含信号则忽略不计。

dbc文件中的消息的结构为:

bo报文id报文名称报文长度发送节点;

上式中:

bo:dbc文件中消息的标志前缀;

报文id:十进制的报文id,只有后29位有效;

报文名称:区分不同的消息;

报文长度:报文中包含的数据个数,0~8;

发送节点:发送报文的节点名称。

dbc文件中的信号的结构为:

sg_信号m:起始位|位长度@0+(比例,偏移)[最大|最小]“备注”接收节点;

上式中:

sg_:dbc文件中信号的标志前缀;

m:共享索引值,每个消息只能有一个;

0/1:数据解析格式,0为intel格式,1为motorola格式;

+/-:数据类型,+为有符号数,-为无符号数。

所述的正则表达式能够根据dbc文件的结构直接解析出消息和信号所包含所有信息,并且通过消息和信号所包含所有信息能够进行从报文到数据或者从数据到报文的双向转换。

所述的消息的解析正则表达式结构为:

bo_(?<id>\d+)(?<msg>.*):(?<dlc>\d+)(?<node>.*);

上式中:

id:报文id,十进制表示;

msg:消息名,由字母、数字、下划线组成;

dlc:数据长度,0~8;

node:发送节点名称。

信号的解析正则表达式结构为:

sg_(?<sig>.*)[mm](?<index>\d*):(<stbit>\d+)\|(?<bitl>\d+)@(\d)[+-]

\((?<factor>.*),(?<offset>.*)\)\[(.*)\|(.*)\]“.*”(?<node>.*);

上式中:

sig:信号名,由字母、数字、下划线组成;

index:索引下标,若为空字符则为母索引;

stbit:起始位;

bitl:位长度;

factor:比例系数,为小数、整数、科学计数法;

offset:偏移量,为负数、小数;

node:接收节点名称。

步骤2、将采集的can报文中报文id、报文数据长度提取出来,并转换为所需要的格式以供解析,不同工具采集出的can报文的格式是不同的,读取can报文的脚本对can报文解析程序进行配置,can报文解析是基于正则表达式。

can报文的格式为:

时间是否拓展帧消息id接收/发送帧格式数据;

序号传输方向时间标志消息id帧格式帧类型数据长度数据;

上式中:

时间:以秒为单位的时间;

时间标志:按照时分秒组成的字符串;

消息id:以0x开头或者以x结尾或者只保留id,以十六或者十进制表示;

数据:8个字节的数据,以十六或者十进制表示,以逗号或者空格分隔。

所述can报文需要提取的信息包括时间、id和数据,所述can报文最终都转换为十进制的数值类型进行保存以便于用统一的格式进行解析、计算和存储。

第一种can报文解析的正则表达式为:

(.*).*(\w+)x[tr]x\w\d(\w{2}){8};

对应的转换计算函数为:

$1,hex2dec($2),hex2dec($3);

第二种can报文解析的正则表达式为:

\d+.*(\d+):(\d+):(\d+)\.(\d+)\.00x(\w+).*.*0x\d+(\w{2}){8};

对应的转换计算函数为:

$1*3600+$2*60+$3+$4/1000,hex2dec($5),hex2dec($6);

将can报文解析后得到了can报文中所包含的时间、id、报文数据的信息,保存在工作空间中以供解析调用。

步骤3、根据步骤1、2得到的数据对can报文进行解析,以dbc文件中信号名的方式进行存储,保存在mat、excel、txt的文件中以供程序使用并能够选择保存的格式。

步骤4、数据分析;

步骤4.1:读取can报文id,并根据can报文id查找对应解析方式,当未查找到则跳过此步骤。

步骤4.2:将can报文多个字节的数据按照顺序组合成一个n字节的数据的大数值,将每个字节从最低字节到最高字节向右移动n*字节序号位,然后相加得到一个数据,当是intel格式需要高字节在前,低字节在后。

步骤4.3:根据起始位和位长度将can报文数据中的需要的部分提取出来,先计算出起始位和终止位,然后根据can报文数据的位长度计算出向右移动的位数,然后屏蔽掉高位,得到的即是需要使用的can报文数据。

步骤4.4:将需要使用的can报文数据转换为十进制数,乘以比例因子,加上偏移量,得到最终的can报文数据。

步骤4.5:将最终的can报文数据和时间填充到经过解析之前的can报文数据中,当没有变量则重新创建一个新变量。

步骤4.6:重复上述步骤,直到所有的can报文数据解析完成为止。

步骤4.7:将解析完的can报文数据存储在文件中。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的范围内,能够轻易想到的变化或替换,都应涵盖在本发明权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1