基于can总线的A2L文件解析(1)

文章目录

  • 建议:
  • 数据区
    • Record Layout
      • FNC\_VALUES
      • AXIS\_PTS\_X
      • 数值型:
      • 坐标轴:
    • 标定量CHARACTERISTIC
      • 数值型标定量
        • Simulink生成A2L中的标定量:
        • 加入地址后的标定量:
        • **CANAPE\_EXT**
      • 一维查表标定量
        • Simulink生成A2L中的标定量:
        • 加入地址后的标定量:
      • 二维查表标定量
        • Simulink生成A2L中的标定量:
        • 加入地址后的标定量:
    • 观测量MEASUREMENT
      • 数值观测量
        • Simulink生成A2L中的观测量:
        • 加入地址后的观测量:
      • 一维数组观测量
        • Simulink生成A2L中的观测量:
        • 加入地址后的观测量:
    • Conversion Method
    • GROUP
  • A2L文件预定义类型
    • datatype
    • Type
    • ConversionType
      • COEFFS-可选参数
      • COEFFS\_LINEAR-可选参数
      • FORMULA-可选参数
      • REF\_UNIT-可选参数
      • STATUS\_STRING\_REF-可选参数
    • IndexMode-针对于数据
    • indexorder-针对于坐标轴
    • addrtype
    • AxisType

对于一个完整的A2L文件,应该包含总线的信息,如果是can总线应该包含波特率、CAN ID等,其次就是支持实现的功能CTO/DTO等,应该还有观测量和标定量的信息(地址,名称等),一般simulink生成的A2L中是不带地址信息的,需要后面通过带有地址信息的可执行文件来 填充地址,一般采用工具自动实现填充
为了方便理解,将A2L的内容分为两个区: 协议区和数据区。

基于can总线的A2L文件解析(1)_第1张图片
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公众号,《汽车电子学习笔记》感兴趣可以关注一下,有问题可以与我留言交流~~~

你可能感兴趣的:(Autosar笔记,A2L,XCP)