1、0x7F服务(UDS Negative Response Service,否定应答服务)
Service description:
0x7F服务(UDS Negative response Service,否定应答服务)被ECU用于表示诊断服务请求的报文无效,被终止,抑或是在当前请求时刻无法执行的情况。而在否定应答报文中的返回码ResponseCode则应该能够表示诊断服务失效或者是无法被完成的原因。
2、否定应答报文定义
下表定义了否定应答报文的格式:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | Negative Response SID | M | 0x7F |
#2 | Service Name Request SID | M | 0xXX |
#3 | responseCode | M | 0xXX |
#4 | specificCauseCode | C | 0xXX |
C:只有当responseCode == 0x22时,否定应答报文中应该附带上具体的原因代码specificCauseCode。
3、否定应答码释义
下表定义了所有的否定应答码,每个诊断服务都指定了其可应用的否定应答码。服务端中的诊断服务的实现还可以利用车辆制造商定义的指定的附加和一些可应用的否定应答码。
0x00-0xFF范围的否定应答码被划分为如下三种:
—— 0x00:服务端内部实施所用的positiveResponse参数值;
—— 0x01 - 0x7F:通讯相关的否定应答码;
—— 0x80 - 0xFF:在服务端接收请求时,指定的条件/工况不符合的否定应答码。这些否定应答码可以附加在应答码0x22(conditionsNotCorrect)的后面,以更加详细的解释为什么请求无法被进行。
字节值 | 否定应答码(NRC)定义 |
---|---|
0x00 | positiveResponse 在否定应答报文中,该NRC不应被使用。该positiveResponse参数值是为了服务端内部的实施(具体描述了当服务端接收到请求报文时,会执行的一些逻辑步骤,会用到0x00)所预留的。 |
0x01 - 0xFF | ISOSAEReserved 该范围的值ISO预留。 |
0x10 | generalReject,一般性拒绝 该NRC表示服务端拒绝了请求的执行。在服务端中,如果没有一个否定应答码可以表示实际情况时,可以使用(generalReject,0x10)否定应答码来表示一般性拒绝。 |
0x11 | serviceNotSupported 当服务端不支持请求服务时,会发送该NRC。当客户端发送的请求报文的服务ID不正确、服务端不支持时,服务端会发送该NRC。 |
0x12 | sub-functionNotSupported,子服务不支持 服务端不支持请求报文中所包含的子函数参数时,会发送该NRC。 |
0x14 | responseTooLong,响应消息太长 如果要生成的应答报文超出了网络层可用的最大字节数,则服务端应发送此NRC。比如0x22服务请求读取多个DID的值,应答的长度超出了网络层可用的最大字节数时。 |
0x15 - 0x20 | ISOSAEReserved 该范围的值ISO预留。 |
0x21 | busyRepeatRequest,请求繁忙 服务端处理请求服务暂时繁忙时,会发送该NRC。在这种情况下,客户端会执行“同一个请求报文”或者“另外一个请求报文”的重复。重复提出请求的时间应该推迟到各个实施文档中所规定的时间。 比如,在多个客户端环境中,当一个不同的客户端完成一个诊断任务时,另外一个客户端可能会发送一个NRC 0x21暂时将其请求报文锁住。 如果客户端能够执行当前的诊断请求任务,但需要额外的时间来完成任务并且准备应答报文,则应该使用0x78。 |
0x22 | conditionsNotCorrect,条件不正确 服务端执行请求报文的先决条件不满足。 |
0x23 | ISOSAEReserved 该范围的值ISO预留。 |
0x24 | requestSequenceError,请求序列不正确 客户端或者服务端发送的报文消息序列,不是服务端期望的不同。 比如一个成功执行的0x27服务(SecurityAccess),在请求报文中指定了子函数参数为请求种子和发送密钥。如果客户端发送的执行序列不同,那么服务端将会发送0x24否定应答码。 |
0x25 | noResponseFromSubnetComponent,子网组件未响应 此NRC表示服务端已收到请求报文,但请求的操作无法由服务端执行,因为子网组件必须提供所请求的信息,但其未在指定时间内响应。 noResponseFromSubnetComponent 否定应答应该由电子系统中的网关来实施,该电子系统包含了子网组件且不能直接响应客户端的请求。网关可以接收子网组件的请求,然后从子网组件请求必要的信息。如果子网组件没有响应,服务端将使用此否定应答通知客户端该子网组件故障。 一般来说,每个诊断服务都支持该NRC,因为在数据链路层中的具体实施文件中没有另行说明,因此它没有列出在诊断服务的适用响应代码列表中。 |
0x26 | FailurePreventsExecutionOfRequestedAction,因失效阻止请求执行 由于某种失效工况发生,并且这种失效阻止了服务端执行请求的动作。失效,其由DTC(诊断故障码状态位中的TestFailed, Pending, Confirmed 或者 TestFailedSinceLastClear被设置为1)所标记。 举个例子,该NRC可以帮助技术人员直接去读取DTC,从而识别到或者修复问题。 注意:这意味着用于访问DTC的诊断服务不应执行该NRC,因为外部的测试工具可能会检查上述NRC,并在收到上述NRC时自动请求DTC。每个诊断服务一般都可以支持该NRC(上述服务除外),因为在数据链路层中特定实施文件中没有另行说明,因此它没有列出在诊断服务的适用响应代码列表中。 |
0x27 - 0x30 | ISOSAEReserved ISO预留 |
0x31 | requestOutOfRange,请求超出范围 服务端检测到请求报文中的参数超出了权限范围(比如,数据定义的是100个字节,而提交的数据是111个字节),或者是在当前会话下,尝试去访问的DID/RoutineID不被支持。 |
0x32 | ISOSAEReserved ISO预留 |
0x33 | securityAccessDenied,安全访问拒绝 服务端的安全策略未被客户端满足。如下情况发生时,服务端应该发送此NRC: —— 服务端的测试条件不满足; —— 请求报文序列未满足:比如,DiagnosticSessionControl,securityAccess; —— 客户端发送的请求报文要求一个解锁的服务端; |
0x34 | ISOSAEReserved ISO预留 |
0x35 | invalidKey,密钥无效 客户端发送的密钥与服务端内存中存储的密钥不匹配,服务端应该保持上锁,并且内部安全访问失败的次数应该也会增加一次。 |
0x36 | exceedNumberOfAttempts,超出访问次数 客户端未成功访问的次数超出了服务端安全策略所规定的。 |
0x37 | requiredTimeDelayNotExpired,请求的时间延迟未过期 在服务端的请求超时时间流逝之前,客户端最新一次去获取安全访问的尝试被重新初始化了。 |
0x38 – 0x4F | reservedByExtendedDataLinkSecurityDocument 扩展数据链路层安全保留。 |
0x50 – 0x6F | ISOSAEReserved ISO保留。 |
0x70 | uploadDownloadNotAccepted,上传下载未被接收 上传/下载到服务端内存中的尝试,由于某种故障条件,未被完成。 |
0x71 | transferDataSuspended,数据传输停止 数据传输操作停止了,由于一些故障,已经激活的数据传输服务应该被停止。 |
0x72 | generalProgrammingFailure,一般性编程失败 当在永久内存设备(比如,Flash内存)上进行擦写或者重新编程内存地址时,检测到错误。 |
0x73 | wrongBlockSequenceCounter,错误的块顺序计数 在blockSequenceCounter参数的顺序上,服务端检测到错误。注意:TransferData服务请求报文重复发送时,其blockSequenceCounter的值与上一条请求报文中的相同时,服务端应该接收该请求。 |
0x74 – 0x77 | ISOSAEReserved ISO保留。 |
0x78 | requestCorrectlyReceived-ResponsePending,请求被正确接收,应答Pending 这个NRC表示请求报文被正确接收,并且请求报文中的所有参数都是有效的,但是要执行的操作尚未完成,服务端也还没有准备好接收另一个请求。一旦请求的服务被完成,服务端将发送一个肯定应答报文,或者是一个与此响应码不同的的否定应答报文。 带有此NRC的否定响应报文可以由服务端重复发送,直到所请求的服务完成,并发送最终的应答报文。此NRC可能会影响应用层时许参数值。详细规范应包括在数据链路层的具体实施文件中。 如果服务端在完成所请求的诊断服务时,无法从客户端进一步接收请求消息,则此NRC只能用于否定应答报文。 当使用此NRC时,服务端总是要发送最后的应答(肯定或者否定); 使用该NRC的典型案例是,当客户端发送请求报文时,其包含了在服务端内存中要刷写或者擦除的数据。当写入服务端flash内存,如果刷写/擦除例程不支持串行通信,服务端应该使用应答码发送否定应答报文。 |
0x79 – 0x7D | ISOSAEReserved ISO保留。 |
0x7E | sub-functionNotSupportedInActiveSession,当前会话子函数不支持 当前激活的会话下,服务端不支持请求的子函数。 |
0x7F | serviceNotSupportedInActiveSession,当前会话服务不支持 当前激活的会话下,服务端不支持请求的服务。 |
0x80 | ISOSAEReserved ISO保留。 |
0x81 | rpmTooHigh,转速过高 服务端对于转速先决条件未满足(当前转速超出了预编程的最大值)。 |
0x82 | rpmTooLow,转速过低 服务端对于转速先决条件未满足(当前转速超出了预编程的最小值)。 |
0x83 | engineIsRunning,发动机正在运行中 有些测试工况下,要求发动机正在运行中。 |
0x84 | engineIsNotRunning,发动机未在运行 有些测试工况下,要求发动机停止运行。 |
0x85 | engineRunTimeTooLow,发动机运行时间太短 发动机运行时间低于预设值。 |
0x86 | temperatureTooHigh,温度过高 温度高于预设值。 |
0x87 | temperatureTooLow,温度过低 温度低于预设值。 |
0x88 | vehicleSpeedTooHigh,车速过高 车速高于预设值。 |
0x88 | vehicleSpeedTooHigh,车速过高 车速高于预设值。 |
0x89 | vehicleSpeedTooLow,车速过高 车速低于预设值。 |
0x8A | throttle/PedalTooHigh,节气门/油门踏板过高 节气门/油门踏板位置超出最大值。 |
0x8B | throttle/PedalTooLow,节气门/油门踏板过低 节气门/油门踏板位置低于最小值。 |
0x8C | transmissionRangeNotInNeutral,变速箱未在空挡 变速箱不在空挡。 |
0x8D | transmissionRangeNotInGear,变速箱不在挡位 变速箱不在挡位。 |
0x8E | ISOSAEReserved ISO保留。 |
0x8F | brakeSwitch(es)NotClosed (Brake Pedal not pressed or not applied),未踩制动踏板 出于安全考虑,需要在整个测试过程中保持制动踏板处于制动状态。 |
0x90 | shifterLeverNotInPark,换挡杆不在P挡 出于安全考虑,需要在整个测试过程中保持换挡杆出于P挡。 |
0x91 | torqueConverterClutchLocked,TC锁止 当前液力变矩器离合器状态为锁止。 |
0x92 | voltageTooHigh,电压高 ECU电压过高。 |
0x93 | voltageTooLow,电压低 ECU电压过低。 |
0x94 - 0xEF | reservedForSpecificConditionsNotCorrect,为指定不正确条件所预留 该范围值预留。 |
0xF0 - 0xFE | vehicleManufacturerSpecificConditionsNotCorrect,车辆制造厂商条件不正确 该范围的值为车辆制造厂商指定不正确的条件场景预留。 |
0xFF | ISOSAEReserved ISO保留。 |