首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Matlab编程技巧:导入A2L文件

  • 23-09-22 00:45
  • 2211
  • 12045
blog.csdn.net

本文研究如何通过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代码生成ASAP2untitled_ert_rtwuntitled.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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

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


>> info = getMeasurementInfo(a2lfile,'Signal1')

info = 

  Measurement - 属性:

             Resolution: 0
               Accuracy: 0
            LocDataType: 'FLOAT64_IEEE'
                   Name: 'Signal1'
         LongIdentifier: ''
             ECUAddress: 0
    ECUAddressExtension: 0
             Conversion: [1×1 xcp.CompuMethodRational]
              Dimension: 1
             LowerLimit: -1.7000e+308
             UpperLimit: 1.7000e+308
                BitMask: []
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这里就会返回出输出类型、最大最小值等属性,以及非常关键的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            */      255
      ECU_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.984375
      ECU_ADDRESS                       0x0000 /* @ECU_Address@Signal2@ */
    /end MEASUREMENT
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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)];
end

for 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

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

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中的一些信息不算很困难,只需要按照实际需要灵活使用即可。

>>返回个人博客总目录

注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/109256499"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top