在UDS(Unified Diagnostic Services,统一诊断服务)协议中,0x31服务(Routine Control,例程控制服务) 用于启动、停止或请求ECU(电子控制单元)中预定义的例程(Routine)。例程是ECU内部的一段特定程序,通常用于执行特定的测试、校准或诊断操作。以下是关于0x31服务的详细介绍,包括功能、请求格式、响应格式、使用场景和示例。
1. 0x31服务的基本功能
- 主要用途:控制ECU中预定义的例程,包括启动、停止或请求例程的执行状态。
- 应用场景:
- 执行特定的测试操作(如传感器测试、执行器测试)。
- 执行校准或配置操作(如重置学习值、调整参数)。
- 请求例程的执行状态或结果。
2. 0x31服务的子功能
0x31服务通过子功能(Sub-function) 来指定具体的操作类型。子功能是一个1字节的值,常见的子功能包括:
子功能值 | 描述 |
---|---|
0x01 | 启动例程(Start Routine)。 |
0x02 | 停止例程(Stop Routine)。 |
0x03 | 请求例程结果(Request Routine Results)。 |
0x04-0x7F | 保留未使用。 |
0x80-0xFF | 厂商自定义用途。 |
3. 0x31服务的请求格式
0x31服务的请求报文格式如下:
字节位置 | 描述 | 值 |
---|---|---|
0 | 服务ID(SID) | 0x31 |
1 | 子功能(Sub-function) | 0x01, 0x02, 0x03 |
2-3 | 例程标识符(Routine ID) | 2字节(如0x0201) |
4+ | 控制参数(可选) | 根据例程定义 |
说明:
- 例程标识符:用于唯一标识ECU中的特定例程。
- 控制参数:某些例程可能需要额外的控制参数,具体内容由例程定义。
示例:
- 启动例程:
31 01 02 01
- 停止例程:
31 02 02 01
- 请求例程结果:
31 03 02 01
4. 0x31服务的响应格式
0x31服务的响应报文格式如下:
字节位置 | 描述 | 值 |
---|---|---|
0 | 响应服务ID(SID + 0x40) | 0x71 |
1 | 子功能(Sub-function) | 0x01, 0x02, 0x03 |
2+ | 例程结果(可选) | 根据例程定义 |
说明:
- 如果请求成功,ECU会返回一个正响应(Positive Response),格式为
71 <Sub-function> <Routine Results>
。 - 如果请求失败,ECU会返回一个负响应(Negative Response),格式为
7F 31 <NRC>
,其中NRC(Negative Response Code)表示失败原因。
5. 使用0x31服务的步骤
以下是使用0x31服务的典型步骤:
步骤1:建立诊断会话
- 使用0x10服务(Diagnostic Session Control)进入扩展诊断会话(如0x03)。
- 示例请求:
10 03
- 示例响应:
50 03
步骤2:安全访问(如果需要)
- 如果ECU要求安全访问权限,使用0x27服务(Security Access)解锁。
- 示例请求:
27 01
(发送种子请求) - 示例响应:
67 01 <Seed>
(返回种子) - 示例请求:
27 02 <Key>
(发送密钥) - 示例响应:
67 02
(解锁成功)
步骤3:发送0x31服务请求
- 根据需求发送0x31服务请求,指定子功能和例程标识符。
- 示例1:启动例程(例程ID为0x0201)
- 请求:
31 01 02 01
- 响应:
71 01
- 请求:
- 示例2:请求例程结果(例程ID为0x0201)
- 请求:
31 03 02 01
- 响应:
71 03 <Routine Results>
- 请求:
步骤4:停止例程(如果需要)
- 在例程执行完成后,使用0x31服务停止例程。
- 示例请求:
31 02 02 01
- 示例响应:
71 02
6. 示例场景
场景1:执行传感器测试
- 目标:启动ECU中的传感器测试例程(例程ID为0x0201)。
- 步骤:
- 进入扩展诊断会话:
10 03
→50 03
- 安全访问解锁:
27 01
→67 01 <Seed>
,27 02 <Key>
→67 02
- 启动例程:
31 01 02 01
→71 01
- 请求例程结果:
31 03 02 01
→71 03 <Test Results>
- 停止例程:
31 02 02 01
→71 02
- 进入扩展诊断会话:
场景2:重置学习值
- 目标:启动ECU中的重置学习值例程(例程ID为0x0301)。
- 步骤:
- 进入扩展诊断会话:
10 03
→50 03
- 安全访问解锁:
27 01
→67 01 <Seed>
,27 02 <Key>
→67 02
- 启动例程:
31 01 03 01
→71 01
- 请求例程结果:
31 03 03 01
→71 03 <Reset Results>
- 停止例程:
31 02 03 01
→71 02
- 进入扩展诊断会话:
7. 注意事项
- 权限要求:某些例程可能需要安全访问权限(0x27服务)才能执行。
- 例程定义:不同ECU支持的例程可能不同,需参考ECU的诊断规范。
- 副作用:某些例程可能会影响ECU的正常运行,因此需谨慎操作。
总结
0x31服务是UDS协议中用于控制ECU例程的重要服务,通过启动、停止或请求例程的执行状态,可以执行特定的测试、校准或诊断操作。使用时需遵循标准请求和响应格式,并根据具体需求选择合适的子功能和例程标识符。在实际应用中,需注意权限管理和例程的副作用,以确保操作的安全性和有效性。