最近实在太忙,险些弃更了。但这是写给自己的一些技术总结,无论是否有别人看,写这些东西对我自己还是有意义的,所以还是鼓励自己抽出时间写一写。
在《诊断文件ODX(六) - 诊断服务中的参数类型简介》中,我介绍了在ODX文件中定义诊断服务(service)时使用的8种参数类型。其中最常用的一种参数类型是“VALUE”。
诊断仪的作用不仅是完成诊断请求的发送和诊断响应的接收,还要将诊断请求中的用户友好的值转换为数据帧上的值,或者反向转换。举个简单的例子,诊断仪向用户提供了一个改写ECU某个参数的界面,而这个界面是要求用户写入一个 0 ~ 655.35km/h的速度值,但这个数据在最终的诊断命令中占了两个字节,故取值范围是00 00 ~ FF FF(16进制,转换成10进制取值范围为 0 到65535,和用户输入的值的关系是相差100倍),当我输入100km/h时,实际在诊断命令中发送的数值应该是100*100再转换成16进制,即0x2710。而这个转换过程就依赖于“VALUE”参数所引用的数据对象。
“VALUE”参数能够引用三种数据对象,分别是DATA-OBJECT-PROP(简称DOP)、STRUCTURE、END-OF-PDU-FIELD。其中后两者是由DOP派生而来,DOP是最常见的数据对象。
在规范中,DOP的文字描述比较晦涩,在这里以一个DOP的定义为例,来简单介绍一下这种数据对象的用法。
DOP描述了如何从数据流中提取出某个数据项,并利用某种计算方法 (COMPU-METHOD)将提取出的数据项转化为物理表达。在完成转换之后,还可以引用某个单位(UNIT)来进一步描述数据信息。
DOP的DIAG-CODED-TYPE元素:
该元素与诊断服务中的PARAM中BYTE-POSITION 和 BIT-POSITION共同使用,用于从数据流中提取数据。BYTE-POSITION 和 BIT-POSITION定义了数据的起始位置,而DIAG-CODED-TYPE元素中则包含了数据长度。该元素还包含一个BASE-DATA-TYPE属性,用于描述提取的数据类型,比如INT32、UINT32等。
DOP的PHYSICAL-TYPE元素:
该元素定义了数据的物理表达方式,即最终呈现给诊断仪使用者的数据。它也包含一个BASE-DATA-TYPE属性,用于描述数据类型。
DOP的COMPU-METHOD元素:
COMPU-METHOD元素定义了某种计算方法,用于将从数据流中提取的编码值(由DIAG-CODED-TYPE元素描述)转化为呈现给诊断仪使用者的数据(由PHYSICAL-TYPE元素描述)。在规范中总共定义了多种计算方法,常用的包括:
identical(编码值与物理值相同)、Linear(编码值与物理值呈线性关系)、Scale Linear(分段线性关系)、rational function(编码值与物理值呈有理函数关系)、Scale rational function(分段有理函数关系)、Texttable(用于将编码值转换为文字表达)。
DOP的INTERNAL-CONSTR元素:
该元素用于定义编码值的取值范围。
DOP的UNIT-REF元素:
该元素用于引用一个单位,用于详细描述物理值,比如速度、温度等单位。
总结,DOP元素的用途就是将诊断命令中的编码值和呈现给用户的物理值进行相互转换,这么短的篇幅无法完全讲清楚,但是知道了这个东西被定义出来的目的是什么,再看规范是很容易理解的。