2. UDS协议核心服务解析
UDS(Unified Diagnostic Services,ISO 14229)在MICROSAR诊断栈中通过Dcm模块对外提供统一的服务分发入口。每个诊断服务由SID(Service Identifier)唯一标识,请求报文遵循“SID + 子功能/参数 + 数据”的结构,响应则分为肯定响应(SID+0x40)与否定响应(0x7F + SID + NRC)。理解每个服务的请求/响应格式以及NRC(Negative Response Code)触发条件,是诊断集成工程中最基础也最容易出错的部分。本节按服务族逐一解析,并给出MICROSAR Dcm配置中需要关注的要点。
会话与状态控制类:0x10、0x11、0x3E、0x85
0x10 DiagnosticSessionControl用于切换ECU的诊断会话。请求格式为 10 + 子功能,常用子功能包括 0x01(默认会话)、0x02(编程会话)、0x03(扩展会话)。肯定响应为 50 + 子功能 + P2Server_max(2字节) + P2*Server_max(2字节),其中P2时间参数告知测试仪当前会话下的响应超时。若请求的子功能不被支持,返回NRC 0x12(subFunctionNotSupported);若当前会话不允许切换(例如从编程会话直接跳默认会话需先复位),返回NRC 0x7E(subFunctionNotSupportedInActiveSession)或0x7F(serviceNotSupportedInActiveSession)。在MICROSAR中,会话切换由Dcm的SessionControl配置项与DcmDspSessionRow共同决定,每个会话可独立配置支持的服务集合。
0x11 ECUReset请求 11 + 子功能,常用0x01(硬复位)、0x02(钥匙关断复位)、0x03(软复位)。肯定响应 51 + 子功能。关键点在于:ECU复位后诊断会话会回到默认会话,因此测试仪通常需要在复位后重新执行0x10。若在编程会话下请求硬复位,需确保复位前已完成刷写数据的校验,否则可能返回NRC 0x22(conditionsNotCorrect)。
0x3E TesterPresent用于维持非默认会话。请求 3E + 子功能,子功能0x00表示需要响应,0x80表示抑制肯定响应(suppressPosRspMsgIndicationBit)。肯定响应 7E + 子功能。若在默认会话下发送0x3E,通常仍可正常响应,但不会改变会话状态。MICROSAR中通过DcmDspSessionRow的S3Server超时参数控制会话保持时间,超时后自动回默认会话。
0x85 ControlDTCSetting用于开启/关闭DTC记录。请求 85 + 子功能 + DTCSettingType,子功能0x01(on)、0x02(off)。肯定响应 C5 + 子功能。该服务常用于刷写或标定过程中避免误报DTC。若在默认会话下请求,可能返回NRC 0x7F;若DTCSettingType不支持,返回NRC 0x12。
故障码与数据读取类:0x19、0x22
0x19 ReadDTCInformation是诊断中报文最复杂的服务之一。请求格式为 19 + 子功能 + 参数,常用子功能:0x02(reportDTCByStatusMask)、0x04(reportDTCSnapshotRecordByDTCNumber)、0x06(reportDTCExtDataRecordByDTCNumber)、0x0A(reportSupportedDTC)。以0x02为例,请求 19 02 + StatusMask,肯定响应 59 02 + StatusAvailabilityMask + [DTC(3字节) + StatusOfDTC(1字节)]...。StatusMask用于过滤DTC状态位(如testFailed、confirmedDTC等)。若子功能不支持返回NRC 0x12;若DTC数量超出响应长度,Dcm会自动分包或返回NRC 0x14(responseTooLong)。MICROSAR中需在DcmDspDTC配置中正确设置DTC状态字节的可用位掩码,否则测试仪可能读到全0状态。
0x22 ReadDataByIdentifier请求 22 + DID(2字节),支持一次请求多个DID。肯定响应 62 + DID + Data。若DID不存在返回NRC 0x31(requestOutOfRange);若DID存在但当前会话无权限读取,返回NRC 0x33(securityAccessDenied)。在MICROSAR中,每个DID通过DcmDspData配置其数据类型、长度、读写权限及会话/安全等级。例如DID 0xF190(VIN)通常为17字节ASCII,只允许在扩展会话下读取。
安全与写入类:0x27、0x2E、0x31
0x27 SecurityAccess采用“种子-密钥”机制。请求 27 + 子功能,奇数子功能(如0x01)请求种子,肯定响应 67 01 + Seed;偶数子功能(如0x02)发送密钥,肯定响应 67 02。若密钥错误返回NRC 0x35(invalidKey);若请求顺序错误(未请求种子直接发密钥)返回NRC 0x24(requestSequenceError);若尝试次数超限返回NRC 0x36(exceedNumberOfAttempts)或0x37(requiredTimeDelayNotExpired)。MICROSAR中通过DcmDspSecurityRow配置种子长度、密钥算法回调及尝试次数。
0x2E WriteDataByIdentifier请求 2E + DID + Data,肯定响应 6E + DID。写入前通常需要先通过0x27解锁。若DID只读返回NRC 0x31;若数据长度不符返回NRC 0x13(incorrectMessageLengthOrInvalidFormat);若写入条件不满足(如电压过低)返回NRC 0x22。
0x31 RoutineControl请求 31 + 子功能 + RoutineIdentifier(2字节) + 可选参数,子功能0x01(start)、0x02(stop)、0x03(requestRoutineResults)。肯定响应 71 + 子功能 + RoutineIdentifier + 结果。常用于执行自检、擦除Flash、校验等例程。若例程不存在返回NRC 0x31;若例程已启动再次启动返回NRC 0x24;若例程执行条件不满足返回NRC 0x22。
NRC处理与MICROSAR配置要点
NRC是诊断服务被拒绝时返回的错误码,格式固定为 7F + 原SID + NRC。工程中最常见的NRC包括:0x11(serviceNotSupported,SID未配置)、0x12(subFunctionNotSupported)、0x13(incorrectMessageLengthOrInvalidFormat)、0x22(conditionsNotCorrect)、0x24(requestSequenceError)、0x31(requestOutOfRange)、0x33(securityAccessDenied)、0x35(invalidKey)、0x7E(subFunctionNotSupportedInActiveSession)、0x7F(serviceNotSupportedInActiveSession)。在MICROSAR Dcm中,NRC的生成由DcmDspServiceTable、DcmDspSessionRow、DcmDspSecurityRow等配置共同决定。例如,若某服务未在当前会话的DcmDspSessionRow中使能,Dcm会直接返回0x7F,而不会进入服务处理函数。
下表汇总本节各服务的请求/响应格式与典型NRC,可作为集成时的快速对照:
| 服务 | 请求格式 | 肯定响应 | 典型NRC |
|---|---|---|---|
| 0x10 | 10 + 子功能 | 50 + 子功能 + P2 + P2* | 0x12, 0x7E, 0x7F |
| 0x11 | 11 + 子功能 | 51 + 子功能 | 0x12, 0x22 |
| 0x14 | 14 + 组号(3字节) | 54 | 0x13, 0x31 |
| 0x19 | 19 + 子功能 + 参数 | 59 + 子功能 + 数据 | 0x12, 0x14, 0x31 |
| 0x22 | 22 + DID | 62 + DID + Data | 0x31, 0x33 |
| 0x27 | 27 + 子功能 | 67 + 子功能 + Seed/空 | 0x24, 0x35, 0x36, 0x37 |
| 0x2E | 2E + DID + Data | 6E + DID | 0x13, 0x22, 0x31, 0x33 |
| 0x31 | 31 + 子功能 + RoutineID + 参数 | 71 + 子功能 + RoutineID + 结果 | 0x22, 0x24, 0x31 |
| 0x3E | 3E + 子功能 | 7E + 子功能 | 0x12 |
| 0x85 | 85 + 子功能 + DTCSettingType | C5 + 子功能 | 0x12, 0x22, 0x7F |
需要特别说明0x14 ClearDiagnosticInformation:请求 14 + 组号(3字节),组号0xFFFFFF表示清除所有DTC,肯定响应为 54。若组号无效返回NRC 0x31;若当前会话不允许清除返回NRC 0x7F。在MICROSAR中,0x14的处理通常与Dem模块联动,Dcm收到请求后调用Dem_ClearDTC,清除结果通过响应码反馈。
综合来看,UDS服务的集成质量取决于三个层面的匹配:SID与DcmDspServiceTable的匹配、子功能/参数与DcmDspSessionRow/DcmDspData的匹配、以及NRC生成条件与测试仪预期的一致性。建议在集成阶段用CANoe.DiVa或类似工具对每个服务做正反用例覆盖,尤其关注会话切换边界、安全等级边界和长度异常场景,这些正是NRC最集中出现的位置。