UDS 诊断服务系列文章目录
诊断和通信管理功能单元
UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务
UDS 诊断 - ECUReset(ECU重置)(0x11)服务
UDS 诊断 - SecurityAccess(安全访问)(0x27)服务
UDS 诊断 - CommunicationControl(通信控制)(0x28)服务
UDS 诊断 - TesterPresent(测试仪保活)(0x3E)服务
UDS 诊断 - AccessTimingParameter(访问计时参数)(0x83)服务
UDS 诊断 - SecuredDataTransmission(受保护的数据传输)(0x84)服务
UDS 诊断 - ControlDTCSetting(控制DTC设置)(0x85)服务
UDS 诊断 - ResponseOnEvent(基于事件响应)(0x86)服务
UDS 诊断 - LinkControl(链路控制)(0x87)服务
数据传输功能单元
UDS 诊断 - ReadDataByIdentifier(按标识符读取数据)(0x22)服务
UDS 诊断 - ReadMemoryByAddress(按地址读取内存)(0x23)服务
UDS 诊断 - ReadScalingDataByIdentifier(按标识符读取换算数据)(0x24)服务
UDS 诊断 - ReadDataByPeriodicIdentifier(按周期性标识符读取数据)(0x2A)服务
UDS 诊断 - DynamicallyDefineDataIdentifier(动态定义数据标识符)(0x2C)服务
UDS 诊断 - WriteDataByIdentifier(按标识符写数据)(0x2E)服务
UDS 诊断 - WriteMemoryByAddress(按地址写内存)(0x3D)服务
存储数据传输功能单元
UDS 诊断 - ClearDiagnosticInformation(清除诊断信息)(0x14)服务
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(1) - 服务说明
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(2) - 请求消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(3) - 响应消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(4) - 示例
输入输出控制功能单元
UDS 诊断 - InputOutputControlByIdentifier(按标识符的输入输出控制)(0x2F)服务
例程功能单元
UDS 诊断 - RoutineControl(例程控制)(0x31)服务
一、服务说明
客户端使用 RoutineControl(例程控制)服务执行指定的步骤顺序并获取任何相关结果。该服务具有较大的灵活性,但一般应用可以包括清除内存、重置或学习自适应数据、运行自检、覆盖正常的服务器控制策略和控制服务器值随时间而变化,以及预定义序列(如关闭敞篷车顶)等。在一般情况下,将该服务用于控制输出时,该服务可用于更为复杂类型的控制,而 inputOutputControlByIdentifier(按标识符的输入输出控制)却用于相对简单(如静态)的输出控制。
1. 概述
客户端使用 RoutineControl(例程控制)服务以:
– 启动例程,
– 停止例程,并
– 请求例程结果
可由 2 字节的 routineIdentifier(例程标识符)引用例程。
下述小节规定了启动例程、停止例程以及请求 routineIdentifier(例程标识符)引用例程的结果。
2. 启动 routineIdentifier 引用的例程
若响应消息是肯定或否定的表示请求已经执行或即将执行,则须在完成 StartRoutine(启动例程)请求消息和完成首个响应消息之间的某段时间内在服务器内存中启动例程。
例程既可以是非正常运行代码的运行测试,也可以是在运行正常运行代码时启用和执行的例程。尤其是在第一种情况下,可能要求在使用 StartRoutine 服务之前,用 DiagnosticSessionControl(诊断会话控制)服务在一个特定的诊断会话中切换服务器,或用 SecurityAccess(安全访问)服务解锁服务器。
3. 停止 routineIdentifier 引用的例程
若响应消息是肯定或否定的表示停止例程的请求已经执行或即将执行,则须在完成 StopRoutine(停止例程)请求消息和完成首个响应消息之后的某段时间内在服务器内存中停止服务器例程。
注:须在服务器内存中按编程或先前初始化随时停止服务器例程。
4. 请求 routineIdentifier 引用例程的结果
客户端使用该子功能请求 routineIdentifier 引用例程的结果(如退出状态信息),该结果是服务器内存内执行的例程所产生的结果。
若 stopRoutine 子功能参数的肯定响应消息接收到例程结果(如正常 / 异常退出结果),则须使用 requestRoutineResults(请求例程结果)子功能。
示例中的 routineResult(例程结果)可以是服务器收集的数据,但由于服务器性能的限制,这在执行例程期间无法进行传输。
二、请求消息
1. 请求消息定义
字节 | 参数名称 | Cvt | 字节值 |
---|---|---|---|
#1 | RoutineControl 请求 SID | M | 0x31 |
#2 | sub-function = [RoutineControlType] | M | 0x00 - 0xFF |
#3 #4 | routineIdentifier[] = [ byte#2(LSB) ] | M M | 0x00 - 0xFF 0x00 - 0xFF |
#5 … #n | routineControlOptionRecord[] = [ … routineControlOption#m] | C/U … C/U | 0x00 - 0xFF … 0x00 - 0xFF |
C:用户可以为子功能参数 StartRoutine 和 stopRoutine 使用该参数。
2. 请求消息子功能参数定义
第 6 至 0 位 | 说明 |
---|---|
0x00 | 保留 |
0x01 | StartRoutine(启动例程) 该参数规定了服务器须启动 routineIdentifier 指定的例程。 |
0x02 | stopRoutine(停止例程) 该参数规定了服务器须停止 routineIdentifier 指定的例程。 |
0x03 | requestRoutineResults(请求例程结果) 该参数规定了服务器须返回 routineIdentifier 指定例程的结果值。 |
0x04 - 0x7F | 保留 |
3. 请求消息数据参数定义
定义 |
---|
routineIdentifier(例程标识符) 该参数标识服务器本地例程,并且超过了指定 dataIdentifier 的范围。 |
RoutineControlOptionRecord(例程控制选项记录) 该参数记录包括下述两者之一。 - 例程入口选项参数,可以选择性地指定例程的启动条件(如 timeToRun、startUpVariables 等),或者 - 例程退出选项参数,可以选择性地指定例程的停止条件(如 timeToExpireBeforeRoutineStops、variable 等)。 |
三、肯定响应消息
1. 肯定响应消息定义
字节 | 参数名称 | Cvt | 字节值 |
---|---|---|---|
#1 | RoutineControl 响应SID | M | 0x71 |
#2 | RoutineControlType | M | 0x00 - 0x7F |
#3 #4 | routineIdentifier[] = [ byte#2(LSB) ] | M M | 0x00 - 0xFF 0x00 - 0xFF |
#5 | routineInfo | C1 | 0x00 - 0xFF |
#6 … #n | routineStatusRecord[] = [ … routineStatus#m ] | U … U | 0x00 - 0xFF … 0x00 - 0xFF |
C1:RoutineInfo 字节指定了任一程序的通用外部测试设备的处理方案(如 StartRoutine、StopRoutine、RequestRoutineResults)。在 ISO/SAE 规范定义了 routineStatusRecord(例程状态记录)的情况下,任一程序都必须有该参数,即使定义了 routineStatusRecord 大小的 ISO/SAE 是 “0” 数据字节。在车辆制造商完全定义了例程 routineStatusRecord 的情况下,可以选择性的支持该参数。须由车辆制造商定义该字节。
U:若车辆制造商在 routineIdentifier(RID)中规定,则须仅在 routineStatusRecord[] 中含有 RoutineStatusByte #m。
2. 肯定响应消息数据参数的定义
定义 |
---|
RoutineControlType 该参数是对来自请求消息的子功能参数第 6 至 0 位的回显。 |
routineIdentifier(例程标识符) 该参数是请求消息的 routineIdentifier 的回显。 |
routineInfo 有车辆制造商负责 routineInfo 字节编码,并根据返回值为车辆制造商提供一种支持所有执行例程的通用外部测试设备处理的机制(若要求 StopRoutine 或 RequestRoutineResults)。 |
routineStatusRecord(例程状态记录) 该参数记录用于向客户端提供下述两者之一: - 启动例程后有关服务器状态的其他信息,或者 - 停止例程后有关服务器状态的其他信息(如总运行时间、停止例程前后所产生的结果等),或者 - 服务器先前停止的例程的结果(退出状态信息)。 |
四、受支持的 NRC
NRC | 说明 |
---|---|
0x12 | 不受支持的子功能 |
0x13 | 消息不正确或格式无效 |
0x22 | 条件不正确 若不符合请求 RoutineControl 的要求,则须返回该 NRC。 |
0x24 | 请求序列错误 下述情况,应返回此 NRC: - 当接收到 StartRoutine 子功能时例程当前处于激活状态且无法重启(由车辆制造商决定是否能够重启激活状态下的指定例程), - 当接收到 StopRoutine 子功能时例程当前处于未激活状态, - 当接收到 RequestRoutineResults 子功能时没有例程结果(如从未启动过所请求的 routineIdentifier)。 |
0x31 | 请求超过限值 下述情况下,应返回此 NRC: - 服务器不支持请求的 routineIdentifier, - 用户选用的 routineControlOptionRecord 包括请求的 routineIdentifier 的无效数据。 |
0x33 | 安全访问被拒绝 若客户端发送带有效、安全的 routineIdentifier 的请求且服务器安全功能当前是激活的,则发送此 NRC。 |
0x72 | 常规编程失败 若服务器在执行访问服务器内存的例程时发现错误,则须返回该 NRC。例如在例程清除或编程永久存储设备的特定内存位置(如内存)和访问该内存位置失败时。 |
下图为 0x31 服务的 NRC 处理。
图例
1 至少 4(SI + SubFunction + RID Parameter)
2 特定 RID 所需的 1 字节 SI + 1 字节 SF + 2 字节 RID + 第 n 字节 RoutineControlOptionRecord(例程控制选项记录)
五、示例
1. 示例 1:子功能 = StartRoutine
本小节说明了在服务器中启动例程的测试条件,在技术员 “扭动” 所有受试系统线束接头时,间歇性的不断测试(尽可能快的)所有输入和输出信号。通过 routineIdentifier 0x0201 引用该程序。
测试条件:ignition = on,engine = off,vehicle speed = 0 [kph](点火开关打开,发动机熄火,车辆速度为 0)。
客户端通过将 suppressPosRspMsgIndicationBit 设置为 “假” 来请求响应消息。
req 31 01 02 01
resp 71 01 02 01
32 - routineStatusRecord[ routineStatus#1 ] = vehicle manufactuer specific
2. 示例 2:子功能 = StopRoutine
本小节说明了在服务器中停止例程的测试条件,在技术员 “扭动” 所有受试系统线束接头是,间歇性的不断测试(尽可能快的)所有输入和输出信号。通过 routineIdentifier 0x0201 引用该程序。
测试条件:ignition = on,engine = off,vehicle speed = 0 [kph](点火开关打开,发动机熄火,车辆速度为 0)。
客户端通过将 suppressPosRspMsgIndicationBit 设置为 “假” 来请求响应消息。
req 31 02 02 01
resp 71 02 02 01
30 - routineStatusRecord[ routineStatus#1 ] = vehicle manufactuer specific
3. 示例 3:子功能 = RequestRoutineResults
本小节说明了如何在结束例程后获取结果值,在技术员 “扭动” 所有受试系统线束接头是,间歇性的不断测试(尽可能快的)所有输入和输出信号。通过 routineIdentifier 0x0201 引用该程序。
测试条件:ignition = on,engine = off,vehicle speed = 0 [kph](点火开关打开,发动机熄火,车辆速度为 0)。
客户端通过将 suppressPosRspMsgIndicationBit 设置为 “假” 来请求响应消息。
req 31 03 02 01
resp 71 03 02 01
30 - routineStatusRecord[ routineStatus#1 ] = vehicle manufactuer specific
33 - routineStatusRecord[ routineStatus#2 ] = inputSignal#1
..
8F - routineStatusRecord[ routineStatus#m ] = inputSignal#m
4. 示例 4:子功能 = startRoutine with routineControlOption
本小节规定了在传输控制单元中启动例程的测试条件,以在特殊模式下对特定党委校准换挡。档位范围为 #1 至 #20,模式可以是工作台、架台和车上。通过 routineIdentifier 0x0202 引用该程序。
测试条件:ignition = on,engine = off,vehicle speed = 0 [kph](点火开关打开,发动机熄火,车辆速度为 0)。
客户端通过将 suppressPosRspMsgIndicationBit 设置为 “假” 来请求响应消息。
req 31 01 02 02
06 - routineControlOption#1[ selected gear ] = vehicle manufactuer specific
01 - routineControlOption#2[ test condition ]
resp 71 01 02 02
32 - routineStatusRecord[ routineStatus#1 ] = vehicle manufactuer specific
33 - routineStatusRecord[ routineStatus#2 ] = response time
..
8F - routineStatusRecord[ routineStatus#m ] = inputSignal#m