2、诊断会话控制(0x10):会话切换机制、默认会话、扩展会话、编程会话的应用场景

2.1 会话控制的核心概念

诊断会话控制(Service 0x10)是UDS协议中最基础且最重要的服务之一。它定义了ECU(电子控制单元)在不同工作模式下的行为权限。可以将其理解为ECU的“权限等级”或“工作模式”。ECU在出厂后,默认处于一个受限的安全状态,只有通过切换会话,才能解锁更高级的诊断功能。

会话切换的机制基于一个简单的请求-响应模型:诊断仪发送0x10请求,并附带目标会话的ID(子功能)。ECU收到后,如果支持该会话且条件满足,则切换并回复肯定响应;否则回复否定响应(NRC)。

2.2 三种标准会话及其应用场景

UDS协议定义了三种标准会话,每种会话对应不同的功能权限和超时机制。

会话名称 子功能ID (Sub-function) 主要特点 典型应用场景
默认会话 (Default Session) 0x01
  • ECU上电后的默认模式。
  • 仅支持最基本的诊断服务(如读取DTC、读取数据标识符等)。
  • 通常不支持写入、编程或安全访问。
  • 会话超时时间较长或无限(取决于ECU设计)。
  • 车辆正常行驶时:ECU处于默认会话,仅响应读取类请求,不影响车辆性能。
  • 快速读取故障码:维修技师连接诊断仪后,无需切换会话即可读取DTC。
  • OBD-II法规要求:部分排放相关服务必须在默认会话下可用。
扩展会话 (Extended Session) 0x03
  • 解锁更多诊断功能,如写入数据、例程控制、输入输出控制等。
  • 通常需要先进行安全访问(0x27)才能执行敏感操作。
  • 具有会话超时(S3 Server Timeout),超时后自动回退到默认会话。
  • 标定与匹配:如更换ECU后写入VIN码、进行防盗匹配。
  • 执行特殊测试:如激活某个执行器(喷油嘴、风扇)进行故障复现。
  • 读取非标数据:某些制造商特定的数据流仅在扩展会话下可读。
编程会话 (Programming Session) 0x02
  • 最高权限模式,专为ECU固件刷写设计。
  • 通常禁用所有非必要的通信和功能,以保障刷写稳定性。
  • 必须配合安全访问(0x27)使用。
  • 会话超时时间极短(通常为5秒),需要诊断仪持续发送“保持激活”报文(0x3E)。
  • ECU固件升级:通过OBD口或Bootloader刷写新版本软件。
  • 恢复出厂设置:擦除并重新写入整个应用区数据。
  • Bootloader模式:当应用软件损坏时,ECU可能直接进入编程会话等待刷写。

2.3 会话切换的机制与超时管理

切换流程:

  1. 诊断仪发送:02 10 03 [CRC] (请求切换到扩展会话)
  2. ECU响应:06 50 03 [00 32 01 F4] [CRC] (肯定响应,并携带超时参数)
  3. 响应报文中的00 32 01 F4表示:P2_Server_max = 0x0032 (50ms),S3_Server_timeout = 0x01F4 (500ms)。

超时机制(S3 Server Timeout):

  • 当ECU切换到非默认会话(如扩展或编程会话)后,会启动一个定时器(S3 Timer)。
  • 如果在该定时器超时前,ECU没有收到任何有效的诊断请求(包括0x3E服务),则会自动回退到默认会话。
  • 实际意义:防止诊断仪意外断开后,ECU长时间停留在高权限模式,避免安全风险或通信干扰。

保持激活(Tester Present, 0x3E):

  • 诊断仪在非默认会话下,必须周期性发送0x3E 0x80(或0x00)来重置S3定时器。
  • 发送间隔必须小于S3_Server_timeout(通常建议为超时时间的一半)。

2.4 故障排查中的实战要点

要点1:会话切换失败排查

  • 现象:发送0x10请求后,收到否定响应码(NRC)。
  • 常见NRC及原因:
    • 0x12 (子功能不支持):ECU未实现该会话ID。
    • 0x22 (条件错误):例如,车辆正在行驶中,禁止切换到编程会话。
    • 0x78 (请求正确但响应待定):ECU正在处理其他任务,稍后重试。
  • 排查步骤:
    1. 确认诊断请求的格式正确(长度、子功能ID)。
    2. 检查ECU当前是否处于其他会话(如已处于编程会话,则无法再次切换)。
    3. 查看车辆状态(如车速、点火开关状态)是否满足切换条件。

要点2:会话超时导致操作中断

  • 现象:正在执行写入或例程控制时,ECU突然无响应,或返回否定响应0x21(忙)。
  • 原因:诊断仪未及时发送0x3E,ECU自动回退到默认会话,导致当前操作被终止。
  • 解决方案:
    • 在诊断工具中启用“自动发送Tester Present”功能。
    • 对于长时间操作(如刷写),在操作间隙主动发送0x3E。

要点3:编程会话的特殊性

  • 进入编程会话后,ECU通常会禁用CAN总线上的非诊断报文(如应用报文),仅保留诊断通信。
  • 如果刷写过程中通信中断,ECU可能停留在编程会话并等待超时,此时需要重新上电或发送特定的复位请求(0x11)才能恢复。
  • 实战建议:在刷写前,务必确保电源稳定、通信线路可靠,并准备好应急恢复方案。

2.5 小结

诊断会话控制是UDS诊断的“门禁系统”。理解默认、扩展、编程三种会话的权限差异和超时机制,是进行高效故障排查的基础。在实际工作中,遇到诊断通信异常时,应首先检查当前会话状态,这往往是解决问题的第一步。