汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)

目录

[1. 自定义ASAP2文件](#1. 自定义ASAP2文件)

[2. asap2userlib.tlc需要修改的部分](#2. asap2userlib.tlc需要修改的部分)

[3. 标定量观测量地址替换](#3. 标定量观测量地址替换)

[3.1 由elf文件替换](#3.1 由elf文件替换)

[3.2 由map文件替换](#3.2 由map文件替换)

[3.3 正则表达式(含asap2post.m修改方法)](#3.3 正则表达式(含asap2post.m修改方法))

4.小结



书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-CSDN博客

1. 自定义ASAP2文件

自定义文件在程序安装目录\toolbox\rtw\targets\asap2\asap2\user\asap2userlib.tlc,

如果确实找不到可以在matlab command window下输入如下指令:

该文件可以分为静态部分和动态部分

静态部分:不依赖模型的部分,例如头部分等;

动态部分:依赖模型,标定量观测量名字,数据大小等

2. asap 2userlib.tlc需要修改的部分

(1)头部分改写

(2)将a2l module部分复制到

这样就完成了a2l的定制,这种方法有个缺点,必须要a2l最初的源代码;但也有好处,可以详细了解A2L文件的ECU描述关键词。

当然,如果嫌麻烦,哈哈哈,CANape直接生成A2L文件。

如果需要修改a2l工程名字,调用asap2setup在里面做出修改即可;

3. 标定量 观测量地址替换

Matlab提供了两种替换a2l文件地址的方式

3 .1 elf文件替换

从ELF文件更新地址的方法简单,就是通过调用MATLAB自带的函数rtw.asap2SetAddress(ASAP2File, InfoFile),输入A2L文件和elf文件名(即InfoFile)即可得到更新地址后的A2L。缺点是ELF文件不是文本文件,不能看到其内容,很难检验地址更新的正确性。

示例:

|----------------------------------------------------------|
| rtw.asap2SetAddress('TestA2L.a2l', 'tc1782_project.elf') |

3.2 由 map文件替换

用MAP文件更新地址的方法较为复杂,使用函数asap2post(ASAP2File, MAPFile) ,其通过调用%matlabroot%\toolbox\rtw\targets\asap2\asap2\asap2post.m 文件来更新地址。但是需要手动更改该文件的内容,使其符合对应你MAP的格式(每种编译器生成的MAP文件格式不一样)。

3 .3 正则表达式 (含 asap2post.m 修改 方法

使用asap2post进行变量的地址替换要用到正则表达式;

正则表达式又叫做规则表达式,主要用于检索、替换符合某种规则的文本。

Matlab提供了四个正则表达式的库

思考在A2L文件的标定量观测量地址替换中需要用到哪些库?

首先,需要将从map文件中找到相应变量的地址,不同编译器中有不同给的表达方式,例如hightec的map文件地址如下:

在asap2post中提供了多种编译器map文件的格式,可根据需要进行修改。

在这里使用regexp函数找到匹配的文本,因此需要将map文件和a2l文件均转成文本格式的,会用到库fileread;

下面着重分析regexp(str,expression,'tokens')

Tokens即标文,使用标文的一个好处是,标文会记住所匹配的内容,因此可以在搜索或替换过程中重新调用和重用匹配的文本。

MAPFileString表示map文件已经转成文本了

\n\s\s+0x([0-9a-fA-f]+)\W+(\S+):

\n:字符表示,这里表示从一个换行符开始匹配;

\s:任意空白字符,从空白字符开始匹配;

0x([0-9a-fA-f]):表示0-9,a-f,A-F(区分大小写)的任意字符,

\W:除字母、数字下划线外的任意字符;

\S:任意非空白字符

通过上述可以读取地址与变量名。

然后将变量名和地址存入到哈希表里。

注:什么是hash表?containers.map是什么?

(1)containers.map:创建一个空的map对象

这个对象里面的值('Keytype' ,'char','ValueType','double')均后面指令,接下来即把变量名和地址放到map

(2)哈希表其实也就是一种根据关键码值(Key value)而直接进行访问的数据结构,在matlab里也就是containers.map。

for i = 1:length(pairs)

MAPFileHash(pairs{i}{2}) = pairs{i}{1};

以上语句在matlab里的用法就是右边valuetype给左边的keytype赋值,由于使用的是hightec编译器,因此pairs{i}{2}指的是变量名,pairs{i}{1}指的是地址。

注:常用的标定工具有CANape和INCA;由于INCA只识别FLASH里的变量地址,因此在a2l描述里应该对标定量做一个地址偏移到flash区,这样才能标定。

我们可以在哈希表里就对需要的标定量地址进行偏移,由于matlab十六进制均为字符串形式,所以要将其转为十进制,使用到库hex2dec,进行地址偏移,最后在转为十六进制。

1610612769 转为十六进制为 0x60000000,后面以此类推。

将变量和地址一一对应后,就需要读取a2l的变量和地址进行替换,用到库函数regexprep以及动态正则表达式的概念。

这里引入定制的a2l生成的格式:

regexprep中的表达式行匹配的字段是0000 /* @ECU_Address@Param3@ */

那么为什么要用(\w+),主要是后面replace要来匹配它;

{MAPFileHash(1)}表示hash表里的第一列的元素,即变量名,当其去(\w+)的变量名相匹配时,将hash表的值替换expression。

通过上面的表达式替换,会出现如下结果:

那么下次再替换的时候就不太方便,必须要重新生成a2l来保证地址为0x0000,为了能够多次重复替换,需要将替换后的格式改为如下:

因此需要将regexprep(str,expression,replace)的expression和replace进行修改;其中:

  1. Expression表示用于匹配的字符,我们可以看到,在a2l文件里,需要匹配的就是地址这一段,

在最初版本中使用的是:expression=[addrPrefix '(\w+)' addrSuffix],

为了能够匹配任意数字(地址),

将expression改为:'[0-9]* /\* @ECU_Address@(\w+)@ \*/';

表示:将匹配 (任意长度数字)+(空格)+(/\* @ECU_Address@(\w+)@ \*/)

保存之后替换a2l如下:

这样我们在做开发时就可以不用再重新生成代码,直接移植,替换a2l即可。

使用\* 的原因

完成上述工作后,将新的字符串写到a2l里

4.小结

这只是我前几年在验证标定协议栈的一个实验,把模型开发、a2l生成、基础软件从上至下走了一通,再加上做了一个UI界面,基本上把这一套工具链缩减为编译器、matlab/simulink再加标定工具即可,还是比较有成就感的,分享给大家。

相关推荐
Dev7z19 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
雨大王5121 天前
怎么打造一个能自我进化的制造数字基座?
人工智能·汽车·制造
fengfuyao9851 天前
基于MATLAB的表面织构油润滑轴承故障频率提取(改进VMD算法)
人工智能·算法·matlab
机器学习之心1 天前
基于随机森林模型的轴承剩余寿命预测MATLAB实现!
算法·随机森林·matlab
rit84324991 天前
基于MATLAB的环境障碍模型构建与蚁群算法路径规划实现
开发语言·算法·matlab
hoiii1871 天前
MATLAB SGM(半全局匹配)算法实现
前端·算法·matlab
yong99901 天前
MATLAB面波频散曲线反演程序
开发语言·算法·matlab
yugi9878381 天前
基于MATLAB的一键式EMD、EEMD、CEEMD和SSA信号去噪实现
开发语言·matlab·信号去噪
youcans_1 天前
【STM32-MBD】(15)Simulink 模型开发之三相互补 PWM
stm32·单片机·嵌入式硬件·matlab·foc
JicasdC123asd1 天前
使用Faster R-CNN模型训练汽车品牌与型号检测数据集 改进C4结构 优化汽车识别系统 多类别检测 VOC格式
r语言·cnn·汽车