多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

UDS诊断服务-11服务

UDS诊断服务-11服务 一、11 服务是什么为什么需要它先建立核心认知ECU 的复位不是单一操作而是按场景分级的可控重置。典型场景刷写后生效新固件写入 Flash 后必须复位才能跳转加载新程序参数生效通过 2E 服务修改的标定/配置项很多需要重启后才被重新读取异常恢复软件死锁、任务卡死时远程复位比拔保险、断蓄电池高效且安全电源管理常电 ECU 的休眠/下电准备也需要标准化指令配合。11 服务的价值在于复位前 ECU 可以收尾任务、保存关键数据后再重启注意这是好的实现应有的行为属于 OEM 实现要求而非标准强制义务避免了粗暴断电的风险复位后按预设流程自动恢复无需人工干预。先澄清两个流传甚广的误解⚠️误区 1复位会清故障码。不会。已确认的 DTC 存在 NVM 里复位清不掉清 DTC 是0x14服务的职责。⚠️误区 2硬复位会丢标定数据。写入 NVM/EEPROM 的数据任何复位都丢不了丢的只有 RAM 数据。如果复位后校准丢了那是因为数据压根没落盘——是实现问题不是 11 服务的锅。二、子功能详解旧标准 3 种新标准 5 种ISO 14229-1:2013 只定义了 3 个子功能2020/2023 版扩充为 5 个。正确对应关系如下子功能标准名称核心含义典型场景0x01hardReset硬复位模拟断电→重新上电的完整过程复位最深刷写后加载新程序、软件完全卡死0x02keyOffOnReset钥匙循环复位模拟点火开关 OFF→ON 一个完整循环ECU 像经历了一次真实钥匙循环一样走初始化流程需要重新上电点火效果的场景0x03softReset软复位纯软件级重启不模拟掉电、也不模拟钥匙循环速度最快参数生效、软件异常恢复、在线调试0x04enableRapidPowerShutDown使能快速下电使能快速下电/快速休眠机制2020 版新增整车能量管理需要快速切断常电 ECU 供电前0x05disableRapidPowerShutDown禁用快速下电撤销快速下电状态恢复正常电源管理取消 0x04 的效果0x06–0x3FISO 保留——0x40–0x5F车辆制造商自定义OEM 可自行定义如某些厂的应用层复位就定义在这里见各厂诊断规范三个复位类型的正确理解hardReset模拟完整掉电上电硬件寄存器、软件状态全部重来。复位期间 ECU 离线刷写后必用。keyOffOnReset注意它不是只复位与点火相关的模块而是让 ECU整体按一次钥匙循环的流程重新初始化。对没有点火信号的常电 ECU如 BMS通常无意义请求会吃 NRC。softReset只重启软件最快最轻适合调试期反复使用。复位深度大致为hardReset ≥ keyOffOnReset softReset。0x04 / 0x05最容易被写错的一对这两个子功能是被误解的重灾区常被误写成睡眠模式复位和应用层复位——都是错的。它们是一对电源管理开关而不是复位动作背景KL30 常电/电池供电的 ECU 在整车下电后仍带电必须靠自己进入休眠来降低静态功耗0x04 的作用让 ECU 尽快完成数据保存、任务收尾进入可以立即安全下电/强制休眠的就绪状态配合整车能量管理/网络管理快速断电省电0x05 的作用撤销该状态恢复正常电源管理逻辑。⚠️ 所以 0x04/0x05不在复位深度这条轴上。如果你真的需要只重启应用层、保持通信不离线这类行为去查 OEM 在0x40–0x5F 自定义区间里的定义而不是套用 0x04/0x05。另外并非所有 ECU 都支持全部子功能。支持矩阵以各项目的诊断规范CDD/ODX为准别拿标准表硬套实车。三、通信格式请求、响应与抑制位请求帧2 字节CAN 单帧即可11 01 → 硬复位 11 02 → 钥匙循环复位 11 03 → 软复位 11 04 → 使能快速下电 11 05 → 禁用快速下电肯定响应51 xx xx 与请求子功能一致关键点这个响应是在 ECU 执行复位之前发出的含义是请求已确认我马上开始复位。抑制位suppressPosRspMsgIndicationBit子功能的 bit7 置 1 时ECU 不回复肯定响应11 81 → 硬复位且不要正响应此时 ECU 直接复位总线上一个响应都没有。功能寻址批量复位时常用可避免多节点同时回复造成的响应风暴。否定响应7F 11 NRC⚠️ 辟谣不存在复位后确认响应很多文章画了复位前响应 复位后确认响应两张图这是错的。标准时序只有一次响应诊断仪 ECU |---- 11 01 -----------------| |--- 51 01 ------------------| ← 唯一响应复位前发出 | | ECU 离线、重启总线静默 | | 重启完成进入 defaultSession | 等待 T_resetOEM 定义 | |---- 3E 00 / 10 03 ---------| ← 诊断仪主动轮询确认复活 |--- 肯定响应 ---------------|道理很简单ECU 复位后已经失忆不可能记得还要补发一条51 xx。所谓复位后确认本质是诊断仪等待一段时间后主动探测。四、实战流程以刷写后硬复位为例1. 10 02 进入编程会话 2. 27 xx 安全解锁 3. 34/36/37 完成刷写 4. 11 01 请求硬复位 5. 收到 51 01 复位前响应 6. 总线静默等待 ECU 重启时长查诊断规范 7. ECU 以 defaultSession 重启上线 8. 诊断仪发 3E 00 / 10 03 确认在线 9. 按需重新建立会话与安全等级继续后续作业两个必记要点复位会清空会话等级和安全等级。复位后 ECU 回到默认会话、未解锁状态高权限操作前必须重新10 xx27 xx等待时间 T_reset 是 OEM 定义量标准只规定 P2/P2* 等响应时间窗。软复位 300ms、硬复位 2s这类数字只能作经验参考代码里务必做成可配置参数。五、NRC 速查表别再望文生义NRC标准名称典型场景正确处理0x12subFunctionNotSupported向无点火信号的 BMS 发11 02查规范确认支持的子功能0x7EsubFunctionNotSupportedInActiveSession子功能支持但当前会话不允许先切换会话再重试0x13incorrectMessageLengthOrInvalidFormat报文长度/格式错检查帧格式0x31requestOutOfRange子功能写了保留值如 0x20核对取值0x22conditionsNotCorrect通用条件不满足检查整车/ECU 状态0x33securityAccessDenied未解锁先做 27 服务0x78requestCorrectlyReceived-ResponsePending已收到请稍候不要重发在 P2* 内等最终响应0x83engineIsRunning发动机运行中不允许复位确认安全前提条件0x85engineRunTimeTooLow发动机运行时间太短等待条件满足后重试常见误读纠正0x11是 serviceNotSupported整个服务不支持子功能不支持是0x120x22是 conditionsNotCorrect不是参数错误——参数格式错用 0x13、取值超范围用 0x310x85是 engineRunTimeTooLow不是笼统的当前状态不允许0x78不是失败是请稍等的握手信号正确姿势是等待最终响应而不是当作超时重发。六、不同总线传输先把标准编号用对标准内容ISO 14229-1应用层服务定义本文主体ISO 14229-2会话层服务ISO 14229-3UDS on CANISO 14229-5UDS on IPISO 13400DoIP基于 IP 的诊断传输/网络层复位后的复活差异CANECU 重启后直接参与总线通信诊断仪轮询3E/10确认即可DoIPECU 重启后需重建网络栈——IP 就绪、TCP 重连、重新路由激活——复活确认时间通常更长。排查顺序先 ping 链路 → 再查路由激活 → 最后才怀疑 ECU 本身。七、实战 Checklist✅ 复位前确认整车处于安全状态驻车、低速等具体前提以 OEM 规范为准✅ 复位前保存需要的数据故障日志、实时快照等✅ 复位后重新建立会话与安全等级✅ 等待时间可配置数值查诊断规范✅ 收到 0x78 耐心等待最终响应❌ 不要期待复位后确认响应❌ 不要期待复位清 DTC用 0x14❌ 不要把 0x04/0x05 写成睡眠复位/应用层复位。八、总结11 服务看似重启二字细节全在标准里子功能新版共 5 个——hardReset / keyOffOnReset / softReset / enableRapidPowerShutDown / disableRapidPowerShutDown其中 0x04/0x05 是快速下电开关对不是复位动作响应只有一次肯定响应且在复位前发出复位后 ECU 以默认会话上线由诊断仪主动确认复活NRC按标准名称查表别按字面猜一切 OEM 定义量复位时长、支持矩阵、安全前提以项目诊断规范为准。读标准、查规范、少背口诀——这才是诊断开发的正确打开方式。踩过文中这些坑的朋友欢迎评论区交流
返回列表