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进行控制和测试。
什么是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来描述。一个设备中比较重要的成员变量有以下几种:
好了,了解了以上的内容,我们就可以去研究如何去获得A2L文件了,1.A2L文件是由第三方提供的;要么2.利用专用工具生成A2L文件(CANape、Targetlink等)。通常情况下,专用工具生成的文件是不能够直接用于标定的,因为它里面不包含准确的内存地址,无法对应我们要标定的参数和测量的信号。标定的工具一般有INCA、CANape等等,我目前手里面有的设备是dSPACE的DCI-CAN1,目前应该用的都是DCI-CAN2了,所以本文主要是针对simulink软件生成自定义用于dSPACE工具标定的A2L文件的方法进行探讨。
假定我们的算法模型如下:
其中ParF_A和ParF_B是需要标定的参数,X和Y是需要监测的信号。在simulink自带的数据字典中做相应的配置,包括准确的数据类型,存储类型,初值等。然后control+E打开simulink configuration,在code generation下面找到interface栏,Data Exchange->ASAP2。这样配置完成后其实对模型进行build已经能够生成A2L文件了,关于生成代码的配置我这里没有一一描述。
并且也能够找到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如下:
已经包含了接口数据具体参数等内容。接下来把算法的代码放到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对定义为结构体的参数或者变量不会生成对应的字段,据说是此功能用户量较少,很多问题没有暴露出来,所以在应用此方法是应尽量避免定义结构体参数。
整理就到这里,欢迎交流指正!