XCP之A2L文件简介
文章目录
一、A2L文件简介
A2L文件是一个标定的描述文件,基于文本格式,描述ECU的通信等相关的参数,以及标定,观测变量的地址以及物理值计算公式等等。A2L 文件中的信息允许 XCP 主站通过 XCP 连接与从站模块通信。格式化的文本文件包含事件和测量定义以及其他配置信息,用于采集和激励数据以及执行其他函数。
二、A2L文件结构
按A2L文件结构分Version,Project,Module,及Module下的Keyword。
三、A2L文件组成
-
A2L文件头(项目配置信息等,一般不随软件编译变化,除非对应参数调整)
-
标定变量描述(包含的地址信息每次编译都有可能变化)
-
观测变量描述(包含的地址信息每次编译都有可能变化)
-
其他辅助信息,转换公式等 (一般不随软件编译变化,除非对应参数调整)
四、A2L文件分解
ASAP2_Version:
ASAP2_VERSION 1 60 /* Version 1.60 */
PROJECT:
/begin PROJECT ProjectName "Project Comment Goes Here"
。。。。。。/*以下所有信息都包含在PROJECT内*/
/end PROJECT
/* (add any file trailer comments here) */
/* EOF ACCS_subsystem_integrated.a2l */
HEADER:
该块里边包含了项目信息,包括项目编号,项目版本等信息
/begin HEADER "Header Comments go here"
/end HEADER
MODULE:
该块里边包含了在标定测量层面来描述ECU需要的所有信息,一个ECU对应一个MODULE块,MODULE由许多子块来组成1MOD_PAR这个块里包含了用于管理ECU的数据,例如客户名,编号,CPU类型,ECU的内存分配等,其中最重要的就是ECU的内存分配,开发人员需要根据ECU内存分段情况定义MEMORY SEGMENT和SEGMENT里边的PAGE,这里的SEGMENT/PAGE的概念和在线标定中的概念是一致的,一个MODULE里边只能出现一次。
/begin MODULE ModuleName "Module Comment Goes Here"
/begin MOD_PAR "MOD PAR Comment Goes Here"
/end MOD_PAR
/begin MOD_COMMON "Mod Common Comment Here"
BYTE_ORDER MSB_LAST
/end MOD_COMMON
。。。。。。/*以下所有信息都包含在MODULE内*/
/end MODULE
MOD_PAR
MOD_PAR关键字用于描述要为设备配置的管理数据。除了注释之外,所有参数都是可选的。暂时没有用到。
/begin MOD_PAR "MOD PAR Comment Goes Here"
/end MOD_PAR
MOD_COMMON:
该块用来指定ECU的一些标准的一般性描述信息,比如大小端,数据的对齐方式,FLOAT变量的处理方式等,一个MODULE里也只能出现一次。
/begin MOD_COMMON "Mod Common Comment Here"
BYTE_ORDER MSB_LAST
ALIGNMENT_BYTE 1
ALIGNMENT_WORD 2
ALIGNMENT_LONG 4
ALIGNMENT_FLOAT32_IEEE 4
ALIGNMENT_FLOAT64_IEEE 8
ALIGNMENT_INT64 8
/end MOD_COMMON
BYTE_ORDER:字节序,MSB_LAST=Intel,默认为Intel
ALIGNMENT_BYTE:声明整个模块中的BYTE对齐方式。如果参数缺失,对齐方式为1,其他同理。
RECORD_LAYOUT:
该块用来定义标定变量的物理存储结构(单个变量,二维表,三维表等)。
/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 Scalar_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_LONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Scalar_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE 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
/begin RECORD_LAYOUT Lookup1D_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_BYTE
AXIS_PTS_X 1 SBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_UBYTE
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_UWORD
AXIS_PTS_X 1 UWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_WORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_WORD
AXIS_PTS_X 1 SWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_ULONG
AXIS_PTS_X 1 ULONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_SLONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_LONG
AXIS_PTS_X 1 SLONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_FLOAT32_IEEE
AXIS_PTS_X 1 FLOAT32_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup1D_X_FLOAT64_IEEE
AXIS_PTS_X 1 FLOAT64_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_BOOLEAN
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_BOOLEAN
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_UBYTE
FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_UBYTE
AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_BYTE
FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_BYTE
AXIS_PTS_X 1 SBYTE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_UWORD
FNC_VALUES 1 UWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_UWORD
AXIS_PTS_X 1 UWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_WORD
FNC_VALUES 1 SWORD COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_WORD
AXIS_PTS_X 1 SWORD INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_ULONG
FNC_VALUES 1 ULONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_ULONG
AXIS_PTS_X 1 ULONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_LONG
FNC_VALUES 1 SLONG COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_LONG
AXIS_PTS_X 1 SLONG INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_FLOAT32_IEEE
FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_FLOAT32_IEEE
AXIS_PTS_X 1 FLOAT32_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_FLOAT64_IEEE
FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT
/end RECORD_LAYOUT
/begin RECORD_LAYOUT Lookup2D_X_FLOAT64_IEEE
AXIS_PTS_X 1 FLOAT64_IEEE INDEX_INCR DIRECT
/end RECORD_LAYOUT
CHARACTERISTIC:
该块用来定义标定变量,里边包含了可以被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的标定变量。
/begin CHARACTERISTIC
/* Name */ KtAEBS_CrvtRateWeightFactor
/* Long Identifier */ ""
/* Characteristic Type */ CURVE
/* ECU Address */ 0x0000 /* @ECU_Address@KtAEBS_CrvtRateWeightFactor@ */
/* Record Layout */ Lookup1D_FLOAT32_IEEE
/* Maxdiff */ 0
/* Conversion Method */ AEBS_subsystem_integrated_CM_single
/* Lower Limit */ -3.4E+38
/* Upper Limit */ 3.4E+38
/begin AXIS_DESCR
/* Description of X-Axis Points */
/* Axis Type */ COM_AXIS
/* Reference to Input */ NO_INPUT_QUANTITY
/* Conversion Method */ AEBS_subsystem_integrated_CM_single
/* Number of Axis Pts */ 2
/* Lower Limit */ -3.4E+38
/* Upper Limit */ 3.4E+38
AXIS_PTS_REF KaAEBS_AXIS_SpdForCrvtRateWF
/end AXIS_DESCR
/end CHARACTERISTIC
AXIS_PTS:
该块用来定义数组或查表变量对应的轴的类型,它将被RECORD_LAYOUT块来引用,一个ECU里边可以有很多种不同的轴类型,用于实现查表和插值,一般很少用到。MEASUREMENT该块用来定义测量变量,里边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的测量变量。
/begin AXIS_PTS
/* Name */ KaAEBS_AXIS_SpdForCrvtRateWF
/* Long Identifier */ ""
/* ECU Address */ 0x0000 /* @ECU_Address@KaAEBS_AXIS_SpdForCrvtRateWF@ */
/* Input Quantity */ NO_INPUT_QUANTITY
/* Record Layout */ Lookup1D_X_FLOAT32_IEEE
/* Maximum Difference */ 0
/* Conversion Method */ AEBS_subsystem_integrated_CM_single
/* Number of Axis Pts */ 2
/* Lower Limit */ -3.4E+38
/* Upper Limit */ 3.4E+38
/end AXIS_PTS
MEASUREMENT:
用来定义测量变量,里边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的测量变量。
/begin MEASUREMENT
/* Name */ VfAEBS_AEB_acceleration_req
/* Long identifier */ ""
/* Data type */ FLOAT32_IEEE
/* Conversion method */ AEBS_subsystem_integrated_CM_single
/* Resolution (Not used) */ 0
/* Accuracy (Not used) */ 0
/* Lower limit */ -3.4E+38
/* Upper limit */ 3.4E+38
ECU_ADDRESS 0x0000 /* @ECU_Address@VfAEBS_AEB_acceleration_req@ */
/end MEASUREMENT
COMPU_METHOD:
该块用于定义计算公式,及原始值和物理值之前的转换关系,这些公式可以被标定变量和测量变量来引用,从而将原始值转换成便于用户阅读和使用的物理值。COMPU_TAB该块用来定义原始值和物理值的映射关系,是一种特殊的转换关系,它一般应用于枚举变量,例如我们想采集一个代表XCP状态机的变量,分别为0对应DISCONNECTED,1对应CONNECTED,2对应RESUME,那么我们就可以把这样的映射关系定义成一个COMPU_TAB,然后关联到对应的变量上,这时候如果上位机采集到1这样的原始值,它就可以将当前的状态显示成“CONNECTED”字样,方便用于阅读和使用。FUNCTION该块为可选项,很少使用。
/begin COMPU_METHOD
/* Name of CompuMethod */ AEBS_subsystem_integrated_CM_single
/* Long identifier */ "Q = V"
/* Conversion Type */ RAT_FUNC
/* Format */ "%8.6"
/* Units */ ""
/* Coefficients */ COEFFS 0 1 0 0 0 1
/end COMPU_METHOD
GROUPS:
该块是把标定变量和测量变量按照一定的逻辑(比如功能模块)组织起来,在上位机中形成一个下拉菜单,使得用于可以从中选择变量,这块是可选的。
/begin GROUP
/* Name */ AEBS_subsystem_integrated
/* Long identifier */ "AEBS_subsystem_integrated"
/* Root */ ROOT
/begin SUB_GROUP
Root_AEBS
/end SUB_GROUP
/begin REF_MEASUREMENT
VbAEBS_DeactivePrefil_Visn
VbAEBS_Deactive_Visn
VbAEBS_FullBrkDeactVisn
VbAEBS_FullBrkReqVisn
VbAEBS_OnComigVehVisn
VbAEBS_PartBrkDeactVisn
VbAEBS_PartBrkReqVisn
VbAEBS_PrefillDeactVisn
VbAEBS_PrefillReqVisn
VfAEBS_AreqFinalVisn
VfAEBS_InhibitCodeVisn
VfAEBS_InhibitVisn
/end REF_MEASUREMENT
/end GROUP
Data type:
FLOAT32_IEEE:IEEE 754 格式的 32 位浮点数。
FLOAT64_IEEE:IEEE 754 格式的 64 位浮点数。
UBYTE:无符号 8 位整数。
SBYTE:有符号 8 位整数。
UWORD:无符号 16 位整数。
SWORD:有符号 16 位整数。
ULONG:无符号 32 位整数。
SLONG:有符号 32 位整数。
CHAR:字符。
STRING:字符串。
ENUM:枚举类型,通常用于定义属性的可选值。
STRUCT:结构类型,用于组织多个数据元素到一个数据结构中。
ARRAY:数组类型,用于定义相同数据类型的多个元素的集合。
COUNTER:计数器类型,用于描述一个值在时间内的变化。
BOOLEAN:布尔类型,表示真(TRUE)或假(FALSE)。
RECORD:记录类型,通常用于组合不同数据类型的元素。
CURVE:曲线类型,用于描述参数随输入变化的关系。
MAP:地图类型,用于描述两个输入参数和一个输出参数之间的关系。