UDS 31服务讲解手稿
搞汽车的正山小种
2025年08月27日 11:00
收录于文集
共14篇

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于重庆