本文研究如何通过Matlab脚本导入A2L文件,并将A2L文件的一些信息写入表格中。

文章目录

  • 1 A2L文件
  • 2 A2L文件的解析
  • 3 将A2L信息导入表格
    • 3.1 A2L中的变量信息
    • 3.2 Matlab脚本
    • 3.3 导出表格
  • 4 ASAP2 Tool-Set工具
  • 5 总结

1 A2L文件

做汽车控制器开发的同行肯定对A2L文件不会陌生,通过A2L文件可以进行数据采集和标定。A2L文件的格式符合ASAP2标准,格式可以参照ASAP2标准手册。

2 A2L文件的解析

A2L文件也是文本文件,只要知道了其中的书写规则(ASAP2标准),就可以通过Matlab中的fopen之类的函数打开,并用正则表达式提取字符串信息。但是在实际工作中,这种“造轮子”的做法不但付出了时间成本,而且很容易出错。

实际上,Matlab软件已经很贴心地帮我们做好了封装,可以直接调用函数导入A2L文件信息。

博主通过Simulink生成了一个包含两个观测量(MEASUREMENT)的A2L文件untitled.a2l。

如果要获取这个A2L中的这两个观测量信息,首先在Matlab命令行输入xcpA2L函数:

>> a2lfile = xcpA2L('untitled.a2l')a2lfile = A2L - 属性:FileName: 'untitled.a2l'FilePath: 'E:\学习\博客\Simulink代码生成\ASAP2\untitled_ert_rtw\untitled.a2l'SlaveName: 'ModuleName'ProtocolLayerInfo: []DAQInfo: []TransportLayerCANInfo: []TransportLayerUDPInfo: []TransportLayerTCPInfo: []Events: {}Measurements: {'Signal1'  'Signal2'}Characteristics: {}EventInfo: []MeasurementInfo: [2×1 containers.Map]CharacteristicInfo: [0×1 containers.Map]AxisInfo: [0×1 containers.Map]RecordLayouts: [45×1 containers.Map]CompuMethods: [2×1 containers.Map]CompuTabs: [0×1 containers.Map]CompuVTabs: [0×1 containers.Map]

Matlab就会返回一个A2L对象a2lfile,其中包含了这个A2L中的许多重要信息,比方说Measurements这个成员里,是两个观测量 {‘Signal1’ ‘Signal2’}的元胞数组。

如果想要获取观测量Signal1的更多信息,则只要使用getMeasurementInfo函数,将之前的A2L对象和观测量作为第一和第二个参数传入:


>> info = getMeasurementInfo(a2lfile,'Signal1')info = Measurement - 属性:Resolution: 0Accuracy: 0LocDataType: 'FLOAT64_IEEE'Name: 'Signal1'LongIdentifier: ''ECUAddress: 0ECUAddressExtension: 0Conversion: [1×1 xcp.CompuMethodRational]Dimension: 1LowerLimit: -1.7000e+308UpperLimit: 1.7000e+308BitMask: []

这里就会返回出输出类型、最大最小值等属性,以及非常关键的ECUAddress地址信息。这里地址为零时因为该A2L文件中的地址还没有通过elf文件或者map文件更新进去。

3 将A2L信息导入表格

这一章节会通过一个完整的脚本将A2L中的观测量和标定量导入表格中,其他的属性,类似于轴信息的导入,可以举一反三。

3.1 A2L中的变量信息

在第2章的基础上,给A2L文件中再加上一个标定量Parameter1,也就是包含了如下三个观测量或标定量。

A2L文件中的部分信息:/begin CHARACTERISTIC/* Name                   */      Parameter1  /* Long Identifier        */      ""/* Type                   */      VALUE /* ECU Address            */      0x0000 /* @ECU_Address@Parameter1@ */ /* Record Layout          */      Scalar_FLOAT32_IEEE /* Maximum Difference     */      0 /* Conversion Method      */      untitled_CM_single /* Lower Limit            */      -3.4E+38 /* Upper Limit            */      3.4E+38/end CHARACTERISTIC/begin MEASUREMENT/* Name                   */      Signal1/* Long identifier        */      ""/* Data type              */      UBYTE/* Conversion method      */      untitled_CM_uint8/* Resolution (Not used)  */      0/* Accuracy (Not used)    */      0/* Lower limit            */      0/* Upper limit            */      255ECU_ADDRESS                       0x0000 /* @ECU_Address@Signal1@ *//end MEASUREMENT/begin MEASUREMENT/* Name                   */      Signal2/* Long identifier        */      ""/* Data type              */      UWORD/* Conversion method      */      untitled_CM_ufix16_En6/* Resolution (Not used)  */      0/* Accuracy (Not used)    */      0/* Lower limit            */      0/* Upper limit            */      1023.984375ECU_ADDRESS                       0x0000 /* @ECU_Address@Signal2@ *//end MEASUREMENT

3.2 Matlab脚本

完整的脚本如下:

function ImportA2L()
%% 弹窗选择A2L文件
[file,path] = uigetfile('*.a2l','请选择A2L文件');
A2L_Path = fullfile(path,file);% A2L文件绝对路径%% 导入A2L文件
a2lfile = xcpA2L(A2L_Path);% A2L对象
MeasurementsName_Cell = a2lfile.Measurements;% 观测量集合
CharacteristicsName_Cell = a2lfile.Characteristics;% 标定量集合%% 获取属性信息,写入单元数组
Measurements_Cell = {'Name','DataType','Lower','Upper','ECUAddress'};% 观测量工作表内容
Characteristics_Cell = {'Name','Lower','Upper','ECU_ADDRESS'};% 标定量工作表内容
for i = 1:length(MeasurementsName_Cell)% 循环处理观测量info = getMeasurementInfo(a2lfile,MeasurementsName_Cell{i});NextRow = size(Measurements_Cell,1)+1;% 获取下一行行数Measurements_Cell{NextRow,1} = MeasurementsName_Cell{i};Measurements_Cell{NextRow,2} = info.LocDataType;Measurements_Cell{NextRow,3} = num2str(info.LowerLimit);Measurements_Cell{NextRow,4} = num2str(info.UpperLimit);Measurements_Cell{NextRow,5} = ['0x',dec2hex(info.ECUAddress)];
endfor i = 1:length(CharacteristicsName_Cell)info = getCharacteristicInfo(a2lfile,CharacteristicsName_Cell{i});NextRow = size(Characteristics_Cell,1)+1;Characteristics_Cell{NextRow,1} = CharacteristicsName_Cell{i};Characteristics_Cell{NextRow,2} = num2str(info.LowerLimit);Characteristics_Cell{NextRow,3} = num2str(info.UpperLimit);Characteristics_Cell{NextRow,4} = ['0x',dec2hex(info.ECUAddress)];
end%% 将数组写入表格
Excel_Path = strrep(A2L_Path,'.a2l','.xlsx');% 表格与A2L同名同路径
xlswrite(Excel_Path,Measurements_Cell,'Measurements');
xlswrite(Excel_Path,Characteristics_Cell,'Characteristics');
end

这部分脚本比较简单,根据注释也能看懂,博主也就不做过多的解释了。

3.3 导出表格

最终的效果是,在A2L路径下生成一个同名的表格文件,里面的两个工作表中分别包含了标定量和观测量信息。

4 ASAP2 Tool-Set工具

博主工作中有许多处理A2L文件的场景,但是Matlab中关于处理A2L的函数并不多。Vector公司的ASAP2 Tool-Set工具就涵盖了处理A2L文件的各种场景,所以在本文中顺便介绍一下。博主会经常用到以下机中功能:

  1. ASAP2Creator可以通过特定的C语言注释格式,生成A2L文件,经常用于手写代码定义的观测量和标定量的A2L生成;
  2. ASAP2Merger可以把MasterA2L和SlaveA2L合并成一个A2L,例如供应商提供的MasterA2L和OEM的模型生成的A2L合并起来;
  3. ASAP2Updater可以把elf或者Map文件中的地址更新到空地址的A2L中,Matlab中也有函数可以实现该功能;
  4. ASAP2Modifier可以修改A2L文件,工作中常用的场景是把A2L中保密的观测量删除掉,再把删减的A2L发送给外部公司;

另外,该工具全面支持命令行调用,也就是说可以通过Matlab脚本调用实现自动化。

5 总结

通过Matlab封装好的函数导入A2L中的一些信息不算很困难,只需要按照实际需要灵活使用即可。

>>返回个人博客总目录

Matlab编程技巧:导入A2L文件相关推荐

  1. Matlab编程技巧:打开模型时加载数据字典

    本文研究通过回调函数,在打开模型时加载数据字典到工作空间中. 文章目录 1 问题引入 2 简单例程 2.1 模型配置 2.2 数据字典表格 2.3 创建脚本 3 效果演示 4 总结 1 问题引入 在& ...

  2. Matlab编程技巧:通过Matlab脚本批量修改Simulink模块的大小,背景颜色

    Matlab编程技巧:通过M脚本修改Simulink模块的大小,背景颜色 M脚本修改Simulink模块的大小,背景颜色 选取一个Simulink模型,获取模块参数,在命令行输入代码: sysBolc ...

  3. Matlab编程技巧:通过脚本获取/修改Simulink信号线参数

    上一篇博客<Matlab编程技巧:批量获取/修改Simulink模块参数>中,说明了如果通过matlab脚本批量获取/修改Simulink模块参数.具体方法可以参考https://blog ...

  4. 30多个实用matlab编程技巧

    感谢关注懂科学的程序员公众号!如果公众号文章对您有帮助,别忘了点击分享和"在看"哦!若您对公众号有什么意见或建议,请在公众号中回复或在任意文章底部留言! 今天给大家介绍一些编程小技 ...

  5. Matlab编程技巧:MBD中常用的Matlab函数

    在MBD(基于模型开发)中,需要掌握一些常用的函数.这些函数经常用于搭建集成环境.生成手写代码.工具链开发等.恰当地使用函数编写Matlab脚本可以提高MBD工作的自动化程度,提高工作效率. 本文会分 ...

  6. 【simulink专题】matlab 2022a如何生成A2L文件设置

    前言 在我们使用的Simulink建模过程中,会使用标定量,最终在模型设置中勾选ASAP2 Interface设置后生成A2l文件达到查看标定量的目的,但是最近有小伙伴发现,在新版MATLAB 202 ...

  7. Matlab编程技巧:通过脚本导入Excel数据字典

    本文研究如何将Excel表格中的数据字典导入到Matlab工作空间中,并在建模时使用. 文章目录 1 数据字典的概念及管理方式 2 Excel表格模板建立 3 脚本导入数据字典 3.1 导入方法 3. ...

  8. Matlab编程技巧:文本文件的读写

    在MBD(基于模型的设计)中涉及到了各种各样的文本文件,对文本文件的自动化处理可以大大提高工作效率.本文简单介绍处理文本文件的第一步--导入文本文件到Matlab. 文章目录 1 文本文件 2 读取文 ...

  9. Matlab编程与数据类型 -- M文件的编辑和存储

    本微信图文详细介绍了Matlab中M文件的编辑和存储.

最新文章

  1. 进程初识和multiprocessing模块之Process
  2. 现代密码学4.2--消息验证码/MAC
  3. qgraphicsview 添加矩形框并拖动改变大小_如何用手机巧影软件为视频添加字幕
  4. 协同过滤——基于邻域的算法
  5. vue中axios的封装以及使用
  6. 奥迪坚为中民燃气打造专业便民服务呼叫中心
  7. 用HTML,CSS和JavaScript创建iPhone/iPad应用程序
  8. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)
  9. matlab的基本语法规则_Matlab基本语法与指令
  10. python房屋租赁系统的设计与实现_毕业设计---在线房屋租赁系统的设计与实现.doc...
  11. 如何利用IDM加速下载百度网盘大文件
  12. 【操作系统】CPU寄存器详解
  13. vue中使用vue-waterfall2来实现瀑布流
  14. Java枚举—枚举进阶
  15. 《花雕学AI》07:AI脑洞大开-盘点最火爆人工智能ChatGPT的23种新颖用法
  16. php网站服务器ip地址吗,php 服务器ip地址吗
  17. 干货!让人一见钟情的网站header设计攻略
  18. Voxceleb2 视频数据集下载(国内链接)
  19. java语言获取数据库中的表的总行数
  20. 二叉排序树(二叉搜索树)

热门文章

  1. 人脸识别特征介绍以及难题概括
  2. POJ1005 I Think I Need a Houseboat
  3. 高考水平科测试软件,新高考学业水平测试,无法通过后果是什么,什么水平能过?...
  4. cocos 丝滑的四方向移动
  5. Youmi DSP讲堂|程序化生态中的SSP是个啥玩意?
  6. python编程语言教程-Python基础教程 - 全文
  7. NetworkD3 | 让我们一起画个动态的桑基图吧~
  8. 亮剑“威胁情报”,锐捷、腾讯联手打造“狙击手”
  9. 公开竞价与封闭式竞价有什么不同?
  10. chrome 不记录填写值_Chrome 调试技巧