因为a2l文件不像.c、.cs等语言可以在notepad++直接通过选择语言,然后就可以看到文件的层次结构,方便折叠、展开、不同颜色标注等,方便程序员进行阅读。
本人通过notepad++的自定义语言,实现了a2l的结构性查看,可以帮助你更高效地阅读a2l文件。
详细操作见:https://star-302.blog.csdn.net/article/details/126385627
A2L 文件包括:设备参数信息、接口数据信息和 ECU 参数信息。
/begin PROJECT /*表示一整个项目,一个文件一个项目*/
/begin HEADER
/*描述项目信息,包括项目编号,项目版本等信息*/
/end HEADER
/begin MODLUE/*描述ECU需要的所有信息,一个ECU对应一个MODULE块*/
/begin A2ML/*描述接口数据格式,包括传输命令,DAQ及传输层的定义*/
/end A2ML
/begin MOD_PAR /*管理ECU的数据,CPU 客户 编号等等,最重要的是内存的分段分页管理,类似DSP中的CMD文件*/
/end MOD_PAR
/begin MOD_COMMON/*一般性描述信息,比如数据的对齐方式*/
/end MOD_COMMON
/begin IF_DATA/*接口数据具体的参数*/
/end IF_DATA
/begin FUNCTION/*【非必须】FUNCTION这个在Vcetor提供的SIP包中会对XcpAppl的版本进行引用*/
/end FUNCTION
/begin CHARACTERISTIC/*定义标定变量,包含被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息*/
/end CHARACTERISTIC /*可定义多个*/
/begin AXIS_PTS /*该块用来定义数组或查表变量对应的轴的类型,它将被标定变量【二维表(CURVE)、三维图(MAP)】等块来引用,一个ECU里边可以有很多种不同的轴类型,用于实现查表和插值*/
/end AXIS_PTS
/begin MEASUREMENT/*定义测量变量,包含了被测量的变量的名字,地址,长度,计算公式,精度(分辨率Resolution和准确度Accuracy),最大最小值等信息*/
/end MEASUREMENT/*可定义多个*/
/begin COMPU_METHOD/*定义计算公式,及原始值和物理值之前的转换关系 如phy = ax+b*/
/end COMPU_METHOD
/begin COMPU_VTAB /*定义原始值和物理值的映射关系 一般是枚举变量*/
/end COMPU_VTAB
/begin RECORD_LAYOUT/*定义标定变量的物理存储结构(一维,二维表,三维图等)*/
/end RECORD_LAYOUT
/begin MERGED UNIT /*【非必须】MERGED UNIT部分会对单位进行定义,如将“Seconds”定义为“s”等*/
/end MERGED UNIT
/end MODLUE
/end PROJECT
小知识:关于准确度Accuracy和分辨率Resolution
关于准确度Accuracy和分辨率Resolution,举一个例子:一把尺子,最小是1mm,拿它量东西,就不能读出1mm以下的数来,那么这个1mm就是它的(最小)分辨率,即最小可分辨的度量。如果已经知道一个物体的实际长度是100mm,拿这把尺子来测量,量出来的数据是102mm,那么这个尺子的准确度就是(102-100)/100=0.02,即测量结果与真实数值之间的误差。
再说一个概念精密度Precision,这个是指同一个仪器每次数值之间的离散程度,比较的对象是自己每次测量的数据。也用上文的做测量,还是上次的那一个物体,测了5次,数据分别是108,109,107,107,108,108。这些数据和真实值100mm之间的误差都不小,但是这些数据之间的差距都很小,说明精密度不错。
很多人常常把精密度Precision误判断为精度,也有些厂家误导使用者故意使用精密度代替精度。一般而言大家讲的精度都是指准确度。
参考网址:
https://bbs.instrument.com.cn/topic/6313459/
https://www.cnblogs.com/jaxthon/p/4827804.html
表示一整个项目,一个文件一个项目。
/begin PROJECT AUTOSAR_111 "XCP on CAN"
...
...
/end PROJECT
描述项目信息,包括项目编号,项目版本等信息。
/begin HEADER ""
VERSION "1.0.0.0"
PROJECT_NO AUTOSAR_111
/end HEADER
描述ECU需要的所有信息,一个ECU对应一个MODULE块 。
A2ML描述接口数据格式,在该部分不会具体的描述出传输层,传输速率等。包括PROTOCAL_LAYER、DAQ及传输层相关的定义,相当于提前将可能用到的信息在这个部分定义好,在后面IF_DATA实际应用时就直接从这部分中引用。
PROTOCAL_LAYER部分会将用到的CMD罗列出来,如:
("OPTIONAL_CMD" enum { /* XCP-Code of optional command */
/* supported by the slave */
"GET_COMM_MODE_INFO" = 0xFB,
"GET_ID" = 0xFA,
"SET_REQUEST" = 0xF9,
"GET_SEED" = 0xF8,
"UNLOCK" = 0xF7,
"SET_MTA" = 0xF6,
"UPLOAD" = 0xF5,
......
......
})
/begin MOD_COMMON ""
DEPOSIT ABSOLUTE
BYTE_ORDER MSB_LAST
/end MOD_COMMON
补充:Code和Data的定义
A2L文件中需要指定内存的分布情况,即在MOD_PAR关键字下编写MEMORY_SEGMENT关键字,MEMORY_SEGMENT关键字下通过PrgType属性和MemoryType属性指定Code和Data在内存中的地址。
MCD系统(INCA或CANape)认为Code和Data一定是存储在Flash中的,而不是RAM中,所以在指定Code内存段和Data内存段时,其MemoryType属性一定是FLASH,而CODE和DATA属性分别标识代码内存段和数据内存段。
补充:A2L文件中MEASUREMENT和CHARACTERISTIC的地址
对于MEASUREMENT来说,其A2L中的地址为MAP文件中对应的RAM地址,因为观测量只是可读而不可写,RAM中的地址是其对应的运行时地址,FLASH中存储的是其初始化的值,该值在statup copy-down的时候就会从FLASH中复制至RAM中,所以对于MEASUREMENT来说,只关心其RAM中的地址。
对于CHARACTERISTIC来说,其A2L中的地址为MAP文件中对应的FLASH地址,因为标定量是可读可写的,所以需要指出其在FLASH中的地址,供其进行修改。
不知道是否可以这样来考虑,对于观测量来说,其作用是用来显示一个变量的值,观测其变化趋势,而并不需要修改它的值,所以只需要提供它的RAM地址就可以了,RAM地址处对应的值是随着时间改变的,所以可以作为观测量。另外,对于标定量来说,既然要求可读可写,所以就一定要知道其在FLASH中的地址。
这块是A2L文件的核心内容,定义的内容如下:
各个Timeout时间,如Connect、Checksum及发送PROGRAM_START/PROGRAM_VERIFY等命令的最大超时时间;
OPTIONAL_CMD,罗列了用到的CMD命令,这部分会影响实际的使用,如果后面大家在实际应用中发现不能发某个指令可以来此部分看看是不是没有;
DAQ的配置:DAQ类型(动态/静态?)数量,用到的Event(如2ms/5ms/10ms等);
这两个Block不是必须的部分,其中;
FUNCTION这个在Vcetor提供的SIP包中会对XcpAppl的版本进行引用;
MERGED UNIT部分会对单位进行定义,如将“Seconds”定义为“s”等
/begin FUNCTION __DDS_EXPA2_DEFAULT_FUNC__
"__DDS_EXPA2_DEFAULT_FUNC__"
/end FUNCTION
标定量存放部分,包含了被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以有多个标定变量。
重要知识:标定变量按类型分为VALUE、CURVE和MAP,三者之间的区别在干该标定变量是否含有坐标轴(AXIS_DESCR)。
形式1(VALUE)【其他形式见:6)AXIS_PTS】:
/begin CHARACTERISTIC
CAL_MPC_IsCutOffFrq_f32 /*Name 变量名字*/
"CAL_MPC_IsCutOffFrq_f32" /*Long Identifier(类似Comment)*/
VALUE /*Type*/
0x8014305C /*地址*/
Scalar_FLOAT32_IEEE /*Record Layout*/
0 /*Maximum Difference精度(分辨率)*/
BSW_A2L_Ident_Float /*Conversion Method计算公式*/
-3.4E+38 /*Lower Limit最小值*/
3.4E+38 /*Upper Limit最大值*/
/end CHARACTERISTIC
在ASAP2 Studio的统计中,AXIS_PTS也算在标定量中,如下图。
当有的标定量需要多个轴(X,Y)来决定时,需要用到AXIS_PTS,AXIS_PTS定义其中一个轴的量。
下图中标注的部分【CHARACTERISTIC引用AXIS_PTS】
形式2【Curve(X—>Y)X为AXIS,Y为CHARACTERISTIC】:
形式3【MAP(X,Y—>Z)X、Y为AXIS,Z为CHARACTERISTIC】:
CHARACTERISTIC部分的内容:
/begin CHARACTERISTIC
CAL_MPC_MtpvTableZ_idMot_af32
""
MAP
0x801421BC
Lookup2D_FLOAT32_IEEE
0
SWC_MPC_CM_single
-3.4E+38
3.4E+38
/begin AXIS_DESCR
COM_AXIS
NO_INPUT_QUANTITY
SWC_MPC_CM_single
19
-3.4E+38
3.4E+38
AXIS_PTS_REF CAL_MPC_MtpvTableY_N_af32
/end AXIS_DESCR
/begin AXIS_DESCR
COM_AXIS
NO_INPUT_QUANTITY
SWC_MPC_CM_single
8
-3.4E+38
3.4E+38
AXIS_PTS_REF CAL_MPC_MtpvTableX_Udc_af32
/end AXIS_DESCR
AXIS_PTS部分的内容:
/begin AXIS_PTS
CAL_MPC_MtpvTableY_N_af32
""
0x8014267C
NO_INPUT_QUANTITY
Lookup2D_X_FLOAT32_IEEE
0
SWC_MPC_CM_single
19
-3.4E+38
3.4E+38
/end AXIS_PTS
/begin AXIS_PTS
CAL_MPC_MtpvTableX_Udc_af32
""
0x801426C8
NO_INPUT_QUANTITY
Lookup2D_X_FLOAT32_IEEE
0
SWC_MPC_CM_single
8
-3.4E+38
3.4E+38
/end AXIS_PTS
定义测量变量,包含了被测量的变量的名字,地址,长度,计算公式,精度(分辨率Resolution和准确度Accuracy),最大最小值等信息,可定义多个。
/begin MEASUREMENT
VAR_AdcInitSBC_u16 /*Name 变量名字*/
"VAR_AdcInitSBC_u16" /*Long identifier(类似Comment)*/
UWORD /*Data type 值类型*/
BSW_A2L_Ident_Int /*Conversion method 计算公式*/
1 /*Resolution 分辨率*/
100 /*Accuracy 准确度*/
0 /*Lower limit 最小值*/
65535 /*Upper limit 最大值*/
ECU_ADDRESS 0x700094AA /*ECU_Address 地址*/
/end MEASUREMENT
总的来说,COMPU_METHOD与COMPU_VTAB都是计算公式,只不过计算方式不同,一种是通过公式,一种是通过查表的方式。
/begin COMPU_METHOD
RTE_A2L_Ident_Float /* Name of CompuMethod */
"Q = V" /* Long identifier */
RAT_FUNC /* Conversion Type */
"%8.6" /* Format */
"" /* Units */
COEFFS 0 1 0 0 0 1 /* Coefficients 系数 */
/end COMPU_METHOD
上述参数的理解可以见下图【a2l文件在ASAP2 Studio中打开】:
/begin COMPU_VTAB
FID_LIST
""
TAB_VERB
162
1 "FIM_ADC_UPhaseBISTFail"
2 "FIM_ADC_VPhaseBISTFail"
3 "FIM_ADC_WPhaseBISTFail"
4 "FIM_CANSM_E_BUS_OFF_NETWORK_0"
5 "FIM_Can_Timeout"
...
162 "FiM_FlagforFR"
DEFAULT_VALUE "---"
/end COMPU_VTAB
定义标定变量的物理存储结构(一维,二维表,三维表等)。
/begin RECORD_LAYOUT Scalar_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_SWORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_BOOLEAN
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
结合上边几段的内容,在ASAP2 Studio打开后,下边几张截图,是我的疑问点???
把标定变量和测量变量按照一定的逻辑(比如功能模块)组织起来,在上位机中形成一个下拉菜单,使得用户可以从中选择变量,这块是可选的。【对标定量和观测量进行分类,方便在上位机中查看操作】
你可以结合Vector的软件ASAP2 Studio来同步查看a2l文件,这样可以帮助你更快学习。
Matlab导出 ASAP2 文件:
https://ww2.mathworks.cn/help/rtw/ug/asap2-data-measurement-and-calibration.html#bsqg34r-1
基于ASAP2标准的A2L文件生成与解析技术实现:
https://www.doc88.com/p-7307624724803.html?r=1
了解A2L文件预定义类型:
https://blog.csdn.net/u011079613/article/details/117033590