利用Simulink生成自定义的A2L

    A2L文件是用于标定的一种文件,其作为ASAP2标准的表现形式,主要包含了ECU信息描述部分和ECU通讯信息描述部分。

    什么是ASAP2标准?

    此处要引用别人的话来说明了,因为我本人对其也不是很了解。ASAP2标准是ASAM在1998年提出来的,现在它的名字叫做ASAM MCD-2MC/D,是ASAP标准中的第二部分。整个ASAP有3部分内容,ASAP1描述了上位机(Master)和ECU(Slave)之间的通讯协议(可以是XCPonCAN,XCPonUSB等,也可以是CCP,还可以是UDS)。ASAP2规定了Master端如何去描述和解析Slave端的信息,ASAP3规定了如何使用第三方工具和设备操作和控制上位机(Master),例如如何使用台架软件来控制标定测量工具去对ECU进行控制和测试。

利用Simulink生成自定义的A2L_第1张图片

    什么是A2L文件?

    A2L文件是基于ASAP2标准书写完成的,那么A2L文件到底是什么东西了。首先它是采用ASAP2指定的一套类XML语言的描述性语言(采用开标签和关标签来描述信息)书写的文件,它里边包含了某个特定的ECU中的软件和系统信息,还包含了上位机和ECU通讯方式的约定,它用来指导上位机和ECU的通讯交互过程,让他们对交互的信息有一致的认识,从而是上位机工具准确且友好的将ECU中的信息展现给用户。 一个A2L定义如下:

/begin PROJECT

                   ident Name

                   string LongIdentifier

                   [->HEADER]

                   {->MODULE}*

/end PROJECT

PROJECT是关键字,指明当前变量的类型,/begin和/end是分界符,表示PROJECT的作用范围,通常称为一个模块。Name表示PROJECT的名称,LongIdentifier表示当前变量注释。HEADER和MODULE当前变量的成员,分别表示头信息和设备信息。头信息是可选项,出现一次或者没有,MODULE是任选项,出现多次或者不出现。一个A2L文件只能有一个PROJECT,对应一个ECU,其设备信息由一个MODULE来描述。一个设备中比较重要的成员变量有以下几种:

  1. A2ML:描述接口数据格式
  2. MOD_PAR:设备参数描述
  3. MOD_COMMON:设备公共参数
  4. IF_DATA:接口数据具体参数
  5. CHARACTERISTIC:标定变量,其类型包括VALUE,CURVE,MAP
  6. MEASUREMENT:测量变量
  7. COMPU_METHOD:转换方法,具体有6种转换方法
  8. RECORD_LAYOUT:内存布局,描述数据的存放方式

    好了,了解了以上的内容,我们就可以去研究如何去获得A2L文件了,1.A2L文件是由第三方提供的;要么2.利用专用工具生成A2L文件(CANape、Targetlink等)。通常情况下,专用工具生成的文件是不能够直接用于标定的,因为它里面不包含准确的内存地址,无法对应我们要标定的参数和测量的信号。标定的工具一般有INCA、CANape等等,我目前手里面有的设备是dSPACE的DCI-CAN1,目前应该用的都是DCI-CAN2了,所以本文主要是针对simulink软件生成自定义用于dSPACE工具标定的A2L文件的方法进行探讨。

    假定我们的算法模型如下:

利用Simulink生成自定义的A2L_第2张图片

其中ParF_A和ParF_B是需要标定的参数,X和Y是需要监测的信号。在simulink自带的数据字典中做相应的配置,包括准确的数据类型,存储类型,初值等。然后control+E打开simulink configuration,在code generation下面找到interface栏,Data Exchange->ASAP2。这样配置完成后其实对模型进行build已经能够生成A2L文件了,关于生成代码的配置我这里没有一一描述。

利用Simulink生成自定义的A2L_第3张图片

并且也能够找到CHARACTERISTIC对应的参数,但是我们发现其生成的A2L文件缺少一些内容,如IF_DATA字段,MD_COMMEN字段,而且HEADER中也没有内容。所以想要的到包含IF_DATA等字段的A2L文件就需要对其TLC文件进行自定义。打开‘MATLABroot/toolbox/rtw/twrgets/asap2/asap2/user’目录下的asap2userlib.tlc文件,对其进行编辑

%function ASAP2UserFcnWriteHeader() Output
  /begin HEADER "Header Comments go here"
   
  /end HEADER
%endfunction


%% Function: ASAP2UserFcnWriteHardwareInterface
%% Abstract: Used to define hardware interface for ASAP2 file.
%%
%% NOTE: It may be easiest to inline separate files for each section:
%% For example:
%%   %include "./user_a2ml.txt"
%% 
%function ASAP2UserFcnWriteHardwareInterface() Output

     /begin MOD_PAR "%"

     /end MOD_PAR
    
     /begin MOD_COMMON  "%
        BYTE_ORDER     %
     /end MOD_COMMON
%endfunction

我主要对这两个函数进行修改,插入了IF_DATA和MOD_PAR内容,

%function ASAP2UserFcnWriteHardwareInterface() Output
    /begin A2ML
        /include XCP_v1_0_definitions.aml
       block "IF_DATA" taggedunion if_data {
         /include XCP.aml
         /include dSPACE_XCP.aml
       };
    /end A2ML
    
     /begin MOD_COMMON  "%"
        ALIGNMENT_BYTE 1
        ALIGNMENT_WORD 2
        ALIGNMENT_LONG 4
        ALIGNMENT_FLOAT32_IEEE 4
        ALIGNMENT_FLOAT64_IEEE 4
        DEPOSIT ABSOLUTE
        BYTE_ORDER     %
    /end MOD_COMMON

    /begin MOD_PAR "%"
        NO_OF_INTERFACES 1
        /begin MEMORY_SEGMENT
            CalibrationData                                                 /* Name */
            "Memory segment for page CalibrationData"                       /* LongIdentifier */
            DATA                                                            /* PrgType */
            RAM                                                             /* MemoryType */
            EXTERN                                                          /* Attribute */
            0x40000000                                                      /* Address */
            0x9FFF                                                          /* Size */
            -1 -1 -1 -1 -1                                                  /* Offset */
            /begin IF_DATA XCP
                /begin SEGMENT。。。。。还有内容

保存,回到模型路径,对算法重新build,生成心的A2L如下:

利用Simulink生成自定义的A2L_第4张图片

已经包含了接口数据具体参数等内容。接下来把算法的代码放到IDE中,将工程重新编译。MATLAB提供了两种方法更新A2L中的ECU地址。分别利用工程编译后的.map文件和.elf文件。前者在更新完地址后可以对比检查,但是对于不同的编译器其.map问价的格式有不同,所以有的时候MATLAB会提示错误,这就需要再次更改tlc文件来实现,后者一般不会报错,但是.elf无法打开,从而无法查证更新的地址的准确性。两种方法利用到的函数分别是:asap2post(A2L,MAP);rtw.asap2SetAddress(A2L,ELF);我采用的是后者进行更新,同时我所使用的的IDE编译后还有.map文件,进行对比检查,没有错误。到此A2L就完成了,将其导入到controlDesk中,就可以进行标定测量了。

    由于每次编译都可能导致变量地址的变化,所以在每次编译后都要重新更新A2L中的ECU地址,再将其reload到上位机中,以保证变量读取写入正确的位置。

    在实际应用过程中发现,MATLAB对定义为结构体的参数或者变量不会生成对应的字段,据说是此功能用户量较少,很多问题没有暴露出来,所以在应用此方法是应尽量避免定义结构体参数。

    整理就到这里,欢迎交流指正!

 

 

你可能感兴趣的:(A2L,Simulink,MATLAB生成A2l,a2l标定)