A2L文件大部分内容都是属于数据区,存放了数据的描述信息。本文先介绍数据区。
若文中类容的参数定义看不懂,可以ctrl+f搜索本文,应该可以找到对应的解释。或者直接参考ASAM MCD-2
为A2L文件中的其他变量提供布局方式
有4个参数:
Position:table values在structure中的位置,基本都是1
DataType:见A2L文件预定义类型[datatype类型],根据实际定义变量的类型来
IndexMode:见A2L文件预定义类型[IndexMode类型],
AddressType:见A2L文件预定义类型[addrtype类型]
有4个参数:
Position:axis point values在structure中的位置,基本都是1
DataType:见A2L文件预定义类型[datatype类型],根据实际定义变量的类型来
indexorder:见A2L文件预定义类型[indexorder类型],一般都是INDEX_INCR,递增
AddressType:见A2L文件预定义类型[addrtype类型]
/begin RECORD_LAYOUT Scalar_BOOLEAN
FNC_VALUES 1 UBYTE 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
基本AddressType都是DIRECT
/begin CHARACTERISTIC
/* Name */ MyParameter_C
/* Long Identifier标定量描述 */ "this is my Parameter"
/* Type */ VALUE
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_C@ */
/* Record Layout */ Scalar_UWORD
/* Maximum Difference */ 0
/* Conversion Method */ CM_unitless
/* Lower Limit */ 0.0
/* Upper Limit */ 65535.0
/end CHARACTERISTIC
在上述标定量中,可以看到标定参数以下信息:
名称,描述,类型,地址(没有给值),布局(A2L文件中Record Layout定义)
Maximum Difference:关于表值调整的最大浮动(注:该值被解释为绝对值,而不是百分比)
转换方法(A2L文件中Conversion Method定义),最小值,最大值
/begin CHARACTERISTIC MyParameter_C "this is my Parameter"
VALUE 0x80182F3C Scalar_UWORD_S1 0 CM_unitless_S1 0 65535
SYMBOL_LINK "MyParameter_C" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_C" 0x80182F3C 0 0 0 0 0 0
/end IF_DATA
/end CHARACTERISTIC
由于是多个A2L文件融合,并给定地址,所以Record Layout和Conversion Method后都跟了一个参数,用作区分,此处可以看到地址信息已经加入进来了。
多了参数:
SYMBOL_LINK:引用 linker map文件中的符号名称。 后面跟的数字是Offset,符号相对于 linker map文件中符号地址的偏移量,一般都是0
IF_DATA:数据记录,用于描述CHARACTERISTIC的接口特定数据。必须在ASAM MCD-2MC元语言中描述与此关键字相关的参数 ,在协议区中定义了CANAPE_EXT结构
"CANAPE_EXT" struct {
int; // version number, must be 100
taggedstruct {
"LINK_MAP" struct {
char[256]; // symbol name in MAP file
long; // symbol base address in MAP file 基础地址
uint; // address extension 扩展地址
uint; // flag: address is relative to DS
long; // address offset to the symbol base address
uint; // flag: data type information is valid
uint; // data type of symbol in MAP file (CANape internal data type representation)
uint; // bit offset of the symbol in MAP file
};
"DISPLAY" struct {
long; // display color
double; // minimal display value (phys)
double; // maximal display value (phys)
};
"VIRTUAL_CONVERSION" struct {
char[256]; // name of the (additional) conversion formula
};
};
};
100,表示的是版本,后面是LINK_MAP中的参数和地址信息
/begin CHARACTERISTIC
/* Name */ MyParameter_T
/* Long Identifier */ "this is my Parameter T"
/* Characteristic Type */ CURVE
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_T@ */
/* Record Layout */ Lookup1D_WORD
/* Maxdiff */ 0
/* Conversion Method */ CM_mm
/* Lower Limit */ -500.0
/* Upper Limit */ 500.0
/begin AXIS_DESCR
/* Description of X-Axis Points */
/* Axis Type */ COM_AXIS
/* Reference to Input */ Input
/* Conversion Method */ CM_km_h
/* Number of Axis Pts */ 6
/* Lower Limit */ 0.0
/* Upper Limit */ 360.0
AXIS_PTS_REF MyParameter_Ax
/end AXIS_DESCR
/end CHARACTERISTIC
/begin AXIS_PTS
/* Name */ MyParameter_Ax
/* Long Identifier */ "This is MyParameter_Ax"
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_Ax@ */
/* Input Quantity */ Input
/* Record Layout */ Lookup1D_X_UWORD
/* Maximum Difference */ 0
/* Conversion Method */ CM_km_h
/* Number of Axis Pts */ 6
/* Lower Limit */ 0.0
/* Upper Limit */ 360.0
/end AXIS_PTS
一维查表有两个轴,根据输入值,按X轴查对应的Y轴,得到对应的参数。
相对于数值型标定量,多了轴的描述.Axis Type见预定义类型AxisType。
Reference to Input:关于输入量的描述,请参考数据记录(参见MEASUREMENT)。如果未分配输入量,参数“InputQuantity”应设置为"NO_INPUT_QUANTITY"(测量和标定系统必须能够处理这种情况)。
Number of Axis Pts:轴点的最大数量(注:测量和标定系统可以改变characteristic的大小(增加或减少轴点的数量)。轴点的数量不能随意增加,因为测量和标定系统为ECU程序中的每个characteristic保留的地址范围不能更改。)
AXIS_PTS_REF:有关轴点分布的描述,请参考AXIS_PTS记录。
AXIS_PTS主要描述轴的信息,也是标定量的一部分。
/begin CHARACTERISTIC MyParameter_T "this is my Parameter T"
CURVE 0x801803CC Lookup1D_WORD_S1 0 CM_mm_s_S1 -500 500
/begin AXIS_DESCR
COM_AXIS Input CM_km_h_S1 6 0 360
AXIS_PTS_REF MyParameter_Ax
/end AXIS_DESCR
SYMBOL_LINK "MyParameter_T" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_T" 0x801803CC 0 0 0 0 0 0
/end IF_DATA
/end CHARACTERISTIC
/begin AXIS_PTS MyParameter_Ax "This is MyParameter_Ax"
0x801803A6 Input Lookup1D_X_UWORD_S1 0 CM_km_h_S1 6 0 360
SYMBOL_LINK "MyParameter_Ax" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_Ax" 0x801803A6 0 0 0 0 0 0
/end IF_DATA
/end AXIS_PTS
SYMBOL_LINK和CANAPE_EXT在上面一节已经说过,此处不再重复。
对于一维查表来说,ECU地址都是标定数组的首地址。
/begin CHARACTERISTIC
/* Name */ MyParameter_M
/* Long Identifier */ "This is MyParameter_M"
/* Characteristic Type */ MAP
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_M@ */
/* Record Layout */ Lookup2D_UBYTE
/* Maxdiff */ 0
/* Conversion Method */ CM_percent
/* Lower Limit */ 0.0
/* Upper Limit */ 100.0
/begin AXIS_DESCR
/* Description of X-Axis Points */
/* Axis Type */ COM_AXIS
/* Reference to Input */ Input1
/* Conversion Method */ CM_unitless
/* Number of Axis Pts */ 3
/* Lower Limit */ 0.0
/* Upper Limit */ 10.0
AXIS_PTS_REF MyParameter_x_Ax
/end AXIS_DESCR
/begin AXIS_DESCR
/* Description of Y-Axis Points */
/* Axis Type */ COM_AXIS
/* Reference to Input */ Input2
/* Conversion Method */ CM_km_h
/* Number of Axis Pts */ 9
/* Lower Limit */ 0.0
/* Upper Limit */ 360.0
AXIS_PTS_REF MyParameter_y_Ax
/end AXIS_DESCR
/end CHARACTERISTIC
/begin AXIS_PTS
/* Name */ MyParameter_x_Ax
/* Long Identifier */ "This is MyParameter_x_Ax"
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_x_Ax@ */
/* Input Quantity */ Input1
/* Record Layout */ Lookup2D_X_UBYTE
/* Maximum Difference */ 0
/* Conversion Method */ CM_uint8_unitless
/* Number of Axis Pts */ 3
/* Lower Limit */ 0.0
/* Upper Limit */ 10.0
/end AXIS_PTS
/begin AXIS_PTS
/* Name */ MyParameter_y_Ax
/* Long Identifier */ "This is MyParameter_y_Ax"
/* ECU Address */ 0x0000 /* @ECU_Address@MyParameter_y_Ax@ */
/* Input Quantity */ Input2
/* Record Layout */ Lookup2D_X_UWORD
/* Maximum Difference */ 0
/* Conversion Method */ CM_km_h
/* Number of Axis Pts */ 9
/* Lower Limit */ 0.0
/* Upper Limit */ 360.0
/end AXIS_PTS
二维查表相对于一维查表只是多了一个Y轴,根据两个输入值,查X轴和Y轴,共同决定最终的输出值,查的map为二维数组。
/begin CHARACTERISTIC MyParameter_M "This is MyParameter_M"
MAP 0x801830F6 Lookup2D_UBYTE_S1 0 CM_percent_S1 0 100
/begin AXIS_DESCR
COM_AXIS Input1 CM_unitless_S1 3 0 10
AXIS_PTS_REF MyParameter_x_Ax
/end AXIS_DESCR
/begin AXIS_DESCR
COM_AXIS Input2 CM_km_h_S1 9 0 360
AXIS_PTS_REF MyParameter_y_Ax
/end AXIS_DESCR
SYMBOL_LINK "MyParameter_M" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_M" 0x801830F6 0 0 0 0 0 0
/end IF_DATA
/end CHARACTERISTIC
/begin AXIS_PTS MyParameter_x_Ax "This is MyParameter_x_Ax"
0x80183443 Input1 Lookup2D_X_UBYTE_S1 0 CM_unitless_S1 3 0 10
SYMBOL_LINK "MyParameter_x_Ax" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_x_Ax" 0x80183443 0 0 0 0 0 0
/end IF_DATA
/end AXIS_PTS
/begin AXIS_PTS MyParameter_y_Ax "This is MyParameter_y_Ax"
0x801830A4 CDCInput_VehSpd Lookup2D_X_UWORD_S1 0 CM_km_h_S1 9 0 360
SYMBOL_LINK "MyParameter_y_Ax" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyParameter_y_Ax" 0x801830A4 0 0 0 0 0 0
/end IF_DATA
/end AXIS_PTS
轴的定义不一定和map在一起,因为可能很多地方都会用到这个轴,本文放在一起只是为了好看一些。
此处MyParameter_M的地址表示为二维数组的首地址。
/begin MEASUREMENT
/* Name */ MyMEASUREMENT
/* Long identifier */ "This is MyMEASUREMENT "
/* Data type */ UBYTE
/* Conversion method */ CM_unitless
/* Resolution (Not used) */ 0
/* Accuracy (Not used) */ 0
/* Lower limit */ 0.0
/* Upper limit */ 1.0
ECU_ADDRESS 0x0000 /* @ECU_Address@MyMEASUREMENT@ */
/end MEASUREMENT
观测量中有两个参数未使用:
Resolution:最小可能的位变化,也就是精度
Accuracy:可能与精确值的偏差(%),其他的参数应该都比较好理解了。
/begin MEASUREMENT MyMEASUREMENT "This is MyMEASUREMENT"
UBYTE CM_unitless 0 0 0 1
ECU_ADDRESS 0x700132C0
SYMBOL_LINK "MyMEASUREMENT" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyMEASUREMENT" 0x700132C0 0 0 0 0 0 0
/end IF_DATA
/end MEASUREMENT
/begin MEASUREMENT
/* Name */ MyMEASUREMENT_T
/* Long identifier */ "This is MyMEASUREMENT_T"
/* Data type */ UBYTE
/* Conversion method */ CM_boolean
/* Resolution (Not used) */ 0
/* Accuracy (Not used) */ 0
/* Lower limit */ 0
/* Upper limit */ 1
/* Array Size */
ARRAY_SIZE 4
ECU_ADDRESS 0x0000 /* @ECU_Address@MyMEASUREMENT_T@ */
/end MEASUREMENT
相对于数值,数组多了一个ARRAY_SIZE,很好理解,也就是数组的大小
/begin MEASUREMENT MyMEASUREMENT_T "This is MyMEASUREMENT_T"
UBYTE CM_boolean_S2 0 0 0 1
ECU_ADDRESS 0x70013456
MATRIX_DIM 4 1 1
SYMBOL_LINK "MyMEASUREMENT_T" 0
/begin IF_DATA CANAPE_EXT 100
LINK_MAP "MyMEASUREMENT_T" 0x70013456 0 0 0 0 0 0
/end IF_DATA
/end MEASUREMENT
此处ARRAY_SIZE变成了MATRIX_DIM,
MATRIX_DIM:显示多维度量的大小和维度。如果使用MATRIX_DIM关键字,则不需要ARRAY_SIZE选项。但是,如果同时使用关键字ARRAY_SIZE和MATRIX_DIM,则ARRAY_SIZE中的结果值必须与MATRIX_DIM的xDimyDimzDim相同。如果缺少关键字,则数组只有一个尺寸为ARRAY_SIZE的维度。
参数:
xDim-x维度中的值数
yDim-y维度中的值数
zDim-z维度中的值数
此处MATRIX_DIM4 1 1 和ARRAY_SIZE 4表示的结果是一样的。
数据的转换方式
必选参数有:名称Name,LongIdentifier描述,ConversionType 转换类型,Format精度,Units单位
可选参数有:COEFFS,COEFFS_LINEAR,COMPU_TAB_REF,FORMULA,REF_UNIT(见预定义类型中的对应项)
/begin COMPU_METHOD
/* Name of CompuMethod */ CM_unitless
/* Long identifier */ "This is My CompuMethod"
/* Conversion Type */ RAT_FUNC
/* Format */ "%3.0"
/* Units */ "unitless"
/* Coefficients */ COEFFS 0 1 0 0 0 1
/end COMPU_METHOD
此处Conversion Type设置为RAT_FUNC,则为有理转换,0 1 0 0 0 1代表abcdef参数。
将标定量和观测量分类,对于Simulink模型来说,是按模块来分类的。每个模块会单独划分一个组。
在标定软件中,可以看到组的定义,及里面的标定量和观测量。
/begin GROUP
/* Name */ S252_MyGROUP
/* Long identifier */ "This is S252_MyGROUP"
/begin REF_CHARACTERISTIC
MyParameter_C
MyParameter_T
MyParameter_M
/end REF_CHARACTERISTIC
/begin REF_MEASUREMENT
MyMEASUREMENT
MyMEASUREMENT_T
/end REF_MEASUREMENT
/end GROUP
Name:在ASAM MCD-2MC模块的所有组中,组的名称必须是唯一的,即模块中不得有另一个具有相同标识符的组对象。
REF_CHARACTERISTIC:后面定义需要加入组的标定量,只能是CHARACTERISTIC或AXIS_PTS.
REF_MEASUREMENT:后面定义需要加入组的观测量
对应到实际A2L中,只是组名称后面加了一个字符,用来区分不同的A2L的融合。
Data Type |
Signedness |
Bit Width |
Format |
UBYTE |
unsigned |
8 |
unsigned integer 1字节无符号整型 |
SBYTE |
signed |
8 |
two's complement integer 1字节有符号整型 |
UWORD |
unsigned |
16 |
unsigned integer 2字节无符号整型 |
SWORD |
signed |
16 |
two's complement integer 2字节有符号整型 |
ULONG |
unsigned |
32 |
unsigned integer 4字节无符号整型 |
SLONG |
signed |
32 |
two's complement integer 4字节有符号整型 |
A_UINT64 |
unsigned |
64 |
unsigned integer 8字节无符号整型 |
A_INT64 |
signed |
64 |
two's complement integer 8字节有符号整型 |
FLOAT32_IEEE |
signed |
32 |
IEEE 754 single precision 4字节浮点型 |
FLOAT64_IEEE |
signed |
64 |
IEEE 754 double precision 8字节浮点型 |
Type类型 |
描述 |
VALUE |
值 |
CURVE |
一维查表 |
MAP |
二维查表 |
CUBOID |
三维查表 |
CUBE_4 |
四维查表 |
CUBE_5 |
五维查表 |
VAL_BLK |
无轴数组 |
ASCII |
字符串 |
ConversionType类型 |
描述 |
RAT_FUNC |
有理转换Rational, f(x)=(axx + bx + c)/(dxx + ex + f) INT = f(PHYS) 系数a、b、c、d、e、f必须由COEFFS关键字指定 |
IDENTICAL |
不转换,PHYS = INT |
FORM |
根据FORMULA键字指定的公式进行转换。 |
LINEAR |
以下类型的线性函数:f(x)=ax+b PHYS=f(INT) 系数a和b必须由COEFFS_LINEAR关键字指定 |
TAB_INTP |
带插值的表格 |
TAB_NOINTP |
无插值的表格 |
TAB_VERB |
字符表转换Verbal Table |
对于线性函数,使用ConversionType linear;对于ident函数,使用ConversionType
IDENTICAL。对于非线性函数,必须能够在所使用的AXIS_PTS,、CHARACTERISTIC或MEASUREMENT范围内反转公式。否则,请使用ConversionType FORM.
该关键字用于为以下类型的分数有理函数指定系数a、b、c、d、e、f:
f(x)=(axx + bx + c) / (dxx + ex + f)
Example:
COEFFS 0 4 8 0 0 5
/* Control unit internal values of revolutions (INT) is calculated from */
/* physical values (PHYS: unit of PHYS is [rpm]) as follows: */
/* INT = (4/5) * PHYS/[rpm] + (8/5) */
/* inverted: PHYS/[rpm] = 1.25 * INT - 2.0 */
此关键字用于指定以下类型的线性函数的系数a和b:
f(x)=ax + b
用于转换的公式
此关键字用于引用测量单位(例如,单位类型的对象)。字符串参数单位是冗余信息,因为REF_UNIT引用的记录也包含该信息。仅为了与先前版本的ASAM MCD-2MC兼容,参数REF_UNIT是可选的。
此关键字用于将ECU内部值的值范围分为数字部分和文字部分。文字部分可用于可视化状态信息(例如,“传感器未连接”)。
IndexMode类型 |
描述 |
COLUMN_DIR |
deposited in columns按列存放 |
ROW_DIR |
deposited in rows按行存放 |
indexorder类型 |
描述 |
INDEX_INCR |
随着地址的增加而增加索引 |
INDEX_DECR |
随着地址的增加而减少索引 |
addrtype类型 |
描述 |
PBYTE |
相关内存位置有一个指向该表值或轴点值的1字节指针 |
PWORD |
相关内存位置有一个指向该表值或轴点值的2字节指针 |
PLONG |
相关内存位置有一个指向该表值或轴点值的4字节指针 |
DIRECT |
相关的内存位置具有第一个表值或轴点值,所有其他的都跟随递增地址 |
AxisType类型 |
描述 |
CURVE_AXIS |
曲线轴。此轴类型使用单独的CURVE CHARACTERISTIC来重新缩放轴。参考曲线用于查找轴索引,控制器使用索引值确定CURVE 或MAP中的操作点。 |
COM_AXIS |
对轴点进行分组或对轴点进行描述以进行存放。对于这种轴点变体,轴点值与仿真内存中curve或map的表值分离,并且必须通过特殊的AXIS_PTS数据记录进行描述。对该记录的引用使用关键字'AXIS_PTS_REF'。 |
FIX_AXIS |
这是一条曲线或一张带有虚拟轴点的地图,这些虚拟轴点未存放在EPROM上。轴点可以根据使用关键字FIX_AXIS_PAR,FIX_AXIS_PAR_DIST,FIX_AXIS_PAR_LIST定义的参数计算。无法修改轴点。 |
RES_AXIS |
重新缩放轴。对于这种轴点变体,轴点值为与仿真内存中curve或map的表值分离 并且必须通过特殊的AXIS_PTS数据记录进行描述。对该记录的引用使用关键字'AXIS_PTS_REF'。 |
STD_AXIS |
标准轴 |
目前用到的就这些参数定义,如果后面遇到新的,还会持续更新~~
你的点赞,收藏,关注,转发是对小弟的最大支持~~~~
建了一个WX公众号,《汽车电子学习笔记》感兴趣可以关注一下,有问题可以与我留言交流~~~