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> 是刷写文件的容器。它聚合了 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 描述如下。
6.1.2. <DATABLOCKS>
与 Session 不同的是,一个 DataBlock 只会索引一个 FlashData。它聚合的节点中,比较重要的是 <SEGMENT>,定义了每个刷写文件中需要刷写的数据段。各 Segment 见的地址段不能重叠。
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 描述如下:
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 描述如下:
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 描述如下: