利用Matlab脚本实现A2L、ELF文件替换

1、A2L文件介绍

A2L文件是一种汽车标定软件,利用A2L文件,可以很方便进行参数标定。A2L文件中包含了Simulink模型中规定的标定量,数据类型等数据参数;在使用INCA开展标定时,需要导入A2L文件至工作区。

A2L文件的生成过程为:

在Simulink完成模型搭建后,生成A2L文件,此时的A2L文件中各变量地址都为空,需要在Tasking中对.c、.h文件进行编译,才能得到地址信息。实际操作时,是将原工程A2L文件中可用部分替换到simulink新生成A2L文件中某些行。

2、需求说明

当使用模型生成A2L后,使用notepad++打开生成的a2l文件,所有的变量地址都是默认为0x0000,如下所示:

可以使用

rtw.asap2SetAddress('model.a2l','model.elf')

语句将elf中有效地址信息合并到a2l中;同时matlab中生成的a2l头文件有部分需要进行替换。每次新生成模型时,都需要手动进行操作替换。故编写一个m文件,自动进行文件替换操作,提高生产力。

3、编写脚本

设计思路

读取两个A2L文件的内容,将读取到的内容在新建的A2L中进行替换。

tip:

①脚本自动选择需要删除前1174行的model.a2l文件

②脚本自动选择需要保留前218行的ADAS.a2l文件

③在matlab工作路径新生成一个model.a2l文件

④将debug文件夹中的elf文件改名,并在工作路径得到新文件model.elf

⑤合并A2LConbinewithELF.m功能

%file Get_Newfile.m
%data  2022/9/6
%vision V1.1
%**************************************************************************
% 使用步骤:
% 1、运行脚本
% 2、脚本自动选择需要保留前1174行的model_1Mbps.a2l文件(有效头文件信息)
% 3、脚本自动选择需要保留218行后的ADAS.a2l文件(空地址标定量信息)
% 4、在matlab工作路径自动生成一个model.a2l文件
% 5、将debug文件夹中的elf文件改名,并在工作路径得到新文件model.elf
% 6、合并A2LConbinewithELF.m功能
%**************************************************************************
fidz=fopen('ADAS.a2l','r+');
fidx=fopen('model_1Mbps.a2l','r+');
fidw=fopen('model.a2l','w+');
%**************************************************************************
%运行前把model.a2l文件内容全部清除,便于后续生成
for i=1
    fgetl(fidw)
end
while ~feof(fidw)
    fprintf(fidw,'%s\n','');
end   
%**************************************************************************
%a2l头文件替换
for k=1:1173
    tline1=fgetl(fidx);
    if k>0
        fprintf(fidw,'%s\n',tline1);
    end
end                             %获取model_1Mbps.a2l文件的前1174行,填充至model_new(需要的头文件)
%**************************************************************************
%matlab生成的中间版文件218行后文件复制
for m=1:218
    fgetl(fidz)
end
while ~feof(fidz)
    tline2=fgetl(fidz);
    fprintf(fidw,'%s\n',tline2);
end                             %获取model.a2l文件的218行后续文件,填充至modela.a2l(空地址文件)
disp('替换完成');
%**************************************************************************
%选择Tasking生成的elf文件,由于与工程路径不同,需要手动选择
disp('选择tasking debug 路径下生成的elf文件');
[filename2, pathname2, FileIndex] = uigetfile({'*.elf', 'All excel file(*.elf)'; ...
'*.*', 'All Files (*.*)'}, ...
'Pick an elf file');
if FileIndex == 0 % 如果选择了‘cancel’
disp('未选择文件');
else
file_path = [pathname2 filename2];
end
%复制elf文件至工作路径,并命名为model.elf
movefile([pathname2 filename2],'model.elf');
fclose(fidx);   %关闭新生成文件
%**************************************************************************
%合并A2LConbinewithELF.m功能
rtw.asap2SetAddress('model.a2l','model.elf')

代码进行了一次升版,解决了缺点:

1、生成的新A2L(model.a2l)文件每次更新时需要将旧(model.a2l)从工作空间删除(如果不删除则会覆盖上一版本model.a2l,当model.a2l新版本行数小于旧版本时,则新生成A2L末尾部分行会无法完成替换,造成文件错误)。

解决思路:

通过:

for i=1
fgetl(fidw)endwhile ~feof(fidw)    
fprintf(fidw,'%s\n','');
end  

语句,先将model.a2l文件中的所有语句用‘’空字符代替(即清空文档)。

剩余缺点:

  1. 由于elf文件为tasking生成,生成后保存在tasking工程工作空间的debug路径,故需要使用:

disp('选择tasking debug 路径下生成的elf文件');
[filename2, pathname2, FileIndex] = uigetfile({'*.elf', 'All excel file(*.elf)'; ...'*.*', 'All Files (*.*)'}, ...'Pick an elf file');
if FileIndex == 0 % 如果选择了‘cancel’
disp('未选择文件');
else
file_path = [pathname2 filename2];
end

对文件进行选取,需要自己动一下鼠标选择elf文件,无法实现全自动。

文件效果

初始条件下,工作空间无.a2l、.elf文件:

运行脚本

此时自动生成a2l文件及elf文件

workspace报警告不用管,因为我手动选择的elf文件是我随便选的一个(之前创建用于点灯的elf),并不是ADAS模型的elf,所以在进行elf、model地址合并时肯定会报警告,因为找不到对应的标定量。

生成的elf和a2l也满足要求,此处以1174为替换分界行。(可以看到此时标定量的地址还是空,原因如上。不影响脚本功能)。

猜你喜欢

转载自blog.csdn.net/qq_27595745/article/details/129759722