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)服务
上传下载功能单元
UDS 诊断 - RequestDownload(请求下载)(0x34)服务
UDS 诊断 - RequestUpload(请求上传)(0x35)服务
UDS 诊断 - TransferData(传输数据)(0x36)服务
UDS 诊断 - RequestTransferExit(请求传输终止)(0x37)服务
UDS 诊断 - RequestFileTransfer(请求文件传输)(0x38)服务
一、服务说明
ResponseOnEvent(基于事件响应)服务请求服务器启动或停止传输对特定事件的响应。
服务器中发生特定事件时,使用本服务可以自动执行诊断服务。客户端规定了事件发生时将要执行的事件(包括可选的事件参数)和服务(包括服务参数)。
下图为客户端和服务器行为相关的简单概述。
注 上图假设服务器断电之前事件时段计时器就已配置为超时,因此,事件计时时段结束时显示最终 ResponseOnEvent(基于事件响应)肯定响应消息。
服务器接收 ResponseOnEvent(基于事件响应)肯定响应消息时应评估其子功能及数据内容。它包括以下子功能和参数:
- eventType(事件类型);
- eventWindowTime(事件时段时间);
- eventTypeRecord(事件类型记录)(第 1 个 至 第 m 个 eventTypeParameter(事件类型参数))。
ResponseOnEvent(基于事件响应)请求消息中存在无效数据的情况下,应发送带 NRC 0x31 的否定响应。serviceToRespondToRecord(待响应的服务记录)不属于本评估的内容。特定事件发生时将评估 serviceToRespondToRecord(待响应的服务记录),这会触发 serviceToRespondToRecord 中包含的服务。事件发生时应执行 serviceToRespondToRecord(待响应的服务记录)(诊断服务请求消息)。条件不正确时,应发送带适宜的否定响应码的否定响应消息。发生多个事件时,应按照其发生顺序发出信号。
应遵循以下实施规则:
a) 任何会话中都可以建立并激活 0x86 服务,包括默认会话。0x3E 服务不必要使 0x86 服务保持为活动状态。
b) 诊断服务在进行时如果发生特定事件,这意味着正在接收请求消息,或已执行请求,或响应消息正将要传输(包括带 NRC 0x78 的否定响应消息处理)(如果 suppressPosRspMsgIndicationBit = FALSE)。则应暂停执行 serviceToRespondToRecord(待响应的服务记录)中包含的请求消息,直到正在进行的诊断服务完成。
注 某些情况下由于 serviceToRespondTo(待响应的服务)延后,serviceToRespondToRecord(待响应的服务记录)中包含的数据可能与引起事件的数据值不一致。
c) 一个事件正在进行中时若发生其他多个事件,则多个事件的处理(例如,忽略除第一个 / 最后一个事件外的所有事件,或着依存事件)应具有 vehicleManufacturerSpecific(车辆制造商特异性)。
d) 满足事件逻辑,且在事件时间时段内发生事件时,服务器应执行 serviceToRespondToRecord(待响应的服务记录)中包含的服务。
e) ResponseOnEvent(基于事件响应)请求 “启动” 发起 ResponseOnEvent(基于事件响应)服务后,服务器应响应已设置好事件逻辑且已启动 ROE 事件的客户端,直到事件时段事件截止。
f) 移动到任何非默认会话的 DiagnosticSessionControl(诊断会话控制)请求应停止 0x86 服务,无论是否已激活除当前会话之外的不同非默认会话或者相同的非默认会话。返回默认会话后,应重新激活此前已在默认会话中激活的所有 0x86 服务。
g) 多个 0x86 服务可以根据不同要求(不同的 EventType(事件类型),serviceToRespondToRecord(待响应的服务记录),…)同时运行以启动和停止诊断服务。启动和停止子功能应始终控制好所有已发起的 0x86 服务。
h) 如果已设置好 0x86服务,则应遵循以下要求:
1)如果 eventType(事件类型)子功能参数的第 6 位设置为 0 (不存储事件),则服务器断电时事件应终止。重置或上电后服务器不得继续 0x86 诊断服务(即,0x86 服务终止)。
2)如果eventType(事件类型)子功能参数的第 6 位设置位 1(存储事件),根据服务器重启后设置的 ResponseOnEvent(基于事件响应),服务器应继续发送 serviceToRespondTo(待响应的服务)响应。因此,仅与无限 eventWindowTime(事件时段时间)结合时允许 StoreEvent(存储事件)。
i) 仅用于 eventType = stopResponseOnEvent、startResponseOnEvent 或 clearResponseOnEvent 时,客户端可以使用 “suppressPosRspMsgIndicationBit = TRUE”。检测到特定事件时,服务器应始终向事件触发的响应返回响应。
j) 仅当已设置好无限时段事件且无限时段事件已过去时,服务器才应返回 ResponseOnEvent(基于事件响应)“最终” 响应以表明 ResponseOnEvent(基于事件响应)(0x86)服务。如果无限时段事件还未过去之前已通过任何方式(例如 stopResponseOnEvent(停止基于事件响应)子功能或更改会话)停止 ROE,则不得发送任何最终响应。
k) 为了避免干扰正常诊断操作,建议实施仅将应用于瞬态事件和条件的 0x86 服务。每次发生事件后服务器均应返回响应。对于一段时间内持续维持的条件,应仅在首次发生时执行一次响应服务。如果已定义 eventType(事件类型),因此 serviceToRespondTo(待响应的服务)响应的发生频率较高,则须采取适宜的措施以阻止连续的 serviceToRespondTo(待响应的服务)响应。 serviceToRespondTo(待响应的服务)响应之间的最小分离时间可能属于 eventTypeRecord(事件类型记录)的一部分(具有车辆制造商特异性)。
发生特定事件时,对于将执行的服务,建议仅使用下表中列出的服务。
建议服务(serviceToRespondTo(待响应的服务)) | 请求SID | 响应SID |
---|---|---|
ReadDataByIdentifier(按标识符读取数据) | 0x22 | 0x62 |
ReadDTCInformation(读取 DTC 信息) | 0x19 | 0x59 |
RoutinControl(例程控制) | 0x31 | 0x71 |
ReadDTCInformation(读取 DTC 信息) | 0x19 | 0x59 |
InputOutputControlByIdentifier(按标识符输入输出控制) | 0x2F | 0x6F |
鉴于性能因素(例如,避免错过执行 serviceToRespondToRecord(待响应的服务记录)请求服务标识符),建议遵守以下意见:
— DID 可能含有重要数据(例如,避免定义事件逻辑读取连续的 “校准” 标签)
— 可能将 serviceToRespondToRecord(待响应的服务记录)的大小限制位最大为车辆制造商特定值。
二、请求消息
1.请求消息定义
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | ResponseOnEvent(基于事件响应)请求SID | 0x86 | M |
#2 | sub-function = [ eventType ] | 0x00 - 0xFF | M |
#3 | eventWindowTime(事件时段时间) | 0x00 - 0xFF | M |
#4 . . #(m-1)+4 | eventTypeRecord[] = [ eventTypeParameter #1 . . eventTypeParameter #m] | 0x00 - 0xFF . . 0x00 - 0xFF | C1 . . C1 |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord[] = [ serviceId serviceParameter#1 . . serviceParameter#r] | 0x00 - 0xFF 0x00 - 0xFF . . 0x00 - 0xFF | C2 C3 . . C3 |
C1:如果eventType(事件类型)要求为待响应的事件规定其他参数,则存在该字节。
C2:如果子功能参数不等于 reportActivatedEvents(报告激活事件)、stopResponseOnEvent(停止基于事件响应)、startResponseOnEvent(启动基于事件响应) 或 clearResponseOnEvent(清除基于事件响应),则强制性地存在该字节。
C3:如果待响应的服务的服务请求要求其他服务参数,则存在该字节。
2.请求消息子功能参数定义
ResponseOnEvent(基于事件响应)请求消息使用子功能参数 eventType(事件类型)规定将在服务器中配置的事件,并控制 ResponseOnEvent(基于事件响应)的建立。下表中给出的每个子功能参数值还规定了适用的 evenTypeRecord(事件类型记录)的长度。
eventType(事件类型)子功能参数的第 6 位用于表明是否应将事件存储在服务器的非易失性存储器中,及是否应在服务器下次上电后重新激活,或者服务器断电后其是否应终止(storageState(存储状态)参数)。
第 6 位值 | 说明 |
---|---|
0x00 | doNotStoreEvent(不存储事件) 该值表明,服务器断电时事件应终止,且重置或上电后服务器不得继续 ResponseOnEvent(基于事件响应)诊断服务(即,ResponseOnEvent(基于事件响应)服务终止)。 |
0x01 | storeEvent(存储事件) 该值表明 1)默认会话中 ROE(基于事件响应) 启动或停止请求时,根据重置或上电后建立的 ResponseOnEvent(基于事件响应),事件应继续或停止发送 serviceToRespondTo(待响应的服务)响应(即,继续 ResponseOnEvent(基于事件响应)服务)。 2)经任何 ROE 建立的事件逻辑请求,应持久地存储该被请求的事件逻辑,直到(通过 clearResponseOnEvent(清除基于事件响应))明确地清除该事件逻辑,或者一个新的相同类别的 ROE 建立的事件逻辑请求覆盖该事件逻辑。 |
第 5 至 0 位值 | 说明 | ROE(基于事件响应)子功能的类型 |
---|---|---|
0x00 | stopResponseOnEvent(停止基于事件响应) 该值用于停止服务器发送对事件的响应。未清除已建立的事件逻辑,但可以通过 startResponseOnEvent(启动基于事件响应)子功能参数进行重启。 eventTypeRecord(事件类型记录)的长度:0 个字节 | 控制 |
0x01 | onDTCStatusChange(关于 DTC 状态更改) 该值将事件识别为已检测到的与该事件规定的 DTCStatusMask(DTC 状态掩码)相匹配的新 DTC。 eventTypeRecord(事件类型记录)的长度:1个字节 U 实施暗示:U 驻留于服务器的 DTC 计数算法应以某个周期性速率(例如,约 1 秒)来计算符合客户端定义的 DTCStatusMask(DTC 状态掩码)的 DTC 数量。如果计数与之前执行的计算得出的计数不同,则客户端应生成导致执行 serviceToRespondTo(待响应的服务)的事件。应存储下最新计数作为下次计算的参考。 | 建立 |
0x02 | onTimerInterrupt(关于计时器中断) 该值将事件识别未计时器中断,但是计时器及其值并非 ResponseOnEvent(基于事件响应)服务的一部分。 eventTypeRecord(事件类型记录)的长度:1个字节 | 建立 |
0x03 | onChangeOfDataIdentifier(关于数据标识符更改) 该值将事件识别未新的按 dataIdentifier(数据标识符)识别的内部数据记录。数据值具有车辆制造商特异性。 eventTypeRecord(事件类型记录)的长度:2 个字节 | 建立 |
0x04 | reportActivatedEvents(报告激活事件) 该值用于表明,在肯定响应中通过 ResponseOnEvent(基于事件响应)服务已在服务器中激活的(且当前仍活动的)所有事件均已报告。 eventTypeRecord(事件类型记录)的长度:0 个字节 | 控制 |
0x05 | startResponseOnEvent(启动基于事件响应) 该值用于向服务器表明激活已建立的事件逻辑(包括事件时段计时器),并开始发送对事件的响应。 eventTypeRecord(事件类型记录)的长度:0 个字节 | 控制 |
0x06 | clearResponseOnEvent(清除基于事件响应) 该值用于清除已在服务器中建立的事件逻辑(同时还停止服务器发送对事件的响应)。 eventTypeRecord(事件类型记录)的长度:0 个字节 | 控制 |
0x07 | onComparisonOfValues(关于值对比) 定义改变超出按 dataIdentifier(数据标识符)标识的特定记录数据(该数据标识符表示了数据值事件)。通过该子功能,使用者有可能在发生根据所定义的测量值对比收集到的特定结果时定义事件。数据记录中包括的分配给所定义的 dataIdentifier(数据标识符)的具体测量值与指定对比值进行对比。所规定的运算符定义了对比的种类。如果对比结果时肯定的,则事件发生。 eventTypeRecord(事件类型记录)的长度:10 个字节 | 建立 |
0x08 - 0x1F | 保留。 | |
0x20 - 0x2F | VehicleManufacturerSpecific(由车辆制造商规定) | |
0x30- 0x3E | SystemSupplierSpecific(由系统供应商规定) | |
0x3F | 保留 |
1. 详细的请求子功能 onTimerInterrupt(关于计时器中断)参数规范
基于子功能 onTimerInterrupt(关于计时器中断),允许服务器在计时器配置的时间段内触发事件。
eventTypeRecord(事件类型记录)通过以下计时器调度定义计时器值:
— 慢速,
— 中速,
— 快速。
制造商的具体任务时定义与每个计时器调度选项相关的计时速率。见下表。
eventTypeRecord(事件类型记录) | 将生成的事件 | 计时器类型 |
---|---|---|
0x01 | 每次慢速计时器值消逝时 | 慢速计时器。例如,1s 后计时器消逝。 |
0x02 | 每次中速计时器值消逝时 | 中速计时器。例如,300ms 后计时器消逝。 |
0x03 | 每次快速计时器值消逝时 | 快速计时器。例如,25ms 后计时器消逝。 |
2. 详细的请求子功能 onChangeOfDataIdentifier(关于数据标识符更改)参数规范
基于子功能 onChangeOfDataIdentifier(关于数据标识符更改),允许服务器在固定时间段内轮询测量值,并将内容进行对比,因此,服务器可能免除部分更改,且触发的事件少于预期数量。
eventTypeRecord(事件类型记录)设置须监视其是否有任何更改的双字节 DID 值。
3. 详细的请求子功能 onComparisonOfValues(关于值对比)参数规范
下面三个表用子功能 onComparisonOfValues(关于值对比)参数规定了 serviceToRespondToRecord(待响应的服务记录)规定读取得到的 DID 之间进行对比时请求消息的参数。
下表为子功能 onComparisonOfValues(关于值对比)参数定义
数据字节 | 参数名称 | 字节值 | 注释 | 详细要求 |
---|---|---|---|---|
1 | ServiceID(服务 ID) | 0x86 | 请求SID | — |
2 | eventType(事件类型) | 0x07 | 子功能 onComparisonOfValues(关于值对比) | — |
3 | eventWindowTime(事件时段时间) | 0x02 | InfiniteTimeWindow(无限时间时段)规范 | — |
4 | eventTypeRecord(事件类型记录)第 1 个字节 | 0x01 | DataIdentifier(数据标识符)(DID)高位字节 | 可以是与 serviceToRespondToRecord(待响应的服务记录)中使用的 DID 不同的 DID。可以时动态定义的 DID。 |
5 | eventTypeRecord(事件类型记录)第 2 个字节 | 0x04 | DataIdentifier(数据标识符)(DID)低位字节 | — |
6 | eventTypeRecord(事件类型记录)第 3 个字节 | 0x01 | 对比逻辑,见表 “对比逻辑参数定义” | eventTypeRecord(事件类型记录)第 3 个字节设置了对比方法的逻辑。 |
7 | eventTypeRecord(事件类型记录)第 4 个字节 | 0x00 | 原始参考对比值 MSB | eventTypeRecord(事件类型记录)第 4 个、第 5 个、第 6 个及第 7 个字节设置了参考对比值。 |
8 | eventTypeRecord(事件类型记录)第 5 个字节 | 0x00 | 原始参考对比值 | — |
9 | eventTypeRecord(事件类型记录)第 6 个字节 | 0x01 | 原始参考对比值 | — |
10 | eventTypeRecord(事件类型记录)第 7 个字节 | 0x00 | 原始参考对比值 LBS | — |
11 | eventTypeRecord(事件类型记录)第 8 个字节 | 0x0A | 滞后值 | eventTypeRecord(事件类型记录)第 8 个字节定义了滞后值(以 0% (0x00)至 100% (0x64)的百分比表示)。 |
12 | eventTypeRecord(事件类型记录)第 9 个字节 | 0xBC | 第 1 个定位字节 MSB,见表 “值第 16 位位域参数的位置定义” | eventTypeRecord(事件类型记录)第 9 个、第 10 个字节定义了值在数据标识符内的位置,见表 “值第 16 位位域参数的位置定义”。 |
13 | eventTypeRecord(事件类型记录)第 10 个字节 | 0x58 | 第 2 个定位字节 LSB,见表 “值第 16 位位域参数的位置定义” | — |
14 | serviceToRespondTo(待响应的服务)第 1 个字节 | 0x22 | SID | serviceToRespondToRecord(待响应的服务记录)设置了将读取并进行对比的服务和 DID。在第一个肯定响应消息中,numberOfIdentifiedEvents(标识符事件数量)字段通常设置为 0x00。 |
15 | serviceToRespondTo(待响应的服务)第 2 个字节 | 0xA1 | DID 1 | — |
16 | serviceToRespondTo(待响应的服务)第 3 个字节 | 0x00 | DID 2 | — |
下表规定了对比逻辑参数定义。
对比逻辑 ID | 以下情况将生成事件 |
---|---|
0x01 | 对比参数 < 测得的值 |
0x02 | 对比参数 > 测得的值 |
0x03 | 对比参数 = 测得的值 |
0x04 | 对比参数 <> 测得的值 |
下表规定了值第 16 位位域参数的位置。
位域位位置 | 说明 |
---|---|
15 | (MSB),bit = 0 指无符号的对比,bit = 1 指有符号的对比 |
14 - 10 | 第 10 位 (LSB)至第 14 位(MSB)包含待对比的数据标识符的长度。应使用值 0x00 来对比所有 4 个字节。所有其他值均应设置好位大小。有 5 位时,数据标识符长度最大位 31 位。 |
9 - 0 | 关于从其中提取数据标识符的肯定响应消息的偏移。第 0 位(LSB)至第 9 位(MSB)包含起始位数字偏移。有 10 位时,偏移最大为 1023 位。 |
3. 请求消息数据参数定义
定义 |
---|
eventWindowTime(事件时段时间) 参数 eventWindowTime(事件时段时间)用于规定将服务器中活动的事件逻辑的时段。如果 eventWindowTime(事件时段时间)的参数值设置为 0x02,则响应时间为无限。为无限事件时段且 storageState(存储状态)等于 doNotStoreEvent(不存储事件)的情况下,建议通过特定信号(例如,关闭电源)关闭事件时段。 不得使用无限事件时段与等于 storeEvent(存储事件)的 storageState(存储状态)的组合。 注 eventType(事件类型)等于 ROE(基于事件响应)控制子功能时,该参数不适用于由服务器进行评估。 |
eventTypeRecord(事件类型记录) 该参数记录包含具体 eventType(事件类型)的其他参数。 |
serviceToResponseToRecord(待响应的服务记录) 该参数记录包含每次发生 eventTypeRecord(事件类型记录)中定义的具体事件时将在服务器中执行的服务的服务参数(服务 ID 及服务参数)。 |
下表为 eventWindowTime(事件时段时间)参数的定义。
字节值 | 说明 |
---|---|
0x00 - 0x01 | 保留 |
0x02 | infiniteTimeToResponse(无限期响应) 该值规定事件时段应无限期保持活动状态(例如,事件时段在断电前一直开启)。 |
0x03 - 0x7F | VehicleManufacturerSpecific(由车辆制造商规定) |
0x80 - 0xFF | 保留 |
三、肯定响应消息
1. 肯定响应消息定义
下表定义了除 reportActivatedEvents(报告激活事件)之外所有子功能的肯定响应消息。
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | ResponseOnEvent(基于事件响应)响应SID | 0xC6 | M |
#2 | eventType(事件类型) | 0x00 - 0x7F | M |
#3 | numberOfIdentifiedEvents(标识事件的数量) | 0x00 - 0xFF | M |
#4 | eventWindowTime(事件时段时间) | 0x00 - 0xFF | M |
#5 . . #(m-1)+5 | eventTypeRecord[] = [ eventTypeParameter#1 . . eventTypeParameter#m ] | 0x00 - 0xFF . . 0x00 - 0xFF | C1 . . C1 |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord[] = [ serviceId serviceParameter#1 . . serviceParameter#r] | 0x00 - 0xFF 0x00 - 0xFF . . 0x00 - 0xFF | M C2 . . C2 |
C1:如果eventType(事件类型)要求为待响应的事件规定其他参数,则存在该字节。
C2:如果待响应的服务的服务请求要求其他服务参数,则存在该字节。
下表定义了除 sub-function = reportActivatedEvents(报告激活事件)的肯定响应消息。
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | ResponseOnEvent(基于事件响应)响应SID | 0xC6 | M |
#2 | eventType = reportActivatedEvents | 0x04 | M |
#3 | numberOfActivatedEvents(激活事件的数量) | 0x00 - 0xFF | M |
#4 | eventTypeOfActivatedEvent #1(第 1 个活动事件的事件类型) | 0x00 - 0xFF | C1 |
#5 | eventWindowTime #1(第 1 个事件时段时间) | 0x00 - 0xFF | C1 |
#6 . . #(m-1)+6 | eventTypeRecord #1[] = [ eventTypeParameter#1 . . eventTypeParameter#m ] | 0x00 - 0xFF . . 0x00 - 0xFF | C2 . . C2 |
#p-(o-1)-1 #p-(p-1) . . #p | serviceToRespondToRecord #1[] = [ serviceId serviceParameter #1 . . serviceParameter #o] | 0x00 - 0xFF 0x00 - 0xFF . . 0x00 - 0xFF | C3 C4 . . C4 |
. . | . . | . . | . . |
#n-(r-1)-4-(q-1) | eventTypeOfActivatedEvent #k(第 k 个活动事件的事件类型) | 0x00 - 0xFF | C1 |
#n-(r-1)-3-(q-1) | eventWindowTime #k(第 k 个事件时段时间) | 0x00 - 0xFF | C1 |
#n-(r-1)-2-(q-1) . . #n-(r-1)-2 | eventTypeRecord #k[] = [ eventTypeParameter #1 . . eventTypeParameter #q ] | 0x00 - 0xFF . . 0x00 - 0xFF | C2 . . C2 |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord #k[] = [ serviceId serviceParameter #1 . . serviceParameter #r] | 0x00 - 0xFF 0x00 - 0xFF . . 0x00 - 0xFF | C3 C4 . . C4 |
C1:如果报告活动事件,则存在该字节。
C2:如果活动事件的已报告 eventType(事件类型)(eventTypeOfActiveEvent(活动时间的事件类型))要求为待响应的事件规定的其他参数,则该字节存在。
C3:报告活动事件时,该字节强制存在。
C4:如果待响应的服务的已报告服务请求要求其他服务参数,则存在该字节。
2. 肯定响应消息数据参数定义
定义 |
---|
eventType(事件类型) 该参数是对来自请求消息的子功能参数第 6 至 0 位的回显。 |
eventTypeOfActiveEvent(活动事件的事件类型) 该参数是为建立活动事件而发送的请求消息的子功能参数的回显。适用值为针对 eventType(事件类型)子功能参数规定的值。 |
numberOfActivatedEvents(激活事件的数量) 该参数包含客户端请求报告活动事件数量时的活动事件数量。该数量反映了响应消息中报告的事件数量。 |
numberOfIdentifiedEvents(标识事件的数量) 本参数包含活动事件时段期间标识的事件的数量,仅适用于事件时段结束时(无限时间时段的情况下)发送的响应消息。对请求消息进行首次响应时该参数中应含有一个 0。 |
eventWindowTime(事件时段时间) 该参数是对来自请求消息的 eventWindowTime(事件时段时间)参数的回显。报告活动事件时,该参数包含将活动的事件的剩余时间。 |
eventTypeRecord(事件类型记录) 该参数是对来自请求消息的 eventTypeRecord(事件类型记录)参数的回显。报告活动事件时,该参数是为建立活动事件而发送的请求的 eventTypeRecord(事件类型记录)的回显。 |
serviceToRespondToRecord(待响应的服务记录) 该参数是对来自请求消息的 serviceToRespondToRecord(待响应的服务记录)参数的回显。报告活动事件时,该参数是为建立活动事件而发送的请求的 serviceToRespondToRecord(待响应的服务记录)的回显。 |
四、支持的NRC
NRC | 说明 |
---|---|
0x12 | 不受支持的子功能 |
0x13 | 消息长度不正确或格式无效 |
0x22 | 条件不正确 服务器因处于关键正常模式活动而无法执行所请求的功能时使用该代码。 |
0x31 | 请求超过限值 以下情况下服务器应使用该响应代码: 如果服务器检测到 eventTypeRecord(事件类型记录)参数出错; 如果规定的 eventWindowTime(事件时段时间)无效; 如果不支持所请求的 DID; 如果请求的是无限事件时段与等于 storeEvent(存储事件)的 storageState(存储状态)的组合。 |
五、示例
1. 假设
示例假设等同于 0x08 的 eventWindowTime(事件时段时间)定义的事件时段为 80s(eventWindowTime(事件时段时间)* 10s)。
suppressPosRspMsgIndicationBit = False.
以下条件适用于所有消息流示例和流程图:
- 触发信号:
由车辆制造商确定特定的触发信号,该信号促使客户端(外部测试设备、车载诊断装置、诊断主机等)开始发出 ResponseOnEvent(基于事件响应)的请求消息。此触发信号可通过一个事件以及一个诸如 heartbeat-time(心跳报文时间)(宜大于 eventWindowTime(事件时段时间))的固定计时调度来启用。并且,数据链上可能会有一个同步消息(如 SYNCH-signal(同步信号))用作触发信号。 - 打开事件时段:
接收 ResponseOnEvent(基于事件响应)的请求消息后,服务器应对该请求进行评估。若评估结果为正,则服务器应设置事件逻辑,并且必须发送 ResponseOnEvent(基于事件响应)服务的初始肯定响应消息。若要激活事件逻辑,客户端须发出 ResponseOnEvent(基于事件响应)的子功能 startResponseOnEvent(启动基于事件响应)的请求。发出肯定响应后,事件逻辑被激活,事件时段计时器开始运行。由车辆制造商使用 eventWindowTime(事件时段时间)参数(如计时时段、点火开关打开 / 关闭时段)详细定义事件时段。检测指定 eventType(事件类型)(EART_)时,服务器须立即通过对应于 ResponseOnEvent(基于事件响应)请求消息中的 serviceToRespondToRecord(待响应的服务记录)的响应消息作出响应。 - 关闭事件时段:
建议按照 eventWindowTime(事件时段时间)参数关闭服务器的事件时段。执行此操作后,服务器须停止发送事件驱动的诊断响应消息。通过发送包含 stopResponseOnEvent(停止基于事件响应)参数的 ResponseOnEvent(基于事件响应)(ROE_)的请求消息或通过断电可达到相同的结果。
1. 基于事件响应(有限事件时段)
$86 设置请求消息 (请求 $1901)- $86 初始肯定响应消息
req 86 01 08 01 19 01 01
resp C6 01 00 08 01 19 01 01
// req #1_0x86 SID
// req #2_0x01 eventType = onDTCStatusChange(0x01);storageState = doNotStoreEvent(0x0);suppressPosRspMsgIndicationBit = False(0x0)
// req #3_0x08 eventWindowTime = 80s
// req #4_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// req #5_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// req #6_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// req #7_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = onDTCStatusChange(0x01)
// resp #3_0x00 numberOfIdentifiedEvents = 0
// resp #4_0x08 eventWindowTime = 80s
// resp #5_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// resp #6_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// resp #7_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// resp #8_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
已设置事件逻辑;此刻必须激活该事件逻辑。
$86 开始请求消息 - $86 肯定响应消息
req 86 05 08
resp C6 01 00 08
// req #1_0x86 SID
// req #2_0x05 eventType = startResponseOnEvent(0x05);storageState = doNotStoreEvent(0x0);suppressPosRspMsgIndicationBit = False(0x0)
// req #3_0x08 eventWindowTime = 80s(将不被评估)
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = onDTCStatusChange(0x01)
// resp #3_0x00 numberOfIdentifiedEvents = 0
// resp #4_0x08 eventWindowTime = 80s
发生指定事件时,服务器将按照指定的 seviceToResponseToRecord(待响应的服务记录)发送响应消息。
$19 肯定响应消息
resp 59 FF 00 04
客户端可能请求在活动事件时段内报告服务器中当前的活动事件:
$86 活动事件请求数目
req 86 04 08
resp C6 04 01 01 08 01 19 01 01
// req #1_0x86 SID
// req #2_0x04 eventType = reportActivatedEvents(0x04);storageState = doNotStoreEvent(0x0);suppressPosRspMsgIndicationBit = False(0x0)
// req #3_0x08 eventWindowTime = 80s(将不被评估)
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = reportActivatedEvents(0x04)
// resp #3_0x01 numberOfIdentifiedEvents = 1
// resp #4_0x01 eventTypeOfActiveEvent = onDTCStatusChange
// resp #5_0x08 eventWindowTime = 80s
// resp #6_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// resp #7_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// resp #8_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// resp #9_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
若指定时间段时间已终止,则服务器应发送最终肯定响应。
$86 最终肯定响应
resp C6 01 01 08 01 19 01 01
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = onDTCStatusChange(0x01)
// resp #3_0x01 numberOfIdentifiedEvents = 1
// resp #4_0x08 eventWindowTime = 80s
// resp #5_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// resp #6_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// resp #7_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// resp #8_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
1.1 示例1 — 流程图
以下流程图显示了两种不同的服务器行为:
— 有限事件时段内未发生事件。在此情况下,服务器须在事件时段结束时发送 ResponseOnEvent(基于事件响应)的响应。
— 有限事件时段内发生多个事件。serviceToRespondTo(待响应的服务)的每个肯定响应与已识别事件有关,并且应具有相同的 SID,但可以拥有不同的内容。event_Window(事件时段)结束时,服务器应传输 ResponseOnEvent(基于事件响应)服务的肯定响应消息,以表明 numberOfIdentifiedEvents(已识别事件的数目)。
下图显示了有限事件时段 - 活动事件时段内未发生事件。
下图显示了有限事件时段 - 活动事件时段内发生多个事件。
2. 基于事件响应(无限事件时段)
$86 设置请求消息 (请求 $1901)- $86 初始肯定响应消息
req 86 01 02 01 19 01 01
resp C6 01 00 02 01 19 01 01
// req #1_0x86 SID
// req #2_0x01 eventType = onDTCStatusChange(0x01);storageState = doNotStoreEvent(0x0);suppressPosRspMsgIndicationBit = False(0x0)
// req #3_0x02 eventWindowTime = infinite
// req #4_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// req #5_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// req #6_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// req #7_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = onDTCStatusChange(0x01)
// resp #3_0x00 numberOfIdentifiedEvents = 0
// resp #4_0x02 eventWindowTime = infinite
// resp #5_0x01 eventTypeRecord [ eventTypeParameter ] = testFailed status
// resp #6_0x19 serviceToRespondRecord [ serviceId ] = ReadDTCInformation($19服务)
// resp #7_0x01 serviceToRespondRecord [ sub-function ] = reportNumberOfDTCByStatusMask($19 服务的 $01 子功能)
// resp #8_0x01 serviceToRespondRecord [ DTCStatusMask ] = testFailed status
已设置事件逻辑;此刻必须激活该事件逻辑。
$86 开始请求消息 - $86 肯定响应消息
req 86 05 02
resp C6 05 00 02
// req #1_0x86 SID
// req #2_0x05 eventType = startResponseOnEvent(0x05);storageState = doNotStoreEvent(0x0);suppressPosRspMsgIndicationBit = False(0x0)
// req #3_0x02 eventWindowTime(将不被评估)
// resp #1_0xC6 响应SID
// resp #2_0x01 eventType = onDTCStatusChange(0x01)
// resp #3_0x00 numberOfIdentifiedEvents = 0
// resp #4_0x02 eventWindowTime
发生指定事件时,服务器将按照指定的 seviceToResponseToRecord(待响应的服务记录)发送响应消息。
$19 肯定响应消息
resp 59 XX 00 04
// 'XX' 为DTC状态可用性掩码,值为 0x00 - 0xFF
2.1 示例2 — 流程图
以下流程图显示了两种不同的服务器行为:
— 无限事件时段内未发生事件。
— 无限事件时段内发生多个事件。serviceToRespondTo(待响应的服务)的每个肯定响应与已识别事件有关,并且应具有相同的 SID,但可以拥有不同的内容。
下图显示了无限事件时段 - 活动事件时段内未发生事件。
下图显示了无限事件时段 - 活动事件时段内发生多个事件。
3. 无限事件时段 — 子功能参数 onComparisonOfValues(关于数值的比较)
本示例仅阐述子功能参数 onComparisonOfValues(关于数值的比较)的使用,并假设示例 1 和示例 2 中所述的基于事件响应(ROE)服务的通信行为未发生变更。因此,本示例不描述完整的消息流。相反,仅显示盒阐述事件时段设置请求消息和目前发生的事件的肯定响应消息。上文示例中已描述了开始和停止请求消息以及不同的响应消息。以下条件适用:
— 服务 0x22 被选择作为 serviceToRespondTo(待响应的服务);
— DID 0x0104 包括需在第 11 个和第 12 个数据字节进行比较的测量值(也可使用服务 0x22 读取该测量值)。
— 测量值(MV)大于比较参数(CP)时发生了某个事件,因此,运算符的值被选择作为 0x01 - “MV > CP”;
— 0x0A - 10% 被选择作为滞后值;
— 数值 0x02 - “无限” 被选择作为 eventWindowTime(事件时段时间);
— 二进制值 1 - “storeEvent(存储事件)” 被选择作为 storageState(存储状态)(eventType(事件类型)子功能第 6 位)。
— 任何情况下请求响应。
示例适用的定义:
— 第 4 个和第 5 个字节:DID 0x0104
— 第 6 个和第 7 个字节:读取本地化和读数类型的定义。
- 示例 1:若读数为数据记录的第 11 个字节,则以下规定适用:
- 11 x 8 = 88(十进制)= 000101 1000b 第 10 位至第 14 位:以位表示的长度 - 1.
- 在有 5 位的情况下,最大尺寸为 32 位 = “long”。
- 示例 2:“文字” 长度为 15(十进制)= 0 1111b 第 15 位:符号条目:1 = 有符合,0 = 无符号
- 示例 3:总工作分配将为:
- 1011 1100 0101 1000b = 0xBC58 因而,第 6 个字节包含 0xBC,第 7 个字节包含 0x58
- 第 8 个字节:比较运算(运算符)
- 示例 4:运算符 MV > CP = 0x01
- 第 9 个至第 12 个字节:由于比较参数为 4 字节长度,因此可以传输 “bit” 至 “long” 类型的所有数据格式。
- 示例 5:若比较值 5242(十进制) = 0x000 147A
- 第 9 个字节 = 0x00,第 10 个字节 = 0x00,第 11 个字节 = 0x14,第 12 个字节 = 0x7A
- 第 13 个字节:滞后值(指定为比较参数的百分率)。直接指定该值。其仅适用与运算符 “<” 和 “>”。若比较值为零,则应将滞后值定义为绝对值。
- 示例 6:滞后值 10% = 0xAA
$86 请求消息
字节 | 说明 | 字节值 |
---|---|---|
#1 | SID | 0x86 |
#2 | eventType = onComparisonOfValues(0x07) storageState = storeEvent(0x01) suppressPosRspMsgIndicationBit = False(0x00) | 0x47 |
#3 | eventWindowTime = infinite | 0x02 |
#4 | eventTypeRecord [ eventTypeParameter #1] = recordDataIdentifier(High Byte) | 0x01 |
#5 | eventTypeRecord [ eventTypeParameter #2] = recordDataIdentifier(Low Byte) | 0x04 |
#6 | eventTypeRecord [ eventTypeParameter #3] = ValueInfo #1 | 0xBC |
#7 | eventTypeRecord [ eventTypeParameter #4] = ValueInfo #2 | 0x58 |
#8 | eventTypeRecord [ eventTypeParameter #5] = Operator | 0x01 |
#9 | eventTypeRecord [ eventTypeParameter #6] = ComparisonParameter(Byte #4) | 0x00 |
#10 | eventTypeRecord [ eventTypeParameter #7] = ComparisonParameter(Byte #3) | 0x00 |
#11 | eventTypeRecord [ eventTypeParameter #8] = ComparisonParameter(Byte #2) | 0x14 |
#12 | eventTypeRecord [ eventTypeParameter #9] = ComparisonParameter(Byte #1) | 0x7A |
#13 | eventTypeRecord [ eventTypeParameter #10] = Hysteresis[%] | 0x0A |
#14 | serviceToRespondToRecord [ serviceID ] = ReadDataByIdentifier(0x22) | 0x22 |
#15 | serviceToRespondToRecord [ serviceParameter #1 ] = DID(MSB) | 0x01 |
#16 | serviceToRespondToRecord [ serviceParameter #1 ] = DID(LSB) | 0x04 |
注 未显示响应消息及后续初始化序列
$22 肯定响应消息
成功设置事件时段并激活基于事件响应(ROE)机制后,若测量值大于 5242d,则服务器将作出反应。将发生指定事件,并且服务器将发送以下消息。
字节 | 说明 | 字节值 |
---|---|---|
#1 | SID | 0x62 |
#2 | DID (High Byte) | 0x01 |
#3 | DID (Low Byte) | 0x04 |
#4 | dataRecord #1 | 0xXX |
#5 | dataRecord #2 | 0xXX |
#6 | dataRecord #3 | 0xXX |
#7 | dataRecord #4 | 0xXX |
#8 | dataRecord #5 | 0xXX |
#9 | dataRecord #6 | 0xXX |
#10 | dataRecord #7 | 0xXX |
#11 | dataRecord #8 | 0xXX |
#12 | dataRecord #9 | 0xXX |
#13 | dataRecord #10 | 0xXX |
#14 | dataRecord #11 第 11 个字节的数据内容:0x14 | 0x14 |
#15 | dataRecord #12 第 12 个字节的数据内容:0x7B | 0x7B |
. . | . . | . . |
后续事件发生的时间并非在测量值至少低于比较参数值的 90% 之前。此行为为通过滞后值加以指定。若满足此条件并且测量值再次大于比较值,则将发生新事件,并且服务器将发送新的 0x22 的响应消息。