UDS服务理解
UDS服务理解
UDS 服务理解框架
这份文档用一个固定框架吸收所有 UDS 服务:
服务目的 -> 使用条件 -> 请求格式 -> 示例报文 -> 示例逐字节解释 -> 正响应 -> 负响应 -> 常见子功能/对象
读任何服务时,不要先背字节,先问 7 个问题:
- 这个服务让 ECU 干什么?
- 它在哪个会话/安全等级下能用?
- 请求报文由哪些字段组成?
- 示例报文每个字节是什么意思?
- ECU 收到后做什么业务动作?
- 成功怎么回?
- 失败用哪个 NRC 说明原因?
通用报文规则
1.1 请求报文
UDS 请求可以抽象成:
SID + 子功能/动作参数 + 目标对象 + 数据参数
字段理解:
| 字段 | 作用 |
| SID | 选择服务,例如 10/22/2F/31 |
| 子功能/动作参数 | 选择动作,例如进入扩展会话、启动例程、短期控制 |
| 目标对象 | DID、RID、DTC、内存地址等 |
| 数据参数 | 写入值、控制值、数据块、校验值等 |
1.2 正响应
正响应 SID 统一等于:
请求 SID + 0x40
| 请求 | 正响应 | 服务 |
| 10 | 50 | DiagnosticSessionControl |
| 11 | 51 | ECUReset |
| 14 | 54 | ClearDiagnosticInformation |
| 19 | 59 | ReadDTCInformation |
| 22 | 62 | ReadDataByIdentifier |
| 27 | 67 | SecurityAccess |
| 28 | 68 | CommunicationControl |
| 2E | 6E | WriteDataByIdentifier |
| 2F | 6F | InputOutputControlByIdentifier |
| 31 | 71 | RoutineControl |
| 34 | 74 | RequestDownload |
| 36 | 76 | TransferData |
| 37 | 77 | RequestTransferExit |
| 3E | 7E | TesterPresent |
| 85 | C5 | ControlDTCSetting |
1.3 负响应
负响应格式统一:
7F + 原请求 SID + NRC
例:
7F 2F 31
意思是:2F 服务失败,原因是 31 requestOutOfRange。
常见 NRC:
| NRC | 名称 | 怎么理解 |
| 11 | serviceNotSupported | ECU 不支持这个 SID |
| 12 | subFunctionNotSupported | 子功能不支持 |
| 13 | incorrectMessageLengthOrInvalidFormat | 长度或格式错 |
| 22 | conditionsNotCorrect | 当前条件不满足 |
| 24 | requestSequenceError | 请求顺序错 |
| 31 | requestOutOfRange | DID/RID/参数/地址超范围 |
| 33 | securityAccessDenied | 安全等级不够 |
| 35 | invalidKey | key 错 |
| 36 | exceedNumberOfAttempts | 解锁错误次数超限 |
| 37 | requiredTimeDelayNotExpired | 延时未到 |
| 70 | uploadDownloadNotAccepted | 下载请求不接受 |
| 72 | generalProgrammingFailure | 编程失败 |
| 73 | wrongBlockSequenceCounter | 传输块序号错 |
| 78 | responsePending | ECU 正在处理 |
| 7E | subFunctionNotSupportedInActiveSession | 当前会话不支持该子功能 |
| 7F | serviceNotSupportedInActiveSession | 当前会话不支持该服务 |
| 92 | voltageTooHigh | 电压过高 |
| 93 | voltageTooLow | 电压过低 |
当前工程服务总览
| SID | 服务 | 用一句话理解 |
| 10 | DiagnosticSessionControl | 切换诊断会话 |
| 11 | ECUReset | 请求 ECU 复位 |
| 14 | ClearDiagnosticInformation | 清除 DTC |
| 19 | ReadDTCInformation | 读取故障信息 |
| 22 | ReadDataByIdentifier | 通过 DID 读数据 |
| 27 | SecurityAccess | Seed/Key 解锁 |
| 28 | CommunicationControl | 控制通信收发 |
| 2E | WriteDataByIdentifier | 通过 DID 写数据 |
| 2F | InputOutputControlByIdentifier | 临时控制 IO |
| 31 | RoutineControl | 执行内部例程 |
| 34 | RequestDownload | 请求开始下载 |
| 36 | TransferData | 传输下载数据 |
| 37 | RequestTransferExit | 结束下载传输 |
| 3E | TesterPresent | 保持诊断会话 |
| 85 | ControlDTCSetting | 控制 DTC 是否更新 |
0x10 DiagnosticSessionControl
目的
切换 ECU 当前诊断会话。很多服务只有在扩展会话或编程会话下才能执行。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | defaultSession | 默认会话 |
| 2 | programmingSession | 编程会话 |
| 3 | extendedDiagnosticSession | 扩展会话 |
请求格式
10 sessionType
示例请求
10 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 10 | DiagnosticSessionControl |
| byte1 | 3 | 请求进入扩展会话 |
ECU 执行动作
ECU 检查会话切换是否允许,允许后准备切换到目标会话。
正响应格式
50 sessionType P2_H P2_L P2_H P2_L
示例正响应
50 03 00 32 00 C8
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 50 | 0x10 的正响应 |
| byte1 | 3 | 已接受扩展会话 |
| byte2-3 | 00 32 | P2Server 时间 |
| byte4-5 | 00 C8 | P2*Server 时间 |
常见负响应
7F 10 12 子功能不支持
7F 10 22 条件不满足
7F 10 7E 当前会话不允许切换到目标会话
0x11 ECUReset
目的
请求 ECU 执行复位。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | hardReset | 硬复位 |
| 3 | keyOffOnReset/softReset | 类似下电上电或软复位 |
请求格式
11 resetType
示例请求
11 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 11 | ECUReset |
| byte1 | 1 | 请求 hardReset |
正响应格式
51 resetType
示例正响应
51 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 51 | 0x11 的正响应 |
| byte1 | 1 | 回显 hardReset |
ECU 执行动作
ECU 先发正响应,再执行复位动作。
常见负响应
7F 11 12 resetType 不支持
7F 11 22 当前条件不允许复位
0x14 ClearDiagnosticInformation
目的
清除 DTC 故障信息。
请求格式
14 groupOfDTC_H groupOfDTC_M groupOfDTC_L
常见 groupOfDTC
| groupOfDTC | 含义 |
| FF FF FF | 清除全部 DTC |
| xx xx xx | 清除指定 DTC 或指定组 |
示例请求
14 FF FF FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 14 | ClearDiagnosticInformation |
| byte1-3 | FF FF FF | 请求清除全部 DTC |
正响应格式
54
示例正响应
54
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 54 | 清除 DTC 成功 |
常见负响应
7F 14 13 长度错误
7F 14 22 条件不满足
7F 14 31 DTC 组不支持
0x19 ReadDTCInformation
目的
读取故障码数量、故障码列表、快照数据和支持的 DTC。
常见子功能
| 子功能 | 名称 | 请求用途 |
| 1 | reportNumberOfDTCByStatusMask | 按状态掩码读取 DTC 数量 |
| 2 | reportDTCByStatusMask | 按状态掩码读取 DTC 列表 |
| 3 | reportDTCSnapshotIdentification | 读取快照标识 |
| 4 | reportDTCSnapshotRecordByDTCNumber | 按 DTC 读取快照记录 |
| 6 | reportDTCExtDataRecordByDTCNumber | 按 DTC 读取扩展数据 |
| 0A | reportSupportedDTC | 读取所有支持的 DTC |
示例 1:读取 DTC 数量
请求:
19 01 FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 1 | 读取匹配状态掩码的 DTC 数量 |
| byte2 | FF | statusMask,匹配所有状态位 |
UDS 服务理解框架
这份文档用一个固定框架吸收所有 UDS 服务:
服务目的 -> 使用条件 -> 请求格式 -> 示例报文 -> 示例逐字节解释 -> 正响应 -> 负响应 -> 常见子功能/对象
读任何服务时,不要先背字节,先问 7 个问题:
- 这个服务让 ECU 干什么?
- 它在哪个会话/安全等级下能用?
- 请求报文由哪些字段组成?
- 示例报文每个字节是什么意思?
- ECU 收到后做什么业务动作?
- 成功怎么回?
- 失败用哪个 NRC 说明原因?
通用报文规则
1.1 请求报文
UDS 请求可以抽象成:
SID + 子功能/动作参数 + 目标对象 + 数据参数
字段理解:
| 字段 | 作用 |
| SID | 选择服务,例如 10/22/2F/31 |
| 子功能/动作参数 | 选择动作,例如进入扩展会话、启动例程、短期控制 |
| 目标对象 | DID、RID、DTC、内存地址等 |
| 数据参数 | 写入值、控制值、数据块、校验值等 |
1.2 正响应
正响应 SID 统一等于:
请求 SID + 0x40
| 请求 | 正响应 | 服务 |
| 10 | 50 | DiagnosticSessionControl |
| 11 | 51 | ECUReset |
| 14 | 54 | ClearDiagnosticInformation |
| 19 | 59 | ReadDTCInformation |
| 22 | 62 | ReadDataByIdentifier |
| 27 | 67 | SecurityAccess |
| 28 | 68 | CommunicationControl |
| 2E | 6E | WriteDataByIdentifier |
| 2F | 6F | InputOutputControlByIdentifier |
| 31 | 71 | RoutineControl |
| 34 | 74 | RequestDownload |
| 36 | 76 | TransferData |
| 37 | 77 | RequestTransferExit |
| 3E | 7E | TesterPresent |
| 85 | C5 | ControlDTCSetting |
1.3 负响应
负响应格式统一:
7F + 原请求 SID + NRC
例:
7F 2F 31
意思是:2F 服务失败,原因是 31 requestOutOfRange。
常见 NRC:
| NRC | 名称 | 怎么理解 |
| 11 | serviceNotSupported | ECU 不支持这个 SID |
| 12 | subFunctionNotSupported | 子功能不支持 |
| 13 | incorrectMessageLengthOrInvalidFormat | 长度或格式错 |
| 22 | conditionsNotCorrect | 当前条件不满足 |
| 24 | requestSequenceError | 请求顺序错 |
| 31 | requestOutOfRange | DID/RID/参数/地址超范围 |
| 33 | securityAccessDenied | 安全等级不够 |
| 35 | invalidKey | key 错 |
| 36 | exceedNumberOfAttempts | 解锁错误次数超限 |
| 37 | requiredTimeDelayNotExpired | 延时未到 |
| 70 | uploadDownloadNotAccepted | 下载请求不接受 |
| 72 | generalProgrammingFailure | 编程失败 |
| 73 | wrongBlockSequenceCounter | 传输块序号错 |
| 78 | responsePending | ECU 正在处理 |
| 7E | subFunctionNotSupportedInActiveSession | 当前会话不支持该子功能 |
| 7F | serviceNotSupportedInActiveSession | 当前会话不支持该服务 |
| 92 | voltageTooHigh | 电压过高 |
| 93 | voltageTooLow | 电压过低 |
当前工程服务总览
| SID | 服务 | 用一句话理解 |
| 10 | DiagnosticSessionControl | 切换诊断会话 |
| 11 | ECUReset | 请求 ECU 复位 |
| 14 | ClearDiagnosticInformation | 清除 DTC |
| 19 | ReadDTCInformation | 读取故障信息 |
| 22 | ReadDataByIdentifier | 通过 DID 读数据 |
| 27 | SecurityAccess | Seed/Key 解锁 |
| 28 | CommunicationControl | 控制通信收发 |
| 2E | WriteDataByIdentifier | 通过 DID 写数据 |
| 2F | InputOutputControlByIdentifier | 临时控制 IO |
| 31 | RoutineControl | 执行内部例程 |
| 34 | RequestDownload | 请求开始下载 |
| 36 | TransferData | 传输下载数据 |
| 37 | RequestTransferExit | 结束下载传输 |
| 3E | TesterPresent | 保持诊断会话 |
| 85 | ControlDTCSetting | 控制 DTC 是否更新 |
0x10 DiagnosticSessionControl
目的
切换 ECU 当前诊断会话。很多服务只有在扩展会话或编程会话下才能执行。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | defaultSession | 默认会话 |
| 2 | programmingSession | 编程会话 |
| 3 | extendedDiagnosticSession | 扩展会话 |
请求格式
10 sessionType
示例请求
10 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 10 | DiagnosticSessionControl |
| byte1 | 3 | 请求进入扩展会话 |
ECU 执行动作
ECU 检查会话切换是否允许,允许后准备切换到目标会话。
正响应格式
50 sessionType P2_H P2_L P2_H P2_L
示例正响应
50 03 00 32 00 C8
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 50 | 0x10 的正响应 |
| byte1 | 3 | 已接受扩展会话 |
| byte2-3 | 00 32 | P2Server 时间 |
| byte4-5 | 00 C8 | P2*Server 时间 |
常见负响应
7F 10 12 子功能不支持
7F 10 22 条件不满足
7F 10 7E 当前会话不允许切换到目标会话
0x11 ECUReset
目的
请求 ECU 执行复位。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | hardReset | 硬复位 |
| 3 | keyOffOnReset/softReset | 类似下电上电或软复位 |
请求格式
11 resetType
示例请求
11 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 11 | ECUReset |
| byte1 | 1 | 请求 hardReset |
正响应格式
51 resetType
示例正响应
51 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 51 | 0x11 的正响应 |
| byte1 | 1 | 回显 hardReset |
ECU 执行动作
ECU 先发正响应,再执行复位动作。
常见负响应
7F 11 12 resetType 不支持
7F 11 22 当前条件不允许复位
0x14 ClearDiagnosticInformation
目的
清除 DTC 故障信息。
请求格式
14 groupOfDTC_H groupOfDTC_M groupOfDTC_L
常见 groupOfDTC
| groupOfDTC | 含义 |
| FF FF FF | 清除全部 DTC |
| xx xx xx | 清除指定 DTC 或指定组 |
示例请求
14 FF FF FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 14 | ClearDiagnosticInformation |
| byte1-3 | FF FF FF | 请求清除全部 DTC |
正响应格式
54
示例正响应
54
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 54 | 清除 DTC 成功 |
常见负响应
7F 14 13 长度错误
7F 14 22 条件不满足
7F 14 31 DTC 组不支持
0x19 ReadDTCInformation
目的
读取故障码数量、故障码列表、快照数据和支持的 DTC。
常见子功能
| 子功能 | 名称 | 请求用途 |
| 1 | reportNumberOfDTCByStatusMask | 按状态掩码读取 DTC 数量 |
| 2 | reportDTCByStatusMask | 按状态掩码读取 DTC 列表 |
| 3 | reportDTCSnapshotIdentification | 读取快照标识 |
| 4 | reportDTCSnapshotRecordByDTCNumber | 按 DTC 读取快照记录 |
| 6 | reportDTCExtDataRecordByDTCNumber | 按 DTC 读取扩展数据 |
| 0A | reportSupportedDTC | 读取所有支持的 DTC |
示例 1:读取 DTC 数量
请求:
19 01 FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 1 | 读取匹配状态掩码的 DTC 数量 |
| byte2 | FF | statusMask,匹配所有状态位 |
正响应:
59 01 AA 01 00 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 59 | 0x19 的正响应 |
| byte1 | 1 | 回显子功能 |
| byte2 | AA | ECU 支持的 DTC 状态掩码示例 |
| byte3 | 1 | DTC 格式标识 |
| byte4-5 | 00 03 | 匹配的 DTC 数量为 3 |
示例 2:读取 DTC 列表
请求:
19 02 FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 2 | 读取 DTC 列表 |
| byte2 | FF | statusMask |
正响应:
59 02 AA 12 34 56 2F 23 45 67 2F
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 59 | 正响应 |
| byte1 | 2 | 回显子功能 |
| byte2 | AA | 可用状态掩码 |
| byte3-5 | 12 34 56 | 第 1 个 DTC 编号 |
| byte6 | 2F | 第 1 个 DTC 状态 |
| byte7-9 | 23 45 67 | 第 2 个 DTC 编号 |
| byte10 | 2F | 第 2 个 DTC 状态 |
示例 3:读取指定 DTC 快照
请求:
19 04 12 34 56 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 4 | 读取 DTC 快照记录 |
| byte2-4 | 12 34 56 | DTC 编号 |
| byte5 | 1 | 快照记录号 |
正响应:
59 04 12 34 56 2F snapshotData…
逐字节解释:
| 字段 | 含义 |
| 59 | 正响应 |
| 4 | 回显子功能 |
| 12 34 56 | 回显 DTC |
| 2F | statusOfDTC |
| snapshotData | 快照数据,通常由 DID + DID 数据组成 |
常见负响应
7F 19 12 子功能不支持
7F 19 13 长度错误
7F 19 31 DTC、状态掩码或记录号不支持
7F 19 7E 当前会话不支持该子功能
0x22 ReadDataByIdentifier
目的
按 DID 读取 ECU 数据。
请求格式
22 DID_H DID_L [DID_H DID_L …]
常见 DID 类型
| DID 类型 | 例子 | 含义 |
| 版本/零件号 | F183、F187、F18A、F18E、F191、F195 | 软件、硬件、零件、版本信息 |
| VIN/配置 | F190、F1A1 | 车辆识别或配置数据 |
| 快照 DID | DF01-DF06 | DTC 快照相关数据 |
示例请求
22 F1 90
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 22 | ReadDataByIdentifier |
| byte1-2 | F1 90 | DID = F190 |
正响应格式
62 DID_H DID_L data…
示例正响应
62 F1 90 31 32 33 34 35 36 37 38 39 …
逐字节解释:
| 字段 | 含义 |
| 62 | 0x22 的正响应 |
| F1 90 | 回显 DID |
| data | DID 对应的数据内容 |
多 DID 示例
请求:
22 F1 90 F1 A1
响应:
62 F1 90 data1… F1 A1 data2…
理解:一次读多个 DID,响应中按顺序返回每个 DID 和数据。
常见负响应
7F 22 13 长度错误
7F 22 31 DID 不支持
7F 22 33 权限不够
7F 22 7F 当前会话不支持该服务
0x27 SecurityAccess
目的
通过 Seed/Key 获取安全权限。很多写入、IO 控制、刷写服务都要先解锁。
常见子功能
| 子功能 | 含义 |
| 1 | 请求 Level1 seed |
| 2 | 发送 Level1 key |
| 11 | 请求 Level4/FBL seed |
| 12 | 发送 Level4/FBL key |
示例 1:请求 seed
请求:
27 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 27 | SecurityAccess |
| byte1 | 1 | 请求 Level1 seed |
正响应:
67 01 seed16…
逐字段解释:
| 字段 | 含义 |
| 67 | 0x27 的正响应 |
| 1 | 回显请求 seed 的子功能 |
| seed16 | ECU 返回的 16 字节 seed |
示例 2:发送 key
请求:
27 02 key32…
逐字段解释:
| 字段 | 含义 |
| 27 | SecurityAccess |
| 2 | 发送 Level1 key |
| key32 | 32 字节 key 数据,前 16 字节 DF,后 16 字节 token |
正响应:
67 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 67 | 正响应 |
| byte1 | 2 | key 通过,Level1 解锁成功 |
ECU 执行动作
ECU 发 seed 后保存 seed;收到 key 后,用内部密钥和 seed 计算结果,与 tester 发来的 token 比较。匹配则安全等级提升,不匹配则返回 invalidKey 并累计错误次数。
常见负响应
7F 27 12 子功能不支持
7F 27 24 没有先请求 seed 就发 key,或等级不匹配
7F 27 35 key 错误
7F 27 36 错误次数超限
7F 27 37 延时时间未到
0x28 CommunicationControl
目的
控制 ECU 某类通信报文的接收和发送。
常见子功能
| 子功能 | 含义 |
| 0 | enableRxAndTx |
| 1 | enableRxAndDisableTx |
| 2 | disableRxAndEnableTx,当前工程服务表未启用 |
| 3 | disableRxAndTx |
communicationType 常见值
| 值 | 含义 |
| 1 | normalCommunicationMessages |
| 3 | normal + networkManagement |
示例请求
28 03 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 28 | CommunicationControl |
| byte1 | 3 | 禁止接收和发送 |
| byte2 | 1 | 控制普通通信报文 |
正响应格式
68 controlType
示例正响应
68 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 68 | 正响应 |
| byte1 | 3 | 回显控制类型 |
常见负响应
7F 28 12 子功能不支持
7F 28 22 条件不满足
7F 28 31 communicationType 不支持
0x2E WriteDataByIdentifier
目的
按 DID 写入 ECU 数据。
当前工程常见可写 DID
| DID | 长度 | 常见含义 | 写入条件 |
| F184 | 9 | 指纹/编程相关数据 | 编程会话,Level4 |
| F190 | 17 | VIN 类数据 | 扩展会话,Level1 |
| F1A1 | 8 | 自定义配置数据 | 扩展会话,Level1 |
请求格式
2E DID_H DID_L data…
示例请求
2E F1 90 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37
逐字段解释:
| 字段 | 含义 |
| 2E | WriteDataByIdentifier |
| F1 90 | DID = F190 |
| 31 32 … 37 | 写入数据,长度必须等于 F190 定义长度 17 字节 |
正响应格式
6E DID_H DID_L
示例正响应
6E F1 90
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 6E | 0x2E 的正响应 |
| byte1-2 | F1 90 | 回显写入成功的 DID |
常见负响应
7F 2E 13 写入数据长度不等于 DID 定义长度
7F 2E 31 DID 不支持写入
7F 2E 33 安全权限不够
7F 2E 7F 当前会话不支持该服务
0x2F InputOutputControlByIdentifier
目的
临时控制 ECU 的输入/输出对象,例如阀位置、水泵使能和转速。
controlParameter 常见值
| 值 | 名称 | 含义 |
| 0 | returnControlToECU | 交还 ECU 控制 |
| 1 | resetToDefault | 复位默认值 |
| 2 | freezeCurrentState | 冻结当前状态 |
| 3 | shortTermAdjustment | 短期控制到指定值 |
当前工程支持的 IO DID
| DID | 对象 | 控制值 |
| 6501 | 5 通阀位置 | 2 字节角度,0-360 |
| 6502 | 6 通阀位置 | 2 字节角度,0-360 |
| 6503 | 电机水泵 | byte0=使能 0/1,byte1=速度 0-100 |
| 6504 | 空调水泵 | byte0=使能 0/1,byte1=速度 0-100 |
| 6505 | 电池水泵 | byte0=使能 0/1,byte1=速度 0-100 |
请求格式
2F DID_H DID_L controlParameter [controlState…]
示例 1:短期控制电机水泵
请求:
2F 65 03 03 01 50
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 2F | IO 控制服务 |
| byte1-2 | 65 03 | DID = 6503,电机水泵 |
| byte3 | 3 | shortTermAdjustment,短期控制 |
| byte4 | 1 | 水泵使能 = 1 |
| byte5 | 50 | 水泵速度 = 0x50 = 80 |
正响应:
6F 65 03 03 01 50
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 6F | 0x2F 的正响应 |
| byte1-2 | 65 03 | 回显 DID |
| byte3 | 3 | 回显控制方式 |
| byte4-5 | 01 50 | 回显控制状态 |
示例 2:复位空调水泵默认值
请求:
2F 65 04 01
逐字节解释:
| 字节 | 值 | 含义 |
| 2F | 2F | IO 控制服务 |
| 65 04 | 65 04 | DID = 6504,空调水泵 |
| 1 | 1 | resetToDefault |
正响应:
6F 65 04 01
常见负响应
7F 2F 13 长度错误
7F 2F 22 条件不满足
7F 2F 31 DID 不支持、控制参数不支持或控制值超范围
7F 2F 33 安全权限不够
0x31 RoutineControl
目的
让 ECU 启动、停止或查询一个内部例程。本工程实际主要使用 startRoutine。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | startRoutine | 启动例程 |
| 2 | stopRoutine | 停止例程 |
| 3 | requestRoutineResults | 查询例程结果 |
当前工程常见 RID
| RID | 名称 | 请求参数长度 | 响应状态长度 |
| 203 | 检查编程前置条件 | 0 | 1 |
| FF00 | 擦除内存 | 9 | 1 |
| 202 | 校验内存 | 64 | 1 |
| FF01 | 检查编程依赖 | 0 | 1 |
请求格式
31 routineControlType RID_H RID_L [routineControlOption…]
示例 1:检查编程前置条件
请求:
31 01 02 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 31 | RoutineControl |
| byte1 | 1 | startRoutine |
| byte2-3 | 02 03 | RID = 0203,检查编程前置条件 |
正响应:
71 01 02 03 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 71 | 0x31 的正响应 |
| byte1 | 1 | 回显 startRoutine |
| byte2-3 | 02 03 | 回显 RID |
| byte4 | 0 | routineStatus,00 表示正确/条件满足 |
示例 2:擦除内存
请求:
31 01 FF 00 44 00 02 00 00 00 01 00 00
逐字段解释:
| 字段 | 含义 |
| 31 | RoutineControl |
| 1 | startRoutine |
| FF 00 | RID = FF00,擦除内存 |
| 44 | 地址 4 字节,大小 4 字节 |
| 00 02 00 00 | 起始地址示例 |
| 00 01 00 00 | 擦除大小示例 |
可能先返回:
7F 31 78
表示擦除中。完成后返回:
71 01 FF 00 00
逐字节解释:
| 字段 | 含义 |
| 71 | 正响应 |
| 1 | startRoutine |
| FF 00 | 擦除内存 RID |
| 0 | 擦除结果正确 |
常见负响应
7F 31 12 子功能不支持
7F 31 13 长度错误
7F 31 22 条件不满足
7F 31 31 RID 或参数不支持
7F 31 33 安全权限不够
7F 31 78 例程执行中
0x34 RequestDownload
目的
开始下载流程,告诉 ECU 下载目标地址和总大小,并获取最大块长度。
请求格式
34 dataFormatIdentifier addressAndLengthFormatIdentifier memoryAddress… memorySize…
示例请求
34 00 44 00 02 00 00 00 01 00 00
逐字段解释:
| 字段 | 含义 |
| 34 | RequestDownload |
| 0 | dataFormatIdentifier,当前表示无压缩/无加密 |
| 44 | 高 4 位=4,memorySize 4 字节;低 4 位=4,memoryAddress 4 字节 |
| 00 02 00 00 | memoryAddress 示例 |
| 00 01 00 00 | memorySize 示例 |
正响应格式
74 lengthFormatIdentifier maxNumberOfBlockLength…
示例正响应
74 20 01 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 74 | 0x34 的正响应 |
| byte1 | 20 | 后面 maxNumberOfBlockLength 占 2 字节 |
| byte2-3 | 01 02 | ECU 允许的最大传输块长度示例 |
常见负响应
7F 34 13 长度错误
7F 34 22 下载条件不满足
7F 34 31 地址、大小或格式超范围
7F 34 33 安全权限不够
7F 34 70 下载不被接受
0x36 TransferData
目的
在 0x34 成功后,按块传输下载数据。
请求格式
36 blockSequenceCounter transferData…
示例请求
36 01 AA BB CC DD
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 36 | TransferData |
| byte1 | 1 | 第 1 块数据 |
| byte2… | AA BB CC DD | 本块下载数据 |
正响应格式
76 blockSequenceCounter
示例正响应
76 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 76 | 0x36 的正响应 |
| byte1 | 1 | 回显已接收的数据块序号 |
常见负响应
7F 36 24 请求顺序错误,未先执行 0x34 或流程状态不对
7F 36 31 数据长度或总量超范围
7F 36 72 写入失败
7F 36 73 blockSequenceCounter 错误
7F 36 92 电压过高
7F 36 93 电压过低
0x37 RequestTransferExit
目的
结束下载传输流程。
请求格式
37
示例请求
37
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 37 | RequestTransferExit |
正响应格式
77
示例正响应
77
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 77 | 0x37 的正响应,传输退出成功 |
常见负响应
7F 37 13 长度错误
7F 37 24 下载流程未完成或请求顺序错误
0x3E TesterPresent
目的
保持诊断会话,防止 ECU 因 S3 超时回默认会话。
常见子功能
| 子功能 | 含义 |
| 0 | 正常 TesterPresent |
| 80 | 设置抑制正响应位,成功时不回复 |
示例请求
3E 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 3E | TesterPresent |
| byte1 | 0 | tester 在线,要求正响应 |
正响应格式
7E 00
示例正响应
7E 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 7E | 0x3E 的正响应 |
| byte1 | 0 | 回显子功能 |
常见负响应
7F 3E 12 子功能不支持
7F 3E 13 长度错误
0x85 ControlDTCSetting
目的
控制 ECU 是否允许 DTC 记录/更新。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | on | 开启 DTC 更新 |
| 2 | off | 关闭 DTC 更新 |
请求格式
85 settingType
示例请求
85 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 85 | ControlDTCSetting |
| byte1 | 2 | 暂停 DTC 更新 |
正响应格式
C5 settingType
示例正响应
C5 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | C5 | 0x85 的正响应 |
| byte1 | 2 | 回显暂停 DTC 更新 |
常见负响应
7F 85 12 子功能不支持
7F 85 22 条件不满足
复杂服务吸收口诀
复杂服务就按这句话拆:
SID 说明服务,子功能说明动作,DID/RID/DTC/地址说明对象,后面的数据说明值或范围;ECU 检查条件后执行动作,成功回 SID+0x40 并回显关键字段,失败回 7F+SID+NRC。
拿到报文后按这个顺序标注:
- 标 SID:这是哪个服务。
- 标子功能:这次要做哪个动作。
- 标对象:操作哪个 DID/RID/DTC/地址。
- 标参数:写入值、控制值、长度、数据块或校验值。
- 标响应:正响应回显了什么,新增了什么结果字段。
- 标 NRC:失败原因属于长度、条件、权限、范围还是顺序。
正响应:
59 01 AA 01 00 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 59 | 0x19 的正响应 |
| byte1 | 1 | 回显子功能 |
| byte2 | AA | ECU 支持的 DTC 状态掩码示例 |
| byte3 | 1 | DTC 格式标识 |
| byte4-5 | 00 03 | 匹配的 DTC 数量为 3 |
示例 2:读取 DTC 列表
请求:
19 02 FF
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 2 | 读取 DTC 列表 |
| byte2 | FF | statusMask |
正响应:
59 02 AA 12 34 56 2F 23 45 67 2F
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 59 | 正响应 |
| byte1 | 2 | 回显子功能 |
| byte2 | AA | 可用状态掩码 |
| byte3-5 | 12 34 56 | 第 1 个 DTC 编号 |
| byte6 | 2F | 第 1 个 DTC 状态 |
| byte7-9 | 23 45 67 | 第 2 个 DTC 编号 |
| byte10 | 2F | 第 2 个 DTC 状态 |
示例 3:读取指定 DTC 快照
请求:
19 04 12 34 56 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 19 | ReadDTCInformation |
| byte1 | 4 | 读取 DTC 快照记录 |
| byte2-4 | 12 34 56 | DTC 编号 |
| byte5 | 1 | 快照记录号 |
正响应:
59 04 12 34 56 2F snapshotData…
逐字节解释:
| 字段 | 含义 |
| 59 | 正响应 |
| 4 | 回显子功能 |
| 12 34 56 | 回显 DTC |
| 2F | statusOfDTC |
| snapshotData | 快照数据,通常由 DID + DID 数据组成 |
常见负响应
7F 19 12 子功能不支持
7F 19 13 长度错误
7F 19 31 DTC、状态掩码或记录号不支持
7F 19 7E 当前会话不支持该子功能
0x22 ReadDataByIdentifier
目的
按 DID 读取 ECU 数据。
请求格式
22 DID_H DID_L [DID_H DID_L …]
常见 DID 类型
| DID 类型 | 例子 | 含义 |
| 版本/零件号 | F183、F187、F18A、F18E、F191、F195 | 软件、硬件、零件、版本信息 |
| VIN/配置 | F190、F1A1 | 车辆识别或配置数据 |
| 快照 DID | DF01-DF06 | DTC 快照相关数据 |
示例请求
22 F1 90
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 22 | ReadDataByIdentifier |
| byte1-2 | F1 90 | DID = F190 |
正响应格式
62 DID_H DID_L data…
示例正响应
62 F1 90 31 32 33 34 35 36 37 38 39 …
逐字节解释:
| 字段 | 含义 |
| 62 | 0x22 的正响应 |
| F1 90 | 回显 DID |
| data | DID 对应的数据内容 |
多 DID 示例
请求:
22 F1 90 F1 A1
响应:
62 F1 90 data1… F1 A1 data2…
理解:一次读多个 DID,响应中按顺序返回每个 DID 和数据。
常见负响应
7F 22 13 长度错误
7F 22 31 DID 不支持
7F 22 33 权限不够
7F 22 7F 当前会话不支持该服务
0x27 SecurityAccess
目的
通过 Seed/Key 获取安全权限。很多写入、IO 控制、刷写服务都要先解锁。
常见子功能
| 子功能 | 含义 |
| 1 | 请求 Level1 seed |
| 2 | 发送 Level1 key |
| 11 | 请求 Level4/FBL seed |
| 12 | 发送 Level4/FBL key |
示例 1:请求 seed
请求:
27 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 27 | SecurityAccess |
| byte1 | 1 | 请求 Level1 seed |
正响应:
67 01 seed16…
逐字段解释:
| 字段 | 含义 |
| 67 | 0x27 的正响应 |
| 1 | 回显请求 seed 的子功能 |
| seed16 | ECU 返回的 16 字节 seed |
示例 2:发送 key
请求:
27 02 key32…
逐字段解释:
| 字段 | 含义 |
| 27 | SecurityAccess |
| 2 | 发送 Level1 key |
| key32 | 32 字节 key 数据,前 16 字节 DF,后 16 字节 token |
正响应:
67 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 67 | 正响应 |
| byte1 | 2 | key 通过,Level1 解锁成功 |
ECU 执行动作
ECU 发 seed 后保存 seed;收到 key 后,用内部密钥和 seed 计算结果,与 tester 发来的 token 比较。匹配则安全等级提升,不匹配则返回 invalidKey 并累计错误次数。
常见负响应
7F 27 12 子功能不支持
7F 27 24 没有先请求 seed 就发 key,或等级不匹配
7F 27 35 key 错误
7F 27 36 错误次数超限
7F 27 37 延时时间未到
0x28 CommunicationControl
目的
控制 ECU 某类通信报文的接收和发送。
常见子功能
| 子功能 | 含义 |
| 0 | enableRxAndTx |
| 1 | enableRxAndDisableTx |
| 2 | disableRxAndEnableTx,当前工程服务表未启用 |
| 3 | disableRxAndTx |
communicationType 常见值
| 值 | 含义 |
| 1 | normalCommunicationMessages |
| 3 | normal + networkManagement |
示例请求
28 03 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 28 | CommunicationControl |
| byte1 | 3 | 禁止接收和发送 |
| byte2 | 1 | 控制普通通信报文 |
正响应格式
68 controlType
示例正响应
68 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 68 | 正响应 |
| byte1 | 3 | 回显控制类型 |
常见负响应
7F 28 12 子功能不支持
7F 28 22 条件不满足
7F 28 31 communicationType 不支持
0x2E WriteDataByIdentifier
目的
按 DID 写入 ECU 数据。
当前工程常见可写 DID
| DID | 长度 | 常见含义 | 写入条件 |
| F184 | 9 | 指纹/编程相关数据 | 编程会话,Level4 |
| F190 | 17 | VIN 类数据 | 扩展会话,Level1 |
| F1A1 | 8 | 自定义配置数据 | 扩展会话,Level1 |
请求格式
2E DID_H DID_L data…
示例请求
2E F1 90 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37
逐字段解释:
| 字段 | 含义 |
| 2E | WriteDataByIdentifier |
| F1 90 | DID = F190 |
| 31 32 … 37 | 写入数据,长度必须等于 F190 定义长度 17 字节 |
正响应格式
6E DID_H DID_L
示例正响应
6E F1 90
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 6E | 0x2E 的正响应 |
| byte1-2 | F1 90 | 回显写入成功的 DID |
常见负响应
7F 2E 13 写入数据长度不等于 DID 定义长度
7F 2E 31 DID 不支持写入
7F 2E 33 安全权限不够
7F 2E 7F 当前会话不支持该服务
0x2F InputOutputControlByIdentifier
目的
临时控制 ECU 的输入/输出对象,例如阀位置、水泵使能和转速。
controlParameter 常见值
| 值 | 名称 | 含义 |
| 0 | returnControlToECU | 交还 ECU 控制 |
| 1 | resetToDefault | 复位默认值 |
| 2 | freezeCurrentState | 冻结当前状态 |
| 3 | shortTermAdjustment | 短期控制到指定值 |
当前工程支持的 IO DID
| DID | 对象 | 控制值 |
| 6501 | 5 通阀位置 | 2 字节角度,0-360 |
| 6502 | 6 通阀位置 | 2 字节角度,0-360 |
| 6503 | 电机水泵 | byte0=使能 0/1,byte1=速度 0-100 |
| 6504 | 空调水泵 | byte0=使能 0/1,byte1=速度 0-100 |
| 6505 | 电池水泵 | byte0=使能 0/1,byte1=速度 0-100 |
请求格式
2F DID_H DID_L controlParameter [controlState…]
示例 1:短期控制电机水泵
请求:
2F 65 03 03 01 50
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 2F | IO 控制服务 |
| byte1-2 | 65 03 | DID = 6503,电机水泵 |
| byte3 | 3 | shortTermAdjustment,短期控制 |
| byte4 | 1 | 水泵使能 = 1 |
| byte5 | 50 | 水泵速度 = 0x50 = 80 |
正响应:
6F 65 03 03 01 50
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 6F | 0x2F 的正响应 |
| byte1-2 | 65 03 | 回显 DID |
| byte3 | 3 | 回显控制方式 |
| byte4-5 | 01 50 | 回显控制状态 |
示例 2:复位空调水泵默认值
请求:
2F 65 04 01
逐字节解释:
| 字节 | 值 | 含义 |
| 2F | 2F | IO 控制服务 |
| 65 04 | 65 04 | DID = 6504,空调水泵 |
| 1 | 1 | resetToDefault |
正响应:
6F 65 04 01
常见负响应
7F 2F 13 长度错误
7F 2F 22 条件不满足
7F 2F 31 DID 不支持、控制参数不支持或控制值超范围
7F 2F 33 安全权限不够
0x31 RoutineControl
目的
让 ECU 启动、停止或查询一个内部例程。本工程实际主要使用 startRoutine。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | startRoutine | 启动例程 |
| 2 | stopRoutine | 停止例程 |
| 3 | requestRoutineResults | 查询例程结果 |
当前工程常见 RID
| RID | 名称 | 请求参数长度 | 响应状态长度 |
| 203 | 检查编程前置条件 | 0 | 1 |
| FF00 | 擦除内存 | 9 | 1 |
| 202 | 校验内存 | 64 | 1 |
| FF01 | 检查编程依赖 | 0 | 1 |
请求格式
31 routineControlType RID_H RID_L [routineControlOption…]
示例 1:检查编程前置条件
请求:
31 01 02 03
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 31 | RoutineControl |
| byte1 | 1 | startRoutine |
| byte2-3 | 02 03 | RID = 0203,检查编程前置条件 |
正响应:
71 01 02 03 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 71 | 0x31 的正响应 |
| byte1 | 1 | 回显 startRoutine |
| byte2-3 | 02 03 | 回显 RID |
| byte4 | 0 | routineStatus,00 表示正确/条件满足 |
示例 2:擦除内存
请求:
31 01 FF 00 44 00 02 00 00 00 01 00 00
逐字段解释:
| 字段 | 含义 |
| 31 | RoutineControl |
| 1 | startRoutine |
| FF 00 | RID = FF00,擦除内存 |
| 44 | 地址 4 字节,大小 4 字节 |
| 00 02 00 00 | 起始地址示例 |
| 00 01 00 00 | 擦除大小示例 |
可能先返回:
7F 31 78
表示擦除中。完成后返回:
71 01 FF 00 00
逐字节解释:
| 字段 | 含义 |
| 71 | 正响应 |
| 1 | startRoutine |
| FF 00 | 擦除内存 RID |
| 0 | 擦除结果正确 |
常见负响应
7F 31 12 子功能不支持
7F 31 13 长度错误
7F 31 22 条件不满足
7F 31 31 RID 或参数不支持
7F 31 33 安全权限不够
7F 31 78 例程执行中
0x34 RequestDownload
目的
开始下载流程,告诉 ECU 下载目标地址和总大小,并获取最大块长度。
请求格式
34 dataFormatIdentifier addressAndLengthFormatIdentifier memoryAddress… memorySize…
示例请求
34 00 44 00 02 00 00 00 01 00 00
逐字段解释:
| 字段 | 含义 |
| 34 | RequestDownload |
| 0 | dataFormatIdentifier,当前表示无压缩/无加密 |
| 44 | 高 4 位=4,memorySize 4 字节;低 4 位=4,memoryAddress 4 字节 |
| 00 02 00 00 | memoryAddress 示例 |
| 00 01 00 00 | memorySize 示例 |
正响应格式
74 lengthFormatIdentifier maxNumberOfBlockLength…
示例正响应
74 20 01 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 74 | 0x34 的正响应 |
| byte1 | 20 | 后面 maxNumberOfBlockLength 占 2 字节 |
| byte2-3 | 01 02 | ECU 允许的最大传输块长度示例 |
常见负响应
7F 34 13 长度错误
7F 34 22 下载条件不满足
7F 34 31 地址、大小或格式超范围
7F 34 33 安全权限不够
7F 34 70 下载不被接受
0x36 TransferData
目的
在 0x34 成功后,按块传输下载数据。
请求格式
36 blockSequenceCounter transferData…
示例请求
36 01 AA BB CC DD
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 36 | TransferData |
| byte1 | 1 | 第 1 块数据 |
| byte2… | AA BB CC DD | 本块下载数据 |
正响应格式
76 blockSequenceCounter
示例正响应
76 01
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 76 | 0x36 的正响应 |
| byte1 | 1 | 回显已接收的数据块序号 |
常见负响应
7F 36 24 请求顺序错误,未先执行 0x34 或流程状态不对
7F 36 31 数据长度或总量超范围
7F 36 72 写入失败
7F 36 73 blockSequenceCounter 错误
7F 36 92 电压过高
7F 36 93 电压过低
0x37 RequestTransferExit
目的
结束下载传输流程。
请求格式
37
示例请求
37
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 37 | RequestTransferExit |
正响应格式
77
示例正响应
77
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 77 | 0x37 的正响应,传输退出成功 |
常见负响应
7F 37 13 长度错误
7F 37 24 下载流程未完成或请求顺序错误
0x3E TesterPresent
目的
保持诊断会话,防止 ECU 因 S3 超时回默认会话。
常见子功能
| 子功能 | 含义 |
| 0 | 正常 TesterPresent |
| 80 | 设置抑制正响应位,成功时不回复 |
示例请求
3E 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 3E | TesterPresent |
| byte1 | 0 | tester 在线,要求正响应 |
正响应格式
7E 00
示例正响应
7E 00
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 7E | 0x3E 的正响应 |
| byte1 | 0 | 回显子功能 |
常见负响应
7F 3E 12 子功能不支持
7F 3E 13 长度错误
0x85 ControlDTCSetting
目的
控制 ECU 是否允许 DTC 记录/更新。
常见子功能
| 子功能 | 名称 | 含义 |
| 1 | on | 开启 DTC 更新 |
| 2 | off | 关闭 DTC 更新 |
请求格式
85 settingType
示例请求
85 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | 85 | ControlDTCSetting |
| byte1 | 2 | 暂停 DTC 更新 |
正响应格式
C5 settingType
示例正响应
C5 02
逐字节解释:
| 字节 | 值 | 含义 |
| byte0 | C5 | 0x85 的正响应 |
| byte1 | 2 | 回显暂停 DTC 更新 |
常见负响应
7F 85 12 子功能不支持
7F 85 22 条件不满足
复杂服务吸收口诀
复杂服务就按这句话拆:
SID 说明服务,子功能说明动作,DID/RID/DTC/地址说明对象,后面的数据说明值或范围;ECU 检查条件后执行动作,成功回 SID+0x40 并回显关键字段,失败回 7F+SID+NRC。
拿到报文后按这个顺序标注:
- 标 SID:这是哪个服务。
- 标子功能:这次要做哪个动作。
- 标对象:操作哪个 DID/RID/DTC/地址。
- 标参数:写入值、控制值、长度、数据块或校验值。
- 标响应:正响应回显了什么,新增了什么结果字段。
- 标 NRC:失败原因属于长度、条件、权限、范围还是顺序。