1 术语解释
1.1 缩略语
缩写 | 描述 | 解释 |
---|---|---|
DTC | Diagnostic Trouble Code | 诊断故障码 |
Dcm | Diagnostic Communication Manager | 诊断通信管理 |
Dem | Diagnostic Event Manager | 诊断事件管理 |
SID | Service identify | 服务标识符 |
NRC | Negetive reponse code | 否定响应码 |
2 功能简介
2.1 功能概述
例程,就是指的一段写好的具有一定功能的代码模块,通过例程控制服务,可以控制(开始、停止)这段代码。ISO14229-1里对例程的接口已经定义好了,即可以控制例程的开始、结束和获取结果。
例程有两种,一种是完全有例程控制服务对例程的开始和结束进行控制,该例程开始之后会持续执行,由客户端对其进行控制,服务端仅负责接受和执行请求;另一种是由客户端请求例程开始执行,但例程结束由服务端控制,可以是在诊断响应之前就结束,也可以在给出诊断响应之后再结束。
那么,例程都用来做什么?最常见的应用场景如车钥匙学习,四轮胎压学习,ESP制动液注入,车窗防夹标定,存储器擦除,数据校验,StayInboot,程序升级前检测刷写条件是否满足,一些需要测试的功能检测,功能控制等等。
客户端使用RoutineControl 0x31服务来执行已定义的步骤序列并获得相关结果。该服务具有很大的灵活性,但典型的用法可能包括擦除内存、重置或学习自适应数据、运行自测、覆盖正常的服务器控制策略以及控制服务器值随时间变化的功能,包括预定义的序列(例如,关闭车顶)等等。通常,当用于控制输出时,此服务的用途更加的复杂,而UDS 服务 0x2F inputOutputControlByIdentifier用于相对简单的(例如,静态)输出控制,请参考【AutoSar_UDS服务】0x2F服务_IO控制。
RoutineControl 0X31服务(一个例程)包含以下三个子服务:
- start a routine(开始例程): 服务端在接收到开始例程的请求后,应立即开始执行指定的例程,根据例程设计的不同,服务端应该在执行例程之后给出响应,有些例程如擦除寄存器、数据校验等,需要立即执行并且在执行完给出结果的,则需要在执行完给出肯定或者否定响应,而有些如钥匙学习、胎压学习等需要由客户端发送请求来控制(控制过程比较长),则在正常开始例程之后给出肯定响应,如不正常则给出否定响应;
- stop a routine(停止例程): 服务端在接收到停止例程的请求后,应立即停止指定的例程;
- request routine results(请求例程结果): 一般例程,在前面的两个指令的响应里,就会带有例程执行的结果。但是有一些由于例程的特殊性无法在响应里给出结果,所以需要单独请求例程执行的结果。
注: 一个例程对应一个2字节的RID,以上子服务需要在此RID中配置,且每个子服务都可以配置相应的入参和出参, 因为涉及到控制ECU,所以一般例程服务都需要在特定的会话和安全等级下执行。
3 请求响应定义
3.1 请求格式
3.2 肯定响应格式
3.3 否定响应格式
否定响应使用通过的格式: 7F + SID + NRC, 0x31服务主要支持一下NRC码:
注 : 存在这么多的NRC的情况下,NRC的判定也是有顺序和流程的。
4 请求响应实例
5 参考资料
- ISO 14229-1:2013(E)
- Specification of Diagnostic Communication Manager AUTOSAR CP R20-11