UDS协议中0x31服务(Routine Control)详解及应用
UDS 协议中 0x31 服务(Routine Control)详解及应用
一、0x31 服务概述
作用:0x31 服务(Routine Control,例程控制)用于在 ECU 上执行特定的诊断例程,包括但不限于内存擦除、传感器校准、系统测试等操作,是实现 ECU 深度诊断和维护功能的重要手段。
使用场景:通常在 ECU 处于编程会话(0x02)或扩展诊断会话(0x03),且已通过安全访问(0x27)解锁对应权限后执行。例如,在固件升级前需用此服务擦除目标内存区域,或在维修时对传感器进行校准操作。
二、请求报文格式(Tester → ECU)
参数 | 字节长度 | 含义 | 示例值 |
---|---|---|---|
SID | 1 Byte | 服务标识符,固定为 0x31 | 0x31 |
Sub-Function | 1 Byte | 子功能代码,定义具体执行的例程类型,如 0x01(启动例程)、0x02(停止例程)、0x03(请求例程结果) | 0x01 |
RoutineIdentifier | 2 Bytes | 例程序号,唯一标识需执行的例程(不同 ECU 对例程编号定义不同,需参考具体车型文档) | 0x0010 |
ParameterRecord | 可变长度 | 传递给例程的参数(如擦除地址范围、校准系数等),长度由例程需求决定 | 0x08000000 0x00010000(擦除地址 0x08000000,长度 64KB) |
示例报文:
31 01 00 10 08 00 00 00 00 01 00 00
含义:在编程会话中,请求启动编号为 0x0010 的例程,目标是擦除从地址 0x08000000 开始、长度为 64KB 的内存区域。
三、响应报文格式(ECU → Tester)
1. 肯定响应(0x71)
参数 | 字节长度 | 含义 | 示例值 |
---|---|---|---|
SID+0x40 | 1 Byte | 响应标识符,固定为 0x71(0x31 + 0x40) | 0x71 |
Sub-Function | 1 Byte | 确认执行的子功能代码,与请求报文中的子功能一致 | 0x01 |
RoutineIdentifier | 2 Bytes | 确认执行的例程序号 | 0x0010 |
RoutineResult | 可变长度 | 例程执行结果数据(如校准后参数、擦除状态标志),长度由例程定义 | 0x00(擦除成功) |
示例响应:
71 01 00 10 00
含义:ECU 确认已成功启动编号为 0x0010 的例程,内存擦除操作执行成功。
2. 否定响应(0x7F)
常见否定响应码(NRC):
-
0x12:子功能不支持(如请求的子功能或例程在当前 ECU 中不存在);
-
0x22:条件不满足(如未处于正确的诊断会话,或未通过安全访问);
-
0x31:参数无效(传入的参数超出例程允许范围,如错误的内存地址);
-
0x33:安全访问未解锁(执行敏感例程前未完成权限验证);
-
0x72:故障处于活动状态(执行例程时检测到其他故障,导致操作中断)。
四、通信流程与关键机制
例程执行流程
-
启动例程(Sub-Function 0x01):诊断设备发送包含例程序号和参数的请求,ECU 验证权限和参数后执行例程,并返回肯定响应;
-
停止例程(Sub-Function 0x02):在例程运行过程中,诊断设备可随时发送停止请求,强制中断例程;
-
请求结果(Sub-Function 0x03):例程执行完成或停止后,诊断设备通过此子功能获取执行结果数据(如校验值、状态标志)。
安全与权限控制
-
敏感例程(如内存擦除、ECU 复位)必须在高安全等级(如 Level 3)解锁后执行;
-
ECU 通过 NRC 返回错误码,拒绝未授权或参数错误的请求。
超时与重试机制
-
诊断设备需设置合理的超时时间(如 P2Timeout),避免因网络延迟导致例程执行失败;
-
若请求超时或收到否定响应,可根据 NRC 判断原因后重新发起请求。
五、实际应用案例
场景:ECU 固件升级前的内存擦除
-
请求启动擦除例程:
报文:报文:
31 01 00 01 08 00 00 00 00 01 00 00
含义:启动编号为 0x0001 的擦除例程,擦除地址 0x08000000 开始的 64KB 区域;
-
ECU 响应:
肯定响应:肯定响应:
71 01 00 01 00
(擦除成功); -
确认结果:
发送子功能 0x03 请求:发送子功能 0x03 请求:
31 03 00 01
,ECU 返回详细擦除状态数据,验证内存是否已清空。
场景:传感器校准
-
请求启动校准例程:
报文:报文:
31 01 00 05 01 02
(假设 0x0005 为例程号,0x01 02 为校准参数); -
ECU 执行校准:
完成后返回肯定响应,并包含校准后参数;完成后返回肯定响应,并包含校准后参数;
-
保存校准结果:
诊断设备通过其他服务(如 2E 服务)将新参数写入 ECU 非易失性存储。诊断设备通过其他服务(如 2E 服务)将新参数写入 ECU 非易失性存储。
六、配置注意事项
例程定义与兼容性
-
不同车型或 ECU 对例程序号(RoutineIdentifier)和参数格式的定义差异大,需严格参照 OEM 文档;
-
确保诊断设备支持目标 ECU 的所有例程子功能。
安全与权限管理
-
执行敏感例程前,必须通过 0x27 服务完成对应安全等级的解锁;
-
建议在执行例程前后检查 ECU 故障状态,避免因潜在故障导致操作失败。
数据一致性校验
-
部分例程(如擦除、写入)需配合其他服务(如 34、36、37 服务)使用,确保数据完整性;
-
对例程执行结果进行校验(如对比预期值与返回结果),防止错误操作。
这份内容全面解析了 0x31 服务。若你还想补充服务对比、增加更多案例,或是调整表述风格,欢迎随时告诉我。