《UDS协议从入门到精通》系列——图解0x10:诊断会话控制
什么是诊断会话控制服务?切换模式时ECU要做哪些?有没有通信示例?本文全网最详解!!
《UDS协议从入门到精通》系列——图解0x10:诊断会话控制
Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快速了解他们。(各服务介绍持续更新中…)
学习UDS基础知识以及其他相关内容?>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<
一、简介
1.1 什么是诊断会话?
会话模式是诊断领域非常重要的一个状态机,不同的会话模式是用来区分诊断服务执行权限的,而该服务正是为了实现会话模式的切换。即该服务可以通过控制ECU在不同的会话模式之间切换从而为ECU使能一组特定的服务以及功能,至于每种会话模式下使能哪些服务/功能,由遵循该协议标准的用户去决定。
UDS协议定义了三种会话模式:默认会话、编程会话、扩展会话。不同会话模式间可以互相切换,但在一个ECU中应该始终只有一个诊断会话处于活动状态。 ECU在上电时应始终启动默认会话。如果没有启动其他会话则默认会话将在ECU通电期间一直运行。举例来说:
- ECU通常处于默认会话状态(Default Session),但很多服务需要切换到扩展会话模式中才能执行(Extended Session),当需要进行软件刷写时,则需要切换到编程会话模式(Programming Session)。
- 此外,当ECU处于非默认会话时,如果一段时间没有诊断操作,将会回退到默认会话,这时候如果想要保持在某种会话状态,可以通过0x3E会话保持服务实现。
1.2 会话模式切换时,ECU要做什么?
14229-1标准文件中给出如下一幅图并针对各个标号过程中ECU的处理给出如下一些解释,对于入门者来说,这段内容暂时可以不关注,需要在应用过程中逐渐了解并熟悉他们:
- 当ECU处于默认会话状态,客户端请求启动默认会话时,ECU应完全重新初始化默认会话(不包括编程到非易失性存储器中的相关内容的初始化)。
- 当ECU从默认会话转换到任意其他会话模式时,ECU需要停止在默认会话期间通过Response On Event(0x86)服务在ECU中配置的事件(即暂停事件响应服务)。
- 当ECU从默认会话以外的任何诊断会话转换到默认会话以外的另一个会话时,ECU应重新初始化诊断会话,这意味着:
- 通过Response On Event(0x86)服务在ECU中配置的每个事件都应停止;
- 锁定安全访问。Tip:该操作应重置那些依赖于要解锁安全访问的诊断功能,如DID的输入输出控制(0x2F);
- 在新会话中受支持且不依赖安全访问的所有功能都应保持不变。例如,任何配置的周期性调度程序在从一个非默认会话转换到另一个不管是否相同的非默认会话时都应保持活动状态;再比如,通信控制(0x28)和控制DTC设置(0x85)服务的状态不应受到影响,即会话切换后的状态应该跟切换前保持一致。
- 当ECU从默认会话以外的任何诊断会话转换到默认会话时,应停止通过0x86服务在ECU中配置的每个事件,并启用安全访问,同时默认会话中不支持的任何其他功能应终止。
1.3 不同的会话模式分别支持哪些服务?
不同会话模式支持的服务范围也不同,默认会话有很多不支持的服务,如下表所示(“x“表示支持该服务,“not applicable“表示不支持该服务):
上表默认会话中有些支持的服务添加了一些备注(xa、b、c、d、e),其实就是说明下为什么默认会话下需要支持这几个服务,或者即使支持该服务也是有特定的场景或者限制的,具体含义如下所示:
xa:在默认会话模式中是否也允许0x86服务是特定于实现的,即不一定支持该服务;
xb:如果是访问安全相关的DID则需基于安全访问服务,因此如果是该情况下要进非默认会话;
xc:如果是访问安全相关的内存区域则需要安全访问服务,因此如果是该情况下要进非默认会话;
xd:可以在默认和非默认会话中动态定义DID,因此非默认会话也支持这个服务;
xe:如果是安全相关例程需安全访问服务,因此需要非默认会话模式;需要客户端主动停止的例程也需要非默认会话模式。
二、数据包格式
2.1 服务请求格式
SessionType的取值及对应含义如下(主要用的就是标出的那三个):
SessionType | 含义 |
---|---|
0x00 | 保留未使用(ISOSAE Reserved) |
0x01 | 默认会话模式(Default Session),一般ECU上电后的默认状态就是这个,该会话模式不需要0x3E服务维持。 |
0x02 | 编程会话模式(Programming Session),主要用于ECU软件的升级刷写,刷写流程涉及多类UDS服务, 没有接触过软件升级刷写的可能不太会接触到这种会话模式,暂时不用深究。 |
0x03 | 扩展会话模式(Extended Diagnostic Session),用于解锁需要高权限的诊断服务,基本覆盖各类服务, 最常见的就是读写DID前先进扩展会话模式。 |
0x04 | 安全模式(Safety System Diagnostic Session)使能所有跟车载系统安全相关的服务,比如安全气囊。 |
0x05 - 0x3F | 保留未使用(ISOSAE Reserved ) |
0x40 - 0x5F | 保留未使用,整车厂自定义使用(Vehicle Manufacturer Specific) |
0x60 - 0x7E | 保留未使用,ECU供应商/系统供应商自定义使用(System Supplier Specific) |
0x7F | 保留未使用(ISOSAE Reserved) |
2.2 服务响应格式
2.2.1 肯定响应
SessionType的取值同上,SessionParameterRecord的4个字节含义如下:
Byte1 | Byte2 | Byte3 | Byte4 |
---|---|---|---|
P2Server_max (high byte) | P2Server_max (low byte) | P2*Server_max (high byte) | P2*Server_max (low byte) |
这四个字节实际上是两个时间参数的值(P2Server_max & P2*Server_max),关于时间参数,我会重新整理一篇文章来介绍他们(完成后会在这里放上链接),如果没有接触过,这里你可以简单理解为Server端接收到请求后如果未在指定的时间参数内给出响应,则需要执行超时操作。
2.2.2 否定响应
可能出现的NRC及其含义如下:
NRC | 含义 |
---|---|
0x12 | 子功能参数不受支持 |
0x13 | 消息长度错误 |
0x22 | 不满足请求标准/条件 |
三、通信示例
假设现在诊断设备控制目标ECU进入编程会话模式,发送请求时设置spr位为0(即不抑制正响应),同时假设目标ECU中设置的时间参数分别为:P2Server_max = 50ms (0x0032),P2*Server_max = 5000ms (0x01F4),通信数据包如下所示:
更多推荐
所有评论(0)