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保留。
         

返回UDS诊断服务功能单元介绍目录

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐