文章目录
对于一个完整的A2L文件,应该包含总线的信息,如果是can总线应该包含波特率、CAN ID等,其次就是支持实现的功能CTO/DTO等,应该还有观测量和标定量的信息(地址,名称等),一般simulink生成的A2L中是不带地址信息的,需要后面通过带有地址信息的可执行文件来 填充地址,一般采用工具自动实现填充。
为了方便理解,将A2L的内容分为两个区: 协议区和数据区。
A2L文件大部分内容都是属于数据区,存放了数据的描述信息。本文先介绍数据区。
建议:
若文中类容的参数定义看不懂,可以ctrl+f搜索本文,应该可以找到对应的解释。或者直接参考ASAM MCD-2
数据区
Record Layout
为A2L文件中的其他变量提供布局方式
FNC_VALUES
有4个参数:
Position:table values在structure中的位置,基本都是1
DataType:见A2L文件预定义类型[datatype类型],根据实际定义变量的类型来
IndexMode:见A2L文件预定义类型[IndexMode类型],
AddressType:见A2L文件预定义类型[addrtype类型]
AXIS_PTS_X
有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
标定量CHARACTERISTIC
数值型标定量
Simulink生成A2L中的标定量:
/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
"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中的参数和地址信息
一维查表标定量
Simulink生成A2L中的标定量:
/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地址都是标定数组的首地址。
二维查表标定量
Simulink生成A2L中的标定量:
/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的地址表示为二维数组的首地址。
观测量MEASUREMENT
数值观测量
Simulink生成A2L中的观测量:
/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
一维数组观测量
Simulink生成A2L中的观测量:
/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表示的结果是一样的。
Conversion Method
数据的转换方式
必选参数有:名称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参数。
GROUP
将标定量和观测量分类,对于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的融合。
A2L文件预定义类型
datatype
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
Type类型 | 描述 |
VALUE | 值 |
CURVE | 一维查表 |
MAP | 二维查表 |
CUBOID | 三维查表 |
CUBE_4 | 四维查表 |
CUBE_5 | 五维查表 |
VAL_BLK | 无轴数组 |
ASCII | 字符串 |
ConversionType
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.
COEFFS-可选参数
该关键字用于为以下类型的分数有理函数指定系数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 */
COEFFS_LINEAR-可选参数
此关键字用于指定以下类型的线性函数的系数a和b:
f(x)=ax + b
FORMULA-可选参数
用于转换的公式
REF_UNIT-可选参数
此关键字用于引用测量单位(例如,单位类型的对象)。字符串参数单位是冗余信息,因为REF_UNIT引用的记录也包含该信息。仅为了与先前版本的ASAM MCD-2MC兼容,参数REF_UNIT是可选的。
STATUS_STRING_REF-可选参数
此关键字用于将ECU内部值的值范围分为数字部分和文字部分。文字部分可用于可视化状态信息(例如,“传感器未连接”)。
IndexMode-针对于数据
IndexMode类型 | 描述 |
COLUMN_DIR | deposited in columns按列存放 |
ROW_DIR | deposited in rows按行存放 |
indexorder-针对于坐标轴
indexorder类型 | 描述 |
INDEX_INCR | 随着地址的增加而增加索引 |
INDEX_DECR | 随着地址的增加而减少索引 |
addrtype
addrtype类型 | 描述 |
PBYTE | 相关内存位置有一个指向该表值或轴点值的1字节指针 |
PWORD | 相关内存位置有一个指向该表值或轴点值的2字节指针 |
PLONG | 相关内存位置有一个指向该表值或轴点值的4字节指针 |
DIRECT | 相关的内存位置具有第一个表值或轴点值,所有其他的都跟随递增地址 |
AxisType
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公众号,《汽车电子学习笔记》感兴趣可以关注一下,有问题可以与我留言交流~~~