计算机系统应用教程网站

网站首页 > 技术文章 正文

漫话UDS之Service 22

btikc 2024-12-14 10:06:54 技术文章 21 ℃ 0 评论

本文分享车载诊断中常用Service 22.

该服务主要用于读取车载ECU的状态信息,这些状态信息由OEM和Supplier定义。常见信息包括:

  1. 系统状态ECU支持的信息

这些状态信息反应了ECU的系统状态信息,该类DID在UDS协议中已经定义(大小和属性内容),比如:

F18C:ECUSerialNumberDataIdentifier

F190:VINDataIdentifier

F195:systemSupplierECUSoftwareVersionNumberDataIdentifier

F197:systemNameOrEngineTypeDataIdentifier

等等,具体可以参看UDS附录表

这些内容都有一个特点:都是静态状态信息,可以ECU下线时写入到ECU内存中,后续直接通过Service 22 + DID读取该状态信息即可。

  1. ECU支持的数字或模拟状态信息

这些信息反应出ECU的运行状态信息,在协议中也是由OEM和Supplier自定义的内容。常见的是

ECU供电电压、ECU运行电流、ECU当前温度、车辆转速、车辆胎压等等。OEM在诊断需求规范中定义好该运行状态信息对应DID的名称和大小。

本文以如下内容,分享Service 22内容:

  1. UDS对Service 22定义
  2. 用图形说明Service 22
  3. CDD数据库编辑
  4. CAPL(With CDD and without CDD)

UDS对Service 22定义

UDS关于Service 22定义请求格式如下:

相应格式:

以及对应Service 22否定响应的NRC处理机制:

由UDS协议定义该服务可知:

  1. Service 22后可加多个DID,具体需要参看涉及项目ECU的诊断需求规范;
  2. 给出的NRC处理机制是General,具体可以在诊断需求规范中细化。

用图形说明Service 22

此处分两部分:

  1. 静态数据读取
  2. 动态数据读取

A:静态数据读取

这类数据在读取前已经存在于ECU芯片内存中,Tester直接读取,操作流程如下:



基于响应,获取需要读取的状态信息。

B:动态数据读取

动态数据读取稍微比静态数据繁琐些:



读取过程:Tester发送Service 22 + DID,ECU芯片及时获取该DID对应的数据信息内容,该内容通过采样模块连接对应的传感器(比如温度传感器),实时获取Tester测试时,当前的温度值

CDD数据库编辑

关于Service 22在CANdelaStudio中的编辑,重点在于DID的编辑方法。大致流程分享如下:

  1. 基于CDDT新建CDD文件后,勾选自己所需要的Class:

注:Class在CDD中表示“类”,UDS没有强制性定义。只是工具按照使用习惯进行定义,方便使用者快速找到一个诊断条例在诊断数据库中具体哪一个位置。

  1. 在DIDs(DID库)中编辑需求规范中定义的DID,此处需要注意的是基于需求规范,编辑DID名称和对应的数据解析关系(Data type)

如下在Trace截图:

若没有Data Type,对于DID显示的内容会是如上图通信报文,有Data type

另外如上回答了在编辑DID名称和Data type名称不一致的区别。鉴于对技术的严谨性,编辑CDD时,两者保持一致。

  1. 对于DID data type

常用如上图三种:

  1. Raw Value:一般用于整数型数据,比如表述VIN码值
  1. Text Table:枚举型数据,通过枚举可以将所有可能性列举出来(常用于开关量):
  1. Linear:线性数据用于数字信号与模拟信号之间的转换:

编辑好DID后,将DID划分到不同的类下面即可!

CAPL验证Service 22

脚本如下:

void mainTest()

{


diagSetTarget("Ecu");


getExtendedSession();


testWaitForTimeout(1000);


readInformationRequest();


testWaitForTimeout(1000);


}

getExtendedSession()

{

diagRequest Ecu.Extended_Diagnostic_Session_Start req1;


diagSendRequest(req1);


}

readInformationRequest()

{

long res;

diagRequest Ecu.VIN_Read req2;


res=diagSendRequest(req2);



if(res==0)


{

write("ECU give the positive response");

}

else

{

write("ECU give the negtive response");

}


}

对应的Trace:

愿你我相信时间的力量,

做一个长期主义者!

-----------------------------------

作者简介 | 穿拖鞋的汉子

汽车电子工程师

公众号:车载诊断技术

chuantuoxiedehanzi@163.com

来,每天进步一点点!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表