Technical 技术

ODX-F 文件结构概述

1. 什么是 ODX-F?

ODX-F 文件是 ODX 文件的一种,用于描述 ECU 的刷写数据(program / reprogram / flash data)。

2. 那么什么是 ODX 文件?

可参照前面的文章: ODX – 车辆开放式诊断数据交换协议

3. 什么是 ECU 刷写?

将数据从外部传输到 ECU 的过程叫做 ECU 刷写。英文将其称为 “ECU Data Programming”,通常用 Flash 来指代,Program 和 Reprogram 也是一个意思。

4. ODX-F 怎么用?

诊断仪在刷写流程开始之前,需调用对应的 ODX-F 文件来获取刷写文件信息。

5. ODX-F 的数据模型 (Data Model)?

如其他的 ODX 文件一样,ODX-F 也是 XML 文件。

笔者从一个真实的 ODX-F 文件中,整理出了具体其 XML 结构。直接上图(看不清放大看)。

6. ODX-F 文件中各节点的作用是?

6.1. <ECU-MEM>

在 ISO22901-1 协议中,对于该节点的 UML 描述如下 (关于 UML 的具体定义也可参考 ODX – 车辆开放式诊断数据交换协议 )。


ECU-MEM 的 UML 描述

<ECU-MEM> 是刷写文件的容器。它聚合了 2 个主要的子节点:

  • <MEMs>
  • <PHYS-MEMs>

<MEM> 又聚合了 3 个子节点:

  • <SESSIONS>
  • <DATABLOCKS>
  • <FLASHDATAS>

<MEM> 的 3 个子节点对应关系相对简单。每个 Session 就是一次刷写会话,一个 Session 会索引到一个或多个 DataBlocks,一个 DataBlock 又会索引到一个 FlashData。

<PHYS-MEMS> 较为独立,它下面的 <PHYS-SEGMENT> 是用于描述 ECU 物理内存的地址排列,例如 ECU 内存实际的 FlashDriver 段、Code 段、DataA 段、DataB段的物理起始地址分别是多少。 在刷写时,诊断软件需校验刷写数据中的地址分段是否符合 ECU 的物理地址分段。

6.1.1. <SESSIONS>

Session 聚合了 2 个子节点:

  • <EXPECTED-IDENT>
  • <CHECKSUM>

前者用于描述在刷写前需要校验的软硬件版本号信息,后这用于描述 CheckSum 信息。

UML 描述如下。

<SESSION> 的 UML 描述
6.1.2. <DATABLOCKS>

与 Session 不同的是,一个 DataBlock 只会索引一个 FlashData。它聚合的节点中,比较重要的是 <SEGMENT>,定义了每个刷写文件中需要刷写的数据段。各 Segment 见的地址段不能重叠。

UML 描述如下:

<DATABLOCK> 的 UML 描述
6.1.3. <FLASHDATAS>

一个 FlashData 它即可以在 ODX-F 文件内部包含刷写数据(在 <DATA> 节点中用字符串表示),也可索引到一个外部的刷写文件(在<DATAFILE>节点中定义刷写文件的名称)。刷写文件内容的格式可以为MOTOROLA-S, INTEL-HEX,BINARY 等。

文件内部包含 Hex 文件的例子如下(来自于 ISO-22901 协议):

<FLASHDATA ID="F.ECUMEM.MEM.SESSION.FLASHDATA01.ID" xsi:type="INTERN-FLASHDATA">
    <SHORT-NAME>FLASHDATA01</SHORT-NAME>
        <DATAFORMAT SELECTION="INTEL-HEX"/>
            <DATA>
                :020000020000FC
                :100000003821F64FB80000003800BF193800000052
                :100010003821F64FB80000003821F64FB800000034
                :100020003821F64FB80000003880BC81380000004D
                :100030003821F64FB80000003821F64FB800000014
                :100040003821F64FB800000077006098800000006B
                :100050003821F64FB80000003821F64FB8000000F4
                ...
            </DATA>
</FLASHDATA>

文件内部包含 Binary 文件的例子如下( 来自于 ISO-22901 协议 ):

<FLASHDATA ID = "F.ECUMEM.MEM.SESSION.FLASHDATA03.ID" xsi:type = "INTERN-FLASHDATA">
<SHORT-NAME>FLASHDATA03</SHORT-NAME>
<DATAFORMAT SELECTION = "BINARY"/>
<DATA>
000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F
606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F
808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F
A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
</DATA>
</FLASHDATA>

具体的 UML 描述如下:

<FLASHDATA> 的 UML 描述

6.2. <PHYS-MEMS>

前文有说到<PHYS-MEMS> 下面的 <PHYS-SEGMENT> 是用于描述 ECU 物理内存的地址排列。如下是协议中给出的一个的例子:

<PHYS-MEM ID = "F.ECUMEM.MEM.PHYSMEM01.ID">
    <SHORT-NAME>PHYSMEM01</SHORT-NAME>
    <LONG-NAME>Physical Memory Map of EXU xyz</LONG-NAME>
        <PHYS-SEGMENTS>
            <PHYS-SEGMENT ID = "F.ECUMEM.MEM.PHYSMEM01.PHYSSEG01.ID" xsi:type = "ADDRDEF-PHYS-SEGMENT">
            <SHORT-NAME>PHYSSEG01</SHORT-NAME>
            <LONG-NAME>Physical Memory Segment 01</LONG-NAME>
            <FILLBYTE>FF</FILLBYTE>
            <BLOCK-SIZE>512</BLOCK-SIZE>
            <START-ADDRESS>0000</START-ADDRESS>
            <END-ADDRESS>FFFF</END-ADDRESS>
        </PHYS-SEGMENT>
    </PHYS-SEGMENTS>
</PHYS-MEM>

具体的 UML 描述如下:


<PHYS-MEMS> 的 UML 描述

6.3. <ECU-MEM-CONNECTOR>

<ECU-MEM-CONNECTOR> 是用于链接 <ECU-MEM> 和诊断层(odx-d)的。因此,该部分 ODX 会索引到 ECU-MEM 和 ECU-VARIANT。协议中给出的例子如下:

<ECU-MEM-CONNECTOR ID = "F.ECUMEMCON01.ID">
    <SHORT-NAME>Connector1</SHORT-NAME>
    <LONG-NAME>Connector 1</LONG-NAME>
    <FLASH-CLASSS>
        <FLASH-CLASS ID = "CLASS-1">
            <SHORT-NAME>CLASS_1</SHORT-NAME>
        </FLASH-CLASS>
    </FLASH-CLASSS>
    <SESSION-DESCS>
        <SESSION-DESC DIRECTION = "DOWNLOAD">
            <SHORT-NAME>SESSION_1</SHORT-NAME>
            <PARTNUMBER>1</PARTNUMBER>
            <PRIORITY>1</PRIORITY>
            <SESSION-SNREF SHORT-NAME = "ECU_MEM_SESSION_1"/>
            <DIAG-COMM-SNREF SHORT-NAME = "FlashService"/>
            <FLASH-CLASS-REFS>
                <FLASH-CLASS-REF ID-REF = "CLASS-1"/>
            </FLASH-CLASS-REFS>
            <AUDIENCE
                IS-AFTERMARKET = "false"/>
        </SESSION-DESC>
    </SESSION-DESCS>
    <IDENT-DESCS>
        <IDENT-DESC>
            <DIAG-COMM-SNREF SHORT-NAME = "ReadIdent"/>
            <IDENT-IF-SNREF SHORT-NAME = "Ident1"/>
                <OUT-PARAM-IF-SNREF SHORT-NAME = "identValue"/>
            </IDENT-DESC>
        </IDENT-DESCS>
        <ECU-MEM-REF ID-REF = "F.ECUMEM01.ID" DOCTYPE = "FLASH"/>
        <LAYER-REFS>
            <LAYER-REF DOCTYPE = "LAYER" DOCREF = "ECUVARIANT01" ID-REF = "ECUVARIANT01.ID"/>
        </LAYER-REFS>
</ECU-MEM-CONNECTOR>

具体的 UML 描述如下:

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x