前言:本篇文章主要介绍在ISO 14229-1标准中定义的UDS服务——$10 DiagnosticSessionControl,其为Tester提供了控制目标ECU进入不同诊断会话状态的能力。
目录
1 服务介绍
$10 DiagnosticSessionControl诊断服务即诊断会话控制服务,Tester可利用该服务控制目标ECU进入不同的诊断会话。不同的诊断会话规定了ECU不同的功能权限,当ECU处于某个诊断会话时,其可以启用属于该诊断会话的特定诊断服务和功能。
关键点:
- ECU应始终有且只有一个激活的诊断会话,当ECU上电时,其应处于默认会话(defaultSession)
- 当Tester请求ECU进入当前的诊断会话时,ECU应该发送一条肯定响应消息
- 当Tester请求ECU进入其他的诊断会话时,若ECU可以进入,那么其应该发送一条肯定响应消息,在进入新的诊断会话之前或之后
- 当Tester请求ECU进入其他的诊断会话时,若ECU不能进入,那么其应该发送一条否定响应消息,并继续保持当前的诊断会话
- 当ECU进入了非默认会话(non-defaultSession)后,若其在一段时间内没有进行任何诊断操作,那么其应退回到默认会话(这种行为称之为ECU会话超时,通常利用$3E TesterPresent诊断服务保持ECU处于非默认会话)
- 非默认会话(不包括编程会话,ProgrammingSession)所提供的诊断服务功能是默认会话的超集,这意味着当ECU进入任何非默认会话时,默认会话的诊断功能也可以使用
1.1 诊断会话跳转图
ISO 14229-1-2020版标准文件给出了一幅ECU诊断会话状态跳转图,如下所示,用于说明当ECU的诊断会话状态发生不同情况的跳转时,其需要遵循的一些必要规范:
- 当ECU处于defaultSession且Tester请求ECU再次进入defaultSession时,其应:
- 完全重新初始化,即重置在上一个defaultSession的所有激活、启动、更改设置或控制,但这不包括写入到NVM中的数据修改
- 当ECU从defaultSession进入到non-defaultSession时,其应:
- 停止在defaultSession期间通过$86 ResponseOnEvent诊断服务在ECU中设置的所有特定事件机制
- 当ECU从non-defaultSession进入到另一个non-defaultSession(包括当前的诊断会话)时,其应:
- 停止在上一个non-defaultSession期间通过$86 ResponseOnEvent诊断服务在ECU中设置的所有特定事件机制
- 恢复安全访问策略
- 继续维持新会话中支持的且不依赖于安全访问的所有已激活的诊断功能, 例如,当ECU从一个non-defaultSession进入到另一个或同一个non-defaultSession时,若其在会话切换之前,已通过$28 CommunicationControl诊断服务禁用了正常通信,则其在会话切换之后,也应保持禁用正常通信。
- 当ECU从non-defaultSession进入到defaultSession时,其应:
- 停止在上一个non-defaultSession期间通过$86 ResponseOnEvent诊断服务在ECU中设置的所有特定事件机制
- 恢复安全访问策略
- 重置在上一个non-defaultSession的所有激活、启动、更改设置或控制,但这不包括写入到NVM中的数据修改
- 终止在defaultSession中不支持的任何诊断功能, 例如,当ECU从一个non-defaultSession进入到defaultSession时,若其在会话切换之前,已通过$28 CommunicationControl诊断服务禁用了正常通信,则其在会话切换之后,正常通信应该被重新启用。
1.2 诊断会话支持表
不同的诊断会话模式支持的诊断服务范围不同,很多诊断服务都不支持在defaultSession下使用,下表罗列了不同诊断服务对defaultSession和non-defaultSession的支持情况:
诊断服务 | defaultSession | non-defaultSession |
---|---|---|
$10 DiagnosticSessionControl | X | X |
$11 ECUReset | X | X |
$27 SecurityAccess | not applicable | X |
$28 CommunicationControl | not applicable | X |
$3E TesterPresent | X | X |
$29 Authentication | X | X |
$84 SecuredDataTransmission | not applicable | X |
$85 ControlDTCSetting | not applicable | X |
$86 ResponseOnEvent | Xa | X |
$87 LinkControl | not applicable | X |
$22 ReadDataByIdentifier | Xb | X |
$23 ReadMemoryByAddress | Xc | X |
$24 ReadScalingDataByIdentifier | Xb | X |
$2A ReadDataByPeriodicIdentifier | not applicable | X |
$2C DynamicallyDefineDataIdentifier | Xd | X |
$2E WriteDataByIdentifier | Xb | X |
$3D WriteMemoryByAddress | Xc | X |
$14 ClearDiagnosticInformation | X | X |
$19 ReadDTCInformation | X | X |
$2F InputOutputControlByIdentifier | not applicable | X |
$31 RoutineControl | Xe | X |
$34 RequestDownload | not applicable | X |
$35 RequestUpload | not applicable | X |
$36 TransferData | not applicable | X |
$37 RequestTransferExit | not applicable | X |
$38 RequestFileTransfer | not applicable | X |
- Xa:在defaultSession中是否支持$86 ResponseOnEvent诊断服务取决于具体实现
- Xb:读取或写入与安全相关的DID需要通过$27 SecurityAccess诊断服务过安全访问,因此在这种情况下,需要进入non-defaultSession
- Xc:读取或写入与安全相关的内存区域需要通过$27 SecurityAccess诊断服务过安全访问,因此在这种情况下,需要进入non-defaultSession
- Xd:可以在defaultSession和non-defaultSession中动态定义DID
- Xe:执行与安全相关的RID需要通过$27 SecurityAccess诊断服务过安全访问,因此在这种情况下,需要进入non-defaultSession;需要Tester主动请求停止的RID也需要进入non-defaultSession
2 服务数据格式
2.1 请求数据格式
以下是$10服务的请求数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | DiagnosticSessionControl SID | 0x10 | 必选 |
#Byte2 | sub-function = [diagnosticSessionType] | 0x00 – 0xFF | 必选 |
2.1.1 diagnosticSessionType
diagnosticSessionType是$10服务的sub-function参数,用于指示ECU进入对应的诊断会话,其具体定义如下表所示:
diagnosticSessionType | 描述 |
---|---|
0x00 | ISO保留 |
0x01 | 默认会话(defaultSession) 用于指示ECU进入默认会话,该诊断会话状态不需要$3E TesterPresent服务保持。 |
0x02 | 编程会话(ProgrammingSession) 用于指示ECU进入编程会话,该诊断会话支持与ECU刷写有关的诊断服务。 若ECU处于编程会话,其可以通过$10 DiagnosticSessionControl、$11 ECUReset和ECU会话超时离开。 |
0x03 | 拓展诊断会话(extendedDiagnosticSession) 用于指示ECU进入拓展诊断会话,该诊断会话可以支持更多的诊断服务。 |
0x04 | 安全系统诊断会话(safetySystemDiagnosticSession) 用于指示ECU进入安全系统诊断会话,该诊断会话支持与安全系统相关(如安全气囊展开)的诊断服务。 |
0x05 – 0x3F | ISO保留 |
0x40 – 0x5F | 车辆制造商自定义 |
0x60 – 0x7E | 系统供应商自定义 |
0x7F | ISO保留 |
2.2 肯定响应数据格式
以下是$10服务的肯定响应数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | DiagnosticSessionControl SID + 0x40 | 0x50 | 必选 |
#Byte2 | sub-function = [diagnosticSessionType] | 0x00 – 0xFF | 必选 |
#Byte3 – #Byte6 | sessionParameterRecord[] = [data#1 : data#4] | 0x00 – 0xFF | 必选 |
2.2.1 diagnosticSessionType
diagnosticSessionType是对应$10服务请求报文中的diagnosticSessionType参数回显
2.2.2 sessionParameterRecord
sessionParameterRecord包含了ECU报告的会话时间参数值。当ECU收到诊断服务请求后,若其在指定的时间参数内未给出响应,则Tester可将本次通信视作ECU响应超时。
- 其数据结构定义如下所示:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | P2Server_max (high byte) | 0x00 – 0xFF | 必选 |
#Byte2 | P2Server_max (low byte) | 0x00 – 0xFF | 必选 |
#Byte3 | P2*Server_max (high byte) | 0x00 – 0xFF | 必选 |
#Byte4 | P2*Server_max (low byte) | 0x00 – 0xFF | 必选 |
- 其数据内容定义如下所示:
参数 | 描述 | 精度 | 最小值 | 最大值 |
---|---|---|---|---|
P2Server_max | 激活的诊断会话的默认时间参数 | 1ms | 0ms | 65535ms |
P2*Server_max | 激活的诊断会话的增强型(NRC 0x78) 时间参数 | 10ms | 0ms | 655350ms |
2.3 否定响应数据格式
以下是$10服务的否定响应数据格式:
字节序 | 参数 | 字节值 | 说明 |
---|---|---|---|
#Byte1 | Negative Response SID | 0x7F | 必选 |
#Byte2 | DiagnosticSessionControl SID | 0x10 | 必选 |
#Byte3 | NRC | supportedNRC | 必选 |
supportedNRC的可选值如下表所示:
supportedNRC | NRC define | 描述 |
---|---|---|
0x12 | sub-functionNotSupported | ECU不支持该诊断请求服务的子功能 |
0x13 | incorrectMessageLengthOrInvalidFormat | 诊断请求指令的长度或格式不对 |
0x22 | conditionsNotCorrect | 执行诊断的条件不满足 |
3 服务通信示例
3.1 进入编程会话
本例展示了Tester通过$10服务控制ECU进入编程会话的流程,其中,存在以下条件:
- sub-function bit7: SPR = 0
- P2Server_max = 50ms(0x0032)
- P2*Server_max = 5000ms(0x01F4)
3.1.1 请求报文
字节序 | 参数 | 字节值 |
---|---|---|
#Byte1 | DiagnosticSessionControl SID | 0x10 |
#Byte2 | sub-function = [diagnosticSessionType = ProgrammingSession] | 0x02 |
3.1.2 肯定响应报文
字节序 | 参数 | 字节值 |
---|---|---|
#Byte1 | DiagnosticSessionControl SID + 0x40 | 0x50 |
#Byte2 | sub-function = [diagnosticSessionType = ProgrammingSession] | 0x02 |
#Byte3 | sessionParameterRecord[P2Server_max (high byte)] | 0x00 |
#Byte4 | sessionParameterRecord[P2Server_max (low byte)] | 0x32 |
#Byte5 | sessionParameterRecord[P2*Server_max (high byte)] | 0x01 |
#Byte6 | sessionParameterRecord[P2*Server_max (low byte)] | 0xF4 |