UDS诊断之31服务
UDS(统一诊断服务)中的 0x31 服务,即 RoutineControl(例程控制)服务。
这是一个非常强大且灵活的服务,允许诊断仪(Tester)在ECU内部启动、停止或执行一段预定义的、封装好的功能序列。
服务标识符(SID): 0x31
主要功能: 用于控制ECU中已存在的、预定义的例程(Routine)。这些例程是一段独立的代码,用于执行特定的操作,如擦除内存、运行自检、学习参数等。
基本请求格式: [0x31] [Sub-function] [Routine Identifier] [Optional Parameters]
子功能(Sub-function)
子功能字节的最高位(bit 7)用于抑制正响应消息的发送,其余7位定义了具体的操作类型:
子功能值(十进制)
子功能名
描述
0x01
startRoutine
启动例程。诊断仪请求ECU开始执行指定的例程。
0x02
stopRoutine
停止例程。诊断仪请求ECU停止正在运行的指定例程。
0x03
requestRoutineResults
请求例程结果。诊断仪向ECU查询指定例程的执行结果。
3. 核心参数
a) 例程标识符(Routine Identifier)
长度: 2字节(例如 0x0205, 0xFF00)。
作用: 唯一标识ECU内部的一个特定例程。
定义: 该标识符的具体含义和对应的功能由汽车制造商(OEM)或ECU供应商自定义,并在诊断规范中定义。例如:
0xFF00 - 擦除Flash内存
0xFF01 - 检查编程依赖性
0x0202 - 检查编程完整性
0x0203 - 检查编程预条件
0xXXXX - 制动系统抽真空
0xXXXX - 制动系统加注
0xXXXX - 制动系统液位调节
b) 例程控制选项记录(RoutineControl Option Record)
作用: 提供给例程的输入参数。例如,要擦除的内存地址、要学习的阈值等。
格式: 长度和内容完全由具体的例程定义,没有固定格式。
·
c) 例程状态记录(Routine Status Record)
作用: 在正响应中,ECU返回给诊断仪的输出结果。
内容: 通常包含例程的执行状态(成功/失败)、具体的结果数据(如校验和、学习值、测量值等)。
格式: 完全由具体的例程定义。
请求与响应消息流
场景1:启动例程(并等待正响应)
诊断仪请求(Request):
Byte
Description
Value (Example)
0
SID
0x31
1
Sub-function
(startRoutine, POS_RSP)
0x01
2-3
Routine Identifier
0x0205
4-n
Option Record
(Input Parameters)
0x12 0x34 0x56
ECU正响应(Positive Response):
Byte
Description
Value (Example)
0
Response SID
(SID + 0x40)
0x71
1
Sub-function
0x01
2-3
Routine Identifier
0x0205
4-n
Status Record
(Output Results)
0x01 (Success)
0x00 (Fail)
场景2:启动长时间运行的例程(抑制正响应)
诊断仪请求(Request):
Byte
Description
Value (Example)
0
SID
0x31
1
Sub-function
(startRoutine, Suppress POS_RSP)
0x81
2-3
Routine Identifier
0x0205
4-n
Option Record
0x12 0x34 0x56
ECU响应:
·
收到请求后直接开始执行例程,不发送任何正响应。
·
·
诊断仪需要后续使用 requestRoutineResults (0x03) 来查询进度和结果。
·
场景3:停止例程
诊断仪请求(Request):
Byte
Description
Value (Example)
0
SID
0x31
1
Sub-function
(stopRoutine)
0x02
2-3
Routine Identifier
0x0205
ECU正响应(Positive Response):
Byte
Description
Value (Example)
0
Response SID
0x71
1
Sub-function
0x02
2-3
Routine Identifier
0x0205
4-n
Status Record
(可能包含停止时的状态)
0x00
场景4:请求例程结果
诊断仪请求(Request):
Byte
Description
Value (Example)
0
SID
0x31
1
Sub-function
(requestRoutineResults)
0x03
2-3
Routine Identifier
0x0205
ECU正响应(Positive Response):
Byte
Description
Value (Example)
0
Response SID
0x71
1
Sub-function
0x03
2-3
Routine Identifier
0x0205
4-n
Status Record
(Detailed Results)
0x00 0xAA 0xBB 0xCC
5. 常见应用场景
ECU编程与刷写:
0x31 01 **FF00** - 常用于擦除Flash内存。
0x31 01 **FF01** - 检查编程依赖条件(如电压、温度)。
零部件学习与适配:
节气门、车窗防夹、燃油泵等执行器的位置学习和参数校准。
大灯高度调节、转向角传感器零点学习等。
自检与诊断:
运行复杂的RAM/ROM校验。
执行特定的传感器或执行器功能测试。
重置与清零:
重置里程计数、喷油修正值等学习值。
6. 与其它服务的区别
vs. 0x2E (WriteDataByIdentifier):
0x2E 是简单的写数据,通常用于修改一个或多个静态的数据值(如配置参数)。
0x31 是执行一个功能,这个功能可能包含复杂的逻辑、计算、硬件操作和耗时过程。
vs. 0x2F (InputOutputControlByIdentifier):
0x2F 用于直接替代ECU对某个输入/输出的控制(如强制点亮灯、继电器吸合)。
0x31 是触发ECU内部一个预定义的功能,控制权仍在ECU自身。
31服务OTX程序案列:

视频第十期讲义手稿
2025/08/27于重庆