22服务作为诊断服务种的基础服务,可以简单理解为就是一个用于读取ECU数据的外部接口,可实时获取软件内部的相关的状态信息。
鉴于本文是基础入门介绍,小T还是会问下大家有关22诊断服务的相关问题?
这篇,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:
根据ISO14119-1标准中所述,诊断服务22主要用于Client向Server(ECU)通过DID的方式读取相关的数据。这些数据可以输入输出的数字信号,模拟信号,内部数据以及其他的系统状态信息。
一般而言,对于22诊断服务,主要应用场景为以下场合:
上述这些应用场景较为常见,除此以外,当然还有很多面向ECU内部测试的应用场合,这里就不一一列举。
服务请求是Client发送给到Server的诊断服务指令。其中Client可以理解为Tester,Server可以理解为ECU节点。
按照ISO14229-1标准所述,如下图1所示:
下图2中各参数解释如下:
常见DID总结
根据ISO14229-1规范,定义了诸多只能用于特定场合的DID,也就意味着大家都不能随意乱用DID,在使用DID Number应充分考虑到14229的要求,防止出现跟客户扯皮的现象。
如下图3所示简要列举了较为常见的DID种类及其含义:
Single DID Format
以读取单个DID F1 90 (VIN码)为例,其对应的诊断请求实例如下图4所示:
特别需要注意的是22诊断并不存在Subfunction。
Multiple DID Format
既然存在单个DID读取,自然也就存在Multiple DID读取数据的操作,如下图5所示为同时读取多个DID(01 0A + 01 10)的22诊断服务请求实例:
当然多DID读取时表示的是超过一个DID以上的22诊断读取请求,因为个数不受限制。
谈到22服务的多DID读取,这边也可以拓展下Composite DID的使用,即通过读取一个DID便可以将map至该DID的多个DID一并读取出来,这样做的好处就是可以通过某一DID一次性获取其余已存在的DID的值,其软件实现也完全可通过配置来实现。
服务响应是针对Client对Server诊断请求的响应。
如下图6所示,为22诊断服务的正响应格式:
从上图中可以看出,22诊断服务的正响应由以下两个部分组成:
Single DID Format
如下图7所示,为上述单DID(F1 90)请求示例所对应的正响应:
Multiple DID Format
如下图8所示,为上述多DID(01 0A + 01 10)请求示例所对应的正响应:
如上图可知,该多DID的诊断回复中存在多种两个DID的Number以及紧随其后的数据取值。
NRC Code
绝大多数情况下,Server针对Client的请求都会给到正响应,比如发生重启前需确保整车处于安全状态,如引擎熄火,车速不能超过3km/h等,或者为了防止不按照诊断请求格式进行请求,那么Server需要通过某种方式来告诉Client执行不成功的原因在哪里以便于调查问题直至得到正响应。
因此ISO14229-1针对所有的诊断服务提供了一种统一的诊断负响应的诊断格式:7F +SID + NRC。
其中NRC全称为Negetive Responce Code,每个NRC具有唯一的含义来代表当前诊断请求错误的原因所在。当然每个诊断服务支持的NRC不尽相同,具体支持的NRC需要参考ISO14229-1标准文档,对于22服务而言支持的NRC如下图9所示:
NRC优先级
当诊断请求存在多种条件不满足的情况下,那么哪个NRC应当回复呢?毫无疑问此时就需要引入NRC优先级的概念,以下就是诊断服务22的NRC优先级,供诸君参考:
NRC优先级
当诊断请求存在多种条件不满足的情况下,那么哪个NRC应当回复呢?毫无疑问此时就需要引入NRC优先级的概念,以下就是诊断服务22的NRC优先级,供诸君参考: