在《诊断文件ODX(五) - DIAG-SERVICE元素》中提到过,DIAG-SERVIC是ODX文件中最核心的元素,找到它之后,就可以层层抽丝剥茧把它引用的所有数据类型都找出来,这对我们理解ODX文件的定义是非常有帮助的。可以把DIAG-SERVICE元素当作一个根节点,通过它去了解ODX的构造。
![96b2fe24c3513c9e9a067944c5ee6338.png](https://i-blog.csdnimg.cn/blog_migrate/5b0ee54b09e0a60b1799b86f4565f7b6.jpeg)
DIAG-SERVICE的下级元素分别是REQUEST, POS-RESPONSE和NEG-RESPONSE。而这三个元素的下级元素则是一个个的PARAM(即参数Parameter的缩写)。
![17566ad039569c2c2aeb588b6e88bdeb.png](https://i-blog.csdnimg.cn/blog_migrate/4f0db04e4714527ed1f29f3faaa8e000.jpeg)
上图展示了一个带有三个PARAM的REQUEST,我用红线画出来的“type”是PARAM最重要的属性,它定义了这个PARAM的类型。这篇文章的主要内容就是介绍ODX中定义的PARAM类型。
- VALUE类型:
![b6bb904a09f8dc3e4c1812324b116216.png](https://i-blog.csdnimg.cn/blog_migrate/7f324f01de57953866cd81551f818eed.jpeg)
VALUE是最常用的PPARAM类型,这种类型的参数需要引用一个数据对象,被引用的数据对象具体定义了这个参数的数据结构,比如长度、转换方法、单位等等。被引用的数据对象在ODX中命名为Data Object Property ,简称DOP,以及一系列由DOP派生出来的数据对象。被VALUE参数引用的数据类型在下一篇文章中介绍。
2. RESERVED类型
如果某个参数没有具体用处需要被诊断忽略掉,则定义为这种类型。RESERVED类型很不常用。
3.CODED-CONST
![a5facaa4905cad41b74099b4234e4c62.png](https://i-blog.csdnimg.cn/blog_migrate/ba9b84d015b8473680f075a1d25389de.jpeg)
CODED-CONST类型用于一些数值固定的参数,主要用于SERVICE-ID。
4.PHYS-CONST
PHYS-CONST类型也是用于一些数值固定的参数,与CODED-CONST不同的是,它需要引用一个DOP来解释参数的转换方法,而CODED-CONST则只需要<CODED-VALUE>来定义参数值就可以了。
5.LENGTH-KEY
在某些情况下,一个参数的长度需要由另一个参数来决定,比如0x34服务中的“lengthOfMemoryAddress”这个参数,就决定了后面的内存地址信息所占用的字节数。在这里,lengthOfMemoryAddress的类型就是LENGTH-KEY。LENGTH-KEY类型的参数引用一个DOP来描述另一个参数的长度,而被描述长度的那个参数则引用这个LENGTH-KEY类型的参数,这样 诊断 仪就可以知道这个参数的长度是多少了。下面这个例子很好地解释了LENGTH-KEY的用法。
![0022eaed880c704dc614b409092c127b.png](https://i-blog.csdnimg.cn/blog_migrate/706094213bc586532077b21d8c176363.jpeg)
6.MATCHING-REQUEST-PARAM
这参数 只能用在RESPONSE中,作为REQUEST中的echo,用于验证收到的响应是否与请求中的内容相匹配。最典型的应用是0x2E服务。 比如2E AA BB XX XX XX这个请求中,AA BB是一个标识符,正响应是6E AA BB,正响应中的AA BB就是MATCHING-REQUEST-PARAM类型。
7.TABLE-KEY和TABLE-STRUCT
TABLE-KEY和TABLE-STRUCT 这两种参数类型主要用于读取和写入数据,即 22和2E服务。每个ECU所支持的读写标识符都有很多,所以可以用列表(table)的方式来组织这些数据。
在介绍这两种类型的参数之前,先介绍一下TABLE这种数据类型。TABLE是ODX中定义的一种数据结构(与DOP, STRUCTURE等属于并列的概念,不要与PARAM类型搞混),TABLE由一个个的TABLE-ROW元素组成,每个TABLE-ROW就代表了一个标识符,它由一个KEY元素和一个对STRUCTURE元素的引用构成,前者就是ID,后者则表征了这个ID所代表的数据定义。
接下来 介绍我们的 主角,TABLE-KEY和TABLE-STRUCT,来看看它们是如何实现读写数据的。
![5fb12b5d7c8187831911adf5aabb0835.png](https://i-blog.csdnimg.cn/blog_migrate/487d811713425d1c1fc72e6e4d0fcafd.jpeg)
上图展示了一个用2E服务写入数据的例子,第一个参数是SID,第二个参数是TABLE-KEY,第三个参数是TABLE-STRUCT。在这里,TABLE-KEY指向了一个TALBE数据结构,而非具体的TABLE-ROW,TABLE-STRUCT则指向了同一REQUEST中的TABLE-KEY,这样,只要选定了TABLE-KEY,则TABLE-STRUCT也就确定了。诊断仪处理ODX数据时,就可以根据TABLE把所有的写入ID的服务构造出来了。
![58e2976b847b1d336280476e07251567.png](https://i-blog.csdnimg.cn/blog_migrate/5d7707982a69740269422a9feee88317.jpeg)
上图也是用2E服务写入数据的例子,第一个参数是SID,第二个参数是TABLE-KEY,第三个参数是TABLE-STRUCT。与之前那张图的区别在于,这里的TABLE-KEY指向了一个具体的TABLE-ROW,TABLE-STRUCT同样也指向了同一REQUEST中的TABLE-KEY。
这两种实现方式没有优劣之分,只是静态的方式在构造ODX文件时需要为所有的ID都构造一条服务,而动态的方式只需要一条服务。
8. TABLE-ENTRY
TABLE-ENTRY类型的参数只能存在于被TABLE-ROW引用的STRUCTURE数据结构中。STRUCTURE是ODX文件中的一种数据结构,类型为VALUE的参数可以是STRUCTURE,STRUCTURE是一种递归的定义,它又可以包含多个参数(PARAM)。TABLE-ENTRY指向某个具体的TABLE-ROW。
这部分定义比较乱,参数类型和ODX数据类型很容易混淆,写这篇文章一方面是帮助同行厘清概念,另一方面也是帮助自己巩固记忆。
下篇 文章将对DOP , STRUCTURE, TABLE等ODX数据类型进行介绍。