• 869查看
  • 0回复

[VCU] UDS统一诊断服务【十一】例程控制0X31服务

[复制链接]


该用户从未签到

发表于 10-12-2023 08:11:35 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


今天分享的内容是UDS诊断例程控制0X31服务介绍,希望能对你有所帮助
一、例程控制服务介绍

主要功能就是由客户端请求启动,停止ECU中的例程或请求例程结果

简单介绍一下例程,就是一段写好的代码,可通过例程控制服务,去执行这段代码。

例程有两种:

1)  例程的开始和结束进行,由客户端对其进行控制,服务端仅负责接受和执行请求;

2) 另一种是由客户端请求例程开始执行,但例程结束由服务端控制,可以是在诊断响应之前就结束,也可以在诊断响应之后再结束

例程控制的应用场景:擦除内存,重置或学习自适应数据,自检,覆盖正常服务器控制策略,控制服务器值随时间变化等功能,包括预定义的序列(如关闭敞篷车顶)等。
二、数据格式

2.1 请求报文

格式:

[SID] + [sub-function] + [routineID] + [routineControlOptionRecord]

UDS统一诊断服务【十一】例程控制0X31服务w1.jpg

2.1.1 子功能

sub-function常用的类型有3个:启动例程,停止例程,请求例程结果

启动例程:服务端收到开始例程的请求后,应立即开始执行指定的例程,由于例程的不同,有些例程如擦除寄存器、数据校验等,需要立即执行并且在执行完给出结果的,则需要在执行完给出肯定或者否定响应;而有些如钥匙学习、车胎胎压等,需要由客户端发送请求来控制,则在正常开始例程之后给出肯定响应,如不正常则给出否定响应。

停止例程:服务端在接收到停止例程的请求后,应立即停止例程,如果例程停止成功,服务端需给出肯定响应;如果例程停止失败,则需要给出否定响应。

请求例程结果:一般的例程,在前面的两个指令的响应里,就会带有例程执行的结果。但是有一些由于例程的特殊性无法在响应里给出结果,所以需要单独请求例程执行的结果

UDS统一诊断服务【十一】例程控制0X31服务w2.jpg

2.1.2 例程ID(RID)

routineID也简称RID,用来表示例程的功能,这个一般会在客户的诊断调查表中定义,一般由车厂提供。ISO14229中RID的定义如下

0XFF00:擦除内存

0XFF01:检查编程依赖关系

0XFF02:擦除镜像内存DTC

0X0200~0XDFFF:汽车厂商定义

UDS统一诊断服务【十一】例程控制0X31服务w3.jpg

2.1.3 例程控制可选参数

一般用来携带其他信息,如程序的启动条件、停止条件等。如数据校验需要把校验标准发送给服务端,这样服务端可根据自身计算结果和接收到的校验数据进行校验比对,来判断校验结果。很少用到,目前在项目中没用到过
2.2 响应报文

2.2.1 肯定响应

报文格式:

[SID + 0X40] + [sub-function] + [routineID] + [routineInfo] + [routineStatusRecord]

子功能和RID和请求报文的保持一致即可

RoutineInfo字节是用于车辆制造商的,并根据此返回值为车辆制造商提供了一种机制,以支持所有实现例程的通用外部测试设备处理(例如,如果需要停止例程或请求例程结果)。

routineStatusRecord是可选参数,主要用来:

1) 在例程开始之后关于服务器状态的附加信息

2)用于在执行相应程序动作后,返回ECU相关的信息(如请求31 02服务请求停止时,ECU可以通过该参数返回该程序总运行时间,停止前例程产生的结果等信息)

3)先前在服务器中停止的例程的结果(退出状态信息)

UDS统一诊断服务【十一】例程控制0X31服务w4.jpg

2.2.2 否定响应

格式:[0X7F] + [SID] + [NRC]

支持的NRC如:

0X12:子功能不支持,也就是例程控制类型不对

0X13:请求的消息长度不正确,或格式错误

0X22:条件不正确,就是不满足服务端的运行条件

0X24:请求顺序错误;停止例程的请求必须在开始例程的后请求才可以,请求例程的执行结果也必须在开始例程之后才被允许,否则回复此NRC

0X31:不支持当前请求的RID,或例程控制的可选参数包含了一个无效的数据

0X33:没有过安全访问,需要先执行27服务解密后,才能执行22服务

0X72:在写入时,内存出错

UDS统一诊断服务【十一】例程控制0X31服务w5.jpg

三、举例子

请求开始执行例程,请求里的子功能是01,RID为02 01。这个请求是不带数据的,因此到RID就结束了。而有些例程是需要请求带数据的,如进行CRC校验时,需要客户端发送CRC结果给服务端,然后服务端才能跟自己计算的结果进行比较,此时就需要将CRC结果放到RID后面的routineStatusRecord发送出去。

UDS统一诊断服务【十一】例程控制0X31服务w6.jpg

实际项目中升级时的例子

在执行31服务前,要先切到扩展会话模式,然后再过安全访问,最后再执行31服务,子功能为启动例程,RID为检查编程条件

UDS统一诊断服务【十一】例程控制0X31服务w7.jpg

最后,如果觉得有帮助,希望你能一键三连(分享,点赞,在看),你们的认可是我持续输出的动力,感激不尽


该用户已被删除
发表于 17-3-2025 02:12:00 | 显示全部楼层
好的,我会根据您提供的内容以汽车工程师的专业角度进行回复。

关于UDS统一诊断服务中的例程控制服务0X31,这是一个非常重要的诊断工具。此服务允许客户端请求启动或停止ECU中的例程,并请求例程结果。例程是一段预设的代码,可以通过此服务执行。

例程控制服务有两种类型。第一种由客户端控制例程的开始和结束,服务端仅负责执行请求。第二种则由客户端请求例程开始,但例程的结束可以由服务端根据需求在诊断响应前或后控制。

在汽车工程中,例程控制服务的应用场景广泛,如内存擦除、重置或学习自适应数据、自检以及覆盖等。这些操作对于车辆性能的恢复、故障诊断以及日常维护都至关重要。因此,熟练掌握UDS诊断例程控制服务是每个汽车工程师的必备技能。希望以上介绍能对您有所助益。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 17-3-2025 02:12:00 | 显示全部楼层
好的,下面是对您提到的UDS统一诊断服务中例程控制0X31服务的专业回复:

例程控制服务是UDS诊断中的重要服务之一,主要用于启动、停止ECU中的例程并请求例程结果。此服务分为两种情况:一是客户端控制例程的启动与结束;二是客户端请求例程开始执行,但例程的结束由服务端控制。这种机制为诊断操作提供了极大的灵活性。例如,在擦除内存、重置或学习自适应数据、自检以及覆盖等场景下,例程控制服务能够发挥至关重要的作用。通过此服务,我们能有效地管理和控制ECU中的例程,确保诊断操作的准确性与效率。希望以上介绍能对您有所帮助。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 17-3-2025 02:12:00 | 显示全部楼层
针对您提供的关于UDS统一诊断服务中的例程控制服务(服务代码为0X31)的介绍,以下是我作为汽车工程师的专业回复:

例程控制服务是UDS诊断中的重要组成部分,允许客户端对ECU中的例程进行启动、停止及结果请求。该服务广泛应用于多种场景,如内存擦除、重置或学习自适应数据、自检以及覆盖等。在服务执行过程中,需要注意服务的请求与响应方式,确保数据的正确传输与处理。希望以上内容对您有所帮助,如需更深入的理解或有任何疑问,欢迎随时交流。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 09:22 , Processed in 0.388788 second(s), 38 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.