目录
1、0x86服务(事件响应服务)
Service description:
0x86服务(ResponseOnEvent,事件响应服务)请求服务端开始或停止传输具体事件的响应。
如果服务端中指定事件发生了,该服务ResponseOnEvent会自动执行一个诊断服务。客户端来指定事件(包括可选择的事件参数)以及要执行的服务(包括服务参数)。有关客户端和服务端之间行为的简要概述,请参见下图:
注意:上图假设在服务端下电之前事件窗口计时器(event window timer)配置成超时,因此最后ResponseOnEvent的肯定应答报文在事件超时窗口的最后才会显示。
服务端应该在接收请求报文时,就去评估事件响应服务(ResponseOnEvent)的子函数和数据内容,子函数和参数包含如下:
—— eventType,事件类型;
—— eventWindowTime,事件窗口时间;
—— eventTypeRecord (eventTypeParameter #1-#m),事件类型记录(事件类型参数 #1-#m).
如果事件响应服务(ResponseOnEvent)请求报文中的数据无效,则发送否定应答码0x31。serviceToRespondToRecord不属于该评估的一部分。当指定事件发生时,将评估serviceToRespondToRecord参数,这将触发serviceToRespondToRecord中所包含服务的执行。在事件发生时,应执行serviceToRespondToRecord(诊断服务请求报文)。如果条件不正确,则应发送带有合理的否定应答码的否定应答报文。多个事件应按其发生的顺序发出信号。
应用以下实施规则:
a) ResponseOnEvent服务可以在任何会话中设置和激活,包括defaultSession。保持ResponseOnEvent服务激活并不一定需要TestPresent(测试工具保持连接)服务。
b) 如果在诊断服务运行过程中发生了指定的事件,这意味着正在接收请求报文或正在执行请求,或者正在传输应答报文(包括响应码为0x78的否定应答报文)(如果suppressposrspmsglnindicationbit = FALSE),则serviceToRespondToRecord中包含的请求报文的执行应该延迟。直到正在进行的诊断服务完成。
注意:在某些情况下,由于ServiceToRespondTo的延迟,ServiceToRespondTo记录中包含的数据,可能与导致事件的数据值不对应。
c) 如果一个事件发生时多个事件也发生了,这种多事件处理(如忽略所有除了第一个或者最后一个或事件存储之外的所有事件)应该由车辆制造厂商去指定。
d) 当事件逻辑满足并且事件在事件时间窗口内产生,服务端应该执行serviceToRespondToRecord所包含的服务。
e) 一旦ResponseOnEvent服务被“start”初始化,服务端将会响应已设置事件逻辑的客户端,并启动ROE事件,直到事件窗口时间超时。
f) 切换到任何非默认会话的诊断会话控制的请求将会停止掉ResponseOnEvent服务,无论是否激活了与当前会话不同的非默认会话或相同的非默认会话。在返回到DefaultSession时,之前在默认会话中激活的所有ResponseOnEvent服务都将被重新激活。
g) 带有不同需求(不同的EventTypes, serviceToRespondToRecords,…)的多个ResponseOnEvent服务可能会并发地运行,以启动和停止诊断服务。启动和停止子函数应该始终控制所有初始化的ResponseOnEvent服务。
h) 如果设置了事件响应服务,如下应该应用:
1)如果eventType子函数参数的第6位设置为0(不存储事件),则事件将在服务端下电时终止。服务端在复位或上电后,将不再继续进行ResponseOnEvent诊断服务(即ResponseOnEvent服务终止)。
2)如果eventType子函数参数的第6位设置为1(存储事件),则在服务单上电一个周期后,将根据ResponseOnEvent-set恢复发送serviceToRespondTo-responses。因此,StoreEvent只允许与infinite eventWindowTime去结合使用。
i) “suppressPosResponseMessageIndicattionBit” = “yes”,被客户端用于eventType = stopResponseOnEvent, startResponseOnEvent or clearResponseOnEvent时去使用,当指定的事件被探测时,服务端总能够对事件触发型的响应给出应答。
j) 只有当有限的窗口时间被设置和有限的窗口时间已经过去时,服务端应该返回一个ResponseOnEvent “final”应答,来表明ResponseOnEvent (0x86)服务。在有限的窗口时间过去之前,如果ROE(ResponseOnEvent)以任何方式停止(例如:"stopResponseOnEvent"子函数或会话切换),那么“final”应答将不被发送。
k) 为了避免干扰正常的诊断操作,建议将ResponseOnEvent服务实现为只应用于瞬态的事件和条件。服务器应该在每次事件发生时返回一个响应。对于持续一段时间事件发生的情况,响应服务应在事件初始发生时只执行一次。如果eventType被定义为serviceToRespondTo,应答可以以高频率发生,同时也必须采取适当的措施来防止back to back这种的serviceToRespondTo 应答。serviceToRespondTo-responses之间的最小间隔时间可以是eventTypeRecord(车辆制造商定义)的一部分。
建议仅使用下表中列出的服务,以便在发生指定事件时能够执行服务。(serviceToRespondToRecord SID)。
推荐服务(ServiceToRespondTo) | Request SID | Reponse SID |
---|---|---|
ReadDataByIdentifier | 0x22 | 0x62 |
ReadDTCInformation | 0x19 | 0x59 |
RoutineControl | 0x31 | 0x71 |
InputOutputControlByIdentifier | 0x2F | 0x6F |
出于运行原因(如,避免错过serviceToRespondToRecord请求服务标识符(SID)的执行),建议遵循以下建议:
——可能会包含测量数据的DID(如避免读取常量“标定”标签事件逻辑(event logic)的定义);
——serviceToRespondToRecord 肯定应答的大小可能会受限,其尺寸大小取决于车辆制造商定义的值;
2、请求报文格式
2.1 请求报文定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | ResponseOnEvent Request SID | M | 0x86 |
#2 | sub-function = [ eventType ] | M | 0x00 - 0xFF |
#3 | eventWindowTime | M | 0x00 - 0xFF |
#4 . . #(m-1)+4 | eventTypeRecord[] = [ eventTypeParameter 1 . . eventTypeParameter m ] | C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord[] = [ serviceId serviceParameter 1 . . serviceParameter r ] ] | C2 C3 . . C3 | 0x00 – 0xFF 0x00 – 0xFF . . 0x00 – 0xFF |
C1: 如果eventType需要额外的参数,来应答指定的事件,则出现该参数;
C2: 如果子函数参数(eventType)不等于reportActivatedEvents,stopResponseOnEvent, startResponseOnEvent, ClearResponseOnEvent,则该参数强制出现;
C3: 如果服务请求需要附加服务参数去应答服务时,则出现该参数;
2.2 请求报文中子函数参数定义说明
ResponseOnEvent请求报文中使用子函数参数(eventType)来指定要在服务端中需要配置的事件,并去控制ResponseOnEvent的设置。每个子函数参数值在下表中给出,同时也指定了适用eventTypeRecord的长度(suppressPosRspMsgIndicationBit (bit 7)在下表中未显示)。eventType子函数参数的第6位用于表明事件是否应存储在服务端的非易失性存储器中,并在服务器下次上电时重新激活,或者是否应在服务器下电时终止(storageState参数)。
Bit6 值 | 描述 | 约定 |
---|---|---|
0x00 | doNotStoreEvent 该值表示当服务器掉电时事件将终止,并且服务器在复位或上电后(即ResponseOnEvent服务终止)将不再继续ResponseOnEvent诊断服务 | M |
0x01 | storeEvent 该值表示: 1) 在默认会话中,一旦ROE启动或停止请求,事件应该根据ROE Service是否被重启,来决定是否重启或停止发送serviceToRespondTo-responses 2) 对于任何ROE设置事件逻辑的请求,所请求的事件逻辑应被持久存储,直到事件逻辑被显式清除(通过clearResponseOnEvent),或者事件逻辑被相同类别的新ROE设置事件逻辑请求所覆盖。 | U |
请求报文中子函数参数(eventType)具体含义的定义:
Bit5-0值 | 描述 | 约定 | 类型 |
---|---|---|---|
0x00 | stopResponseOnEvent 该值用来停止发送事件的响应消息,被设置的事件逻辑不能被清除,但可以用startResponseOnEvent子函数参数去重启; Length of eventTypeRecord: 0 字节 | U | control |
0x01 | onDTCStatusChange 该值表示将该事件标记为检测一个新DTC,其与指定事件的DTCStatusMask相匹配; Length of eventTypeRecord: 1 字节 实现提示:服务端中resident DTC的计数算法在一定周期(如1秒)内,计算出满足客户端DTCStatusMask定义的故障码数量。如果计数与上一个执行过程中的计数不同,客户端应该产生引起serviceToRespondTo执行的事件; eventType需要在请求报文中(eventTypeParameter#1)指定DTCStatusMask; | U | setup |
0x02 | onTimerInterrupt 该值将事件标记为计时器的中断,但计时器及其值并非是事件响应服务的一部分; 该eventType在请求报文(eventTypeRecord)中需要更多细节的具体定义; Length of eventTypeRecord: 1 byte; | U | setup |
0x03 | onChangeOfDataIdentifier 该值将事件标记为由数据标识符定义的内部数据记录。该数据值由汽车制造厂商定义。 该eventType在请求报文(eventTypeRecord)中需要指定更多的细节; Length of eventTypeRecord: 2 byte; | U | setup |
0x04 | reportActivatedEvents 该值被用来表示在肯定响应中采用事件响应服务(并且当前激活的),来汇报所有在服务端激活的事件, Length of eventTypeRecord: 0 bytes | U | control |
0x05 | startResponseOnEvent 该值用于表示服务器要去激活已设置的事件逻辑(包括事件窗口计时器),并开始发送对事件的响应。 Length of eventTypeRecord: 0 byte. | M | control |
0x06 | clearResponseOnEvent 该值用于清除在服务端设置的事件逻辑(这让服务端停止发送对事件的响应) Length of eventTypeRecord: 0 byte | U | control |
0x07 | onComparisonOfValues 修改由数据标识符(DID)标识的数据值,该DID标记了一个数据值事件。有了这一子功能,当在一个已定义的测量值比较中收集到指定结果发生时,用户有能力去定义一个事件。在数据记录中所包含的指定测量值,这条数据记录会分配给定义好的数据标识符(DID),拿指定测量值与给定值进行比较。指定的运算符会定义了二者比较的类型。如果比较结果为正,则发生该事件; Length of eventTypeRecord: 10 bytes | U | setup |
0x08 - 0x1F | ISOSAEReserved ISO保留 | M | - |
0x20 - 0x2F | VehicleManufacturerSpecific 汽车制造厂商预留 | U | setup |
0x30 - 0x3E | SystemSupplierSpecific 供应商预留值 | U | setup |
0x3F | ISOSAEReserved ISO保留 | M | - |
请求报文中对子函数参数onTimerInterrup的具体细节说明:
使用子函数onTimerInterrup,在定时器可配置的时间中,服务端允许触发型的事件。
eventTypeRecord使用了以下定时器计划来定义计时器的值:
——Slow rate,慢速;
——Medium rate,中速;
——Fast rate,快速;
定义每个计时器计划选项相关的时间速率,是整车制造厂商的任务。具体见下表:
eventTypeRecord | Event will be generated | Timer type |
---|---|---|
0x01 | 每次慢速计时器值失效时 | 慢速计时器,如计时器每过去1秒 |
0x02 | 每次中速计时器值失效时 | 中速计时器,如计时器每过去300ms |
0x03 | 每次快速计时器值失效时 | 快速计时器,如计时器每过去25ms |
请求报文中对子函数参数onChangeOfDataIdentifier的具体细节说明:
使用子函数onChangeOfDataIdentifier,服务端允许在定长的时间内去调查测量结果并且比较内容,因此服务端可能会丢失一些变化并且触发比预期更少的时间,这是可以接受的。
eventTypeRecord设置了两个字节大小的DID,来监测任何的变化。
请求报文中对子函数参数onComparisonOfValues的具体细节说明:
下表定义了子函数参数为onComparisonOfValues的详细定义,如果serviceToRespondToRecord指定了在读取DID之间作比较。
字节序号 | 参数名称 | 字节值 | Comment | 具体细节 |
---|---|---|---|---|
#1 | ServiceID | 0x86 | Request SID | — |
#2 | eventType | 0x07 | sub-function onComparisonOfValues | — |
#3 | eventWindowTime | 0x02 | InfiniteTimeWindow specification | — |
#4 | eventTypeRecord byte1 | 0x01 | DataIdentifier (DID) high byte | — |
#5 | eventTypeRecord byte2 | 0x04 | DataIdentifier (DID) low byte | — |
#6 | eventTypeRecord byte3 | 0x01 | 比较逻辑,见下表 | eventTypeRecord Byte# 3设置了比较方法的逻辑 |
#7 | eventTypeRecord byte4 | 0x00 | 原始比较值MSB | eventTypeRecord Byte# 4, Byte# 5, Byte# 6, Byte# 7设置了比较的参考值 |
#8 | eventTypeRecord byte5 | 0x00 | 原始比较值 | — |
#9 | eventTypeRecord byte6 | 0x01 | 原始比较值 | — |
#10 | eventTypeRecord byte7 | 0x00 | 原始比较值LSB | — |
#11 | eventTypeRecord byte8 | 0x0A | hysteresis value | eventTypeRecord Byte# 8定义了从0%到100%的histeresys value |
#12 | eventTypeRecord byte9 | 0xBC | Localization byte 1 MSB, 见下表 | eventTypeRecord Byte# 9, Byte# 10定了值在数据标识符中的位置,见下表 |
#13 | eventTypeRecord byte10 | 0x58 | Localization byte 2 LSB, 见下表 | — |
#14 | serviceToRespondTo byte 1 | 0x22 | SID | serviceToRespondToRecord设置了服务,需要读取及比较的DID。在第一个肯定应答报文中numberOfIdentifiedEvents的区域总是设置为0x00 |
#15 | serviceToRespondTo byte 2 | 0xA1 | DID1 | — |
#16 | serviceToRespondTo byte 3 | 0x00 | DID2 | — |
比较逻辑参数(comparison logic)的定义:
Comparison logic ID | Event will be generated when |
---|---|
0x01 | 比较值 < 测量值 |
0x02 | 比较值 > 测量值 |
0x03 | 比较值 = 测量值 |
0x04 | 比较值 <> 测量值 |
值位置(localization of value)16位 位域的定义:
Bitfield bit position | 描述 |
---|---|
15 | (MSB), bit = 0 表示无符号比较, bit = 1 有符号比较 |
14 - 10 | 第10位(LSB) -第14位(MSB)包含了将要比较的数据标识符的值的长度。值0x00用于比较所有的4个字节,其他值都以位为单位去设置大小。14-10有5个位,因此最大长度为31。 |
9 - 0 | 肯定应答报文的偏移量,从中提取DID的值;Bit#0(LSB) - Bit#9 (MSB)包含了数字偏移量的起始位,10个位,表示的最大偏移为1023。 |
2.3 请求报文数据参数定义
定义 |
---|
eventWindowTime eventWindowTime参数用于指定在服务端被激活事件逻辑的窗口。如果eventWindowTime的参数值被设置为0x02,那么响应时间是无限的。如果事件窗口无限,storageState = doNotStoreEvent,建议通过一个具体的信号关闭事件窗口(如下电); 有限事件窗口与storageState = storeEvent的组合,不能使用; 注意:如果eventType = ROE control subfunction,该参数不适用于服务端来评估。 |
eventTypeRecord 该参数记录包含了指定事件类型的附加参数; |
serviceToRespondToRecord 该参数记录包含了每次发生eventTypeRecord中定义的指定事件时,需要被执行的服务参数(如ID,service parameters) ; |
3、肯定应答报文
3.1 肯定应答报文定义
所有子函数参数的肯定应答报文格式(除了subFunction = reportActivatedEvents)定义如下:
字节序号 | 参数名称 | 约定 | 字节值 |
---|---|---|---|
#1 | ResponseOnEvent Response SID | M | 0xC6 |
#2 | eventType | M | 0x00 - 0x7F |
#3 | numberOfIdentifiedEvents | M | 0x00 - 0x7F |
#4 | eventWindowTime | M | 0x00 - 0x7F |
#5 . . #(m-1)+5 | eventTypeRecord[] = [ eventTypeParameter 1 . . eventTypeParameter m ] | C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord[] = [ serviceId serviceParameter 1 . . serviceParameter r ] | M C2 . . C2 | 0x00 – 0xFF 0x00 – 0xFF . . 0x00 – 0xFF |
C1: 如果eventType需要指定附加参数去响应事件,则出现该参数;
C2: 如果服务的请求将要去应答需要附加服务参数,则出现该参数;
子函数参数subFunction = reportActivatedEvents的肯定应答报文格式定义如下:
字节序号 | 参数名称 | 约定 | 字节值 |
---|---|---|---|
#1 | ResponseOnEvent Response SID | M | 0xC6 |
#2 | eventType = reportActivatedEvents | M | 0x04 |
#3 | numberOfActivatedEvents | M | 0x00 - 0xFF |
#4 | eventTypeOfActiveEvent#1 | C1 | 0x00 - 0xFF |
#5 | eventWindowTime#1 | C1 | 0x00 - 0xFF |
#6 . . #(m-1)+6 | eventTypeRecord#1[] = [ eventTypeParameter 1 . . eventTypeParameter m ] | C2 | 0x00 – 0xFF . . 0x00 – 0xFF |
#p-(o-1)-1 #p-(o-1) . . #p | serviceToRespondToRecord#1[] = [ serviceId serviceParameter 1 . . serviceParameter o ] ] | C3 C4 . . C4 | 0x00 – 0xFF 0x00 – 0xFF . . 0x00 – 0xFF |
#5 . . #(m-1)+5 | eventTypeRecord[] = [ eventTypeParameter 1 . . eventTypeParameter m ] | C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
. . | . . | . . | . . |
#n-(r-1)-4-(q-1) | eventTypeOfActiveEvent#k | C1 | 0x00 – 0xFF |
#n-(r-1)-3-(q-1) | eventWindowTime#k | C1 | 0x00 – 0xFF |
#n-(r-1)-2-(q-1) . . #n-(r-1)-2 | eventTypeRecord#k[] = [ eventTypeParameter 1 . . eventTypeParameter q ] | C2 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(r-1)-1 #n-(r-1) . . #n | serviceToRespondToRecord#k[] =[ serviceId serviceParameter 1 . . serviceParameter r ] ] | C3 C4 . . C4 | 0x00 – 0xFF 0x00 – 0xFF . . 0x00 – 0xFF |
C1: 如果激活的事件被汇报时,则出现该参数;
C2: 如果激活事件的汇报事件类型(eventTypeOfActiveEvent)为响应指定事件需要附加参数时,则出现该参数;
C3: 当汇报激活事件时,则强制出现该参数;
C4: 如果服务的请求将要去应答需要附加服务参数,则出现该参数;
3.2 肯定应答报文数据参数定义
Definition |
---|
eventType 请求报文中子函数参数值中的bit 6 - 0。 |
eventTypeOfActiveEvent 请求报文中子函数中为了设置激活事件的参数,应用值为子函数参数eventType指定的一类值。 |
numberOfActivatedEvents 当客户端请求汇报激活事件的数量时,该参数包含了所激活事件的数量,事件的数量会在应答报文中汇报。 |
numberOfIdentifiedEvents 此参数包含在激活的事件窗口中已识别的事件数量,并且仅适用于在事件窗口结束时发送的响应消息(如果是有限事件窗口)。对请求报文的初始化响应,在此参数中应该包含一个零(0)。 |
eventTypeRecord 来自于请求报文中eventTypeRecord参数,当汇报激活事件时,此参数是为设置激活事件请求中eventTypeRecord的回显; |
serviceToRespondToRecord 来自于请求报文serviceToRespondToRecord中的参数,当汇报一个激活的事件时,此参数是为设置激活事件请求消息serviceToRespondToRecord的回显。 |
4、支持的否定应答码(NRC_)
本服务应执行以下否定响应代码。下表记录了每个应答代码发生的情况,如果服务器在错误场景使用了该服务,则应使用如下列出的否定响应。
NRC | 描述 |
---|---|
0x12 | sub-functionNotSupported 子函数参数不支持时,会发送该NRC |
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC |
0x22 | conditionsNotCorrect 当服务器处于关键的正常模式活动时,并且因此无法运行请求功能时,会发送该NRC |
0x31 | requestOutOfRange 如果eventTypeRecord parameter参数中有错误,指定的eventWindowTime时间无效,请求的DID不支持,以及有限窗口与storageState = storeEvent的组合,都会发送该NRC |
5、0x86服务(事件响应服务)案例说明
5.1 假设
案例中假设了eventWindowTime = 0x08,定义了事件窗口为80s(eventWindowTime * 10 seconds)。通过设置suppressPosRspMsgIndicationBit (bit 7 of the sub-function parameter) 为 FALSE,客户端请求应答报文。
注意:eventWindowTime的定义由车辆制造厂商指定,除了在下表中被指定的eventWindowTime的参数值。
Byte Value | Description | Cvt |
---|---|---|
0x00 - 0x01 | ISOSAEReserved ISO保留 | M |
0x02 | infiniteTimeToResponse 该参数值指定了事件窗口应该保持激活无限时间(例如,打开窗口一直到熄火) | U |
0x03 - 0x7F | vehicleManufacturerSpecific 该范围的参数值为车辆制造厂商保留使用,eventWindowTime参数的精度由车辆制造厂商自行定义 | U |
0x80 - 0xFF | ISOSAEReserved ISO保留 | M |
以下条件适用于0x86服务的使用案例:
——Trigger signal:
定义具体的触发信号,可以触发客户端(如外部测试设备,OBD单元,诊断主机)来开始0x86服务ResponseOnEvent请求报文。这个触发信号可以通过一个事件或者就像一个heartbeat-time的固定时间(应该比eventWindowTime要大)。而且在数据链路层应该有一个同步消息(如同步信号)作为触发信号。
——Open event window:
一旦接收0x86服务ResponseOnEvent请求报文,服务端应该去评估。如果评估有效,服务端应该设置事件逻辑,必须发送初始的肯定应答报文。为了激活事件逻辑,客户端应该请求子函数参数为startResponseOnEvent。在肯定应答之后,事件逻辑被激活,并且事件窗口计时器正在运行。详细地去定义事件窗口的一些参数,由车辆制造厂商去指定使用eventWindowTime参数(如计时窗口,点火开/关窗口)。如果检测到指定的eventType (EART_),服务端必须立即响应与ResponseOnEvent请求中的serviceToRespondToRecord相对应的响应消息。
——Close event window:
推荐根据参数eventWindowTime来关闭服务端的事件窗口。关闭事件窗口之后,服务端应该停止发送可以驱动诊断应答报文的事件。同样可以通过发送ResponseOnEvent (ROE_)请求消息(包括参数stopResponseOnEvent)或关闭电源来实现。
5.2 ResponseOnEvent使用案例
例1:ResponseOnEvent (finite event window)
下表定义了ResponseOnEvent请求报文的设置:
事件响应服务的请求报文使用案例1如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = onDTCStatusChange, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x01 |
#3 | eventWindowTime = 80 seconds | 0x08 |
#4 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#5 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#6 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#7 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
事件响应服务案例1初始的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0xC6 |
#2 | eventTypeRecord [ eventType ] = onDTCStatusChange | 0x01 |
#3 | numberOfIdentifiedEvents = 0 | 0x00 |
#4 | eventWindowTime = 80 seconds | 0x08 |
#5 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#6 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#7 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#8 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
事件逻辑被设置;现在事件必须要被激活。
下表定义了ROE请求报文的启动。事件响应服务的请求报文使用案例如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = startResponseOnEvent, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x05 |
#3 | eventWindowTime (will not be evaluated) | 0x08 |
事件响应服务的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0xC6 |
#2 | eventType = onDTCStatusChange | 0x01 |
#3 | numberOfIdentifiedEvents = 0 | 0x00 |
#4 | eventWindowTime | 0x08 |
如果发生指定的事件,服务端应该能够根据指定serviceToRespondToRecord去发送应答报文。
0x19服务ReadDTCInformation的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadDTCInformation Response SID | 0x59 |
#2 | DTCStatusAvailibilityMask | 0xFF |
#3 | DTCCount [ DTCCountHighByte ] = 0 | 0x00 |
#4 | DTCCount [ DTCCountLowByte ] = 4 | 0x04 |
客户端在激活事件窗口期间请求报告服务端中当前活动事件情况的消息流如下所示。
ResponseOnEvent请求激活事件的数量
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadDTCInformation Response SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = reportActivatedEvents, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x04 |
#3 | eventWindowTime (will not be evaluated) | 0x08 |
ResponseOnEvent reportActivatedEvents的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Response SID | 0xC6 |
#2 | eventType = reportActivatedEvents | 0x04 |
#3 | numberOfActivatedEvents = 1 | 0x01 |
#4 | eventTypeOfActiveEvent = onDTCStatusChange | 0x01 |
#5 | eventWindowTime = 80 seconds | 0x08 |
#6 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#7 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#8 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#9 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
如果指定的事件窗口时间超时了,服务端应该发送最终的肯定应答报文。
ResponseOnEvent最终的肯定应答报文定义如下:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Response SID | 0xC6 |
#2 | eventType = onDTCStatusChange | 0x01 |
#3 | numberOfIdentifiedEvents = 1 | 0x01 |
#4 | eventWindowTime = 80 seconds | 0x08 |
#5 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#6 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#7 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#8 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
Example #1 - flowcharts
如下所示的流程图展示了两种不同的服务端行为:
—— 在有限事件窗口内不发生任何事件。在这种情况下,服务器必须在事件窗口的末尾发送ResponseOnEvent的响应。
—— 有限事件窗口内的多个事件(#1到#n)。serviceToRespondTo的每个肯定应答都与一个已识别的事件(#1…#n)相关,并且应该具有相同的服务标识符(SId),但可能具有不同的内容。在event_Window结束时,服务器将发送responseOnEvent服务的肯定应答报文,该报文表示numberOfIdentifiedEvents。
下图展示了有限事件窗口— 在激活事件窗口中无事件。
下图展示了有限事件窗口— 在激活事件窗口中有多个事件。
例2:ResponseOnEvent (infinite event window)
事件响应服务的请求报文使用案例2如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = onDTCStatusChange, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x01 |
#3 | eventWindowTime = infinite | 0x02 |
#4 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#5 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#6 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#7 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
事件响应服务案例2初始的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0xC6 |
#2 | eventTypeRecord [ eventType ] = onDTCStatusChange | 0x01 |
#3 | numberOfIdentifiedEvents = 0 | 0x00 |
#4 | eventWindowTime = infinite | 0x02 |
#5 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#6 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#7 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#8 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
事件逻辑被设置;现在事件必须要被激活。
下表定义了案例2 ROE请求报文的启动。案例2 事件响应服务的请求报文使用案例如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = startResponseOnEvent, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x05 |
#3 | eventWindowTime (will not be evaluated) | 0x02 |
案例2 事件响应服务的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0xC6 |
#2 | eventType = onDTCStatusChange | 0x05 |
#3 | numberOfIdentifiedEvents = 0 | 0x00 |
#4 | eventWindowTime | 0x02 |
如果发生指定的事件,服务端应该能够根据指定serviceToRespondToRecord去发送应答报文。
案例2中0x19服务ReadDTCInformation的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadDTCInformation Response SID | 0x59 |
#2 | DTCStatusAvailibilityMask | 0xXX |
#3 | DTCCount [ DTCCountHighByte ] = 0 | 0x00 |
#4 | DTCCount [ DTCCountLowByte ] = 4 | 0x04 |
客户端在激活事件窗口期间请求报告服务端中当前活动事件情况的消息流如下所示。
ResponseOnEvent请求激活事件的数量
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadDTCInformation Response SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = reportActivatedEvents, storageState = doNotStoreEvent suppressPosRspMsgIndicationBit = FALSE | 0x04 |
#3 | eventWindowTime (will not be evaluated) | 0x08 |
ResponseOnEvent reportActivatedEvents的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Response SID | 0xC6 |
#2 | eventType = reportActivatedEvents | 0x04 |
#3 | numberOfActivatedEvents = 1 | 0x01 |
#4 | eventTypeOfActiveEvent = onDTCStatusChange | 0x01 |
#5 | eventWindowTime = 80 seconds | 0x08 |
#6 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#7 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#8 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#9 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
如果指定的事件窗口时间超时了,服务端应该发送最终的肯定应答报文。
ResponseOnEvent最终的肯定应答报文定义如下:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Response SID | 0xC6 |
#2 | eventType = onDTCStatusChange | 0x01 |
#3 | numberOfIdentifiedEvents = 1 | 0x01 |
#4 | eventWindowTime = 80 seconds | 0x08 |
#5 | eventTypeRecord [ eventTypeParameter ] = testFailed status | 0x01 |
#6 | serviceToRespondToRecord [ serviceId ] = ReadDTCInformation | 0x19 |
#7 | serviceToRespondToRecord [ sub-function ] = reportNumberOfDTCByStatusMask | 0x01 |
#8 | serviceToRespondToRecord [ DTCStatusMask ] = testFailed status | 0x01 |
Example #2 - flowcharts
如下所示的流程图展示了两种不同的服务端行为:
—— 在无限事件窗口内不发生任何事件。
—— 无限事件窗口内的多个事件(#1到#n)。serviceToRespondTo的每个肯定应答都与一个已识别的事件(#1…#n)相关,并且应该具有相同的服务标识符(SId),但可能具有不同的内容。
下图展示了无限事件窗口— 在激活事件窗口中无事件的情况。
下图展示了无限事件窗口— 在激活事件窗口中有多个事件的情况。
例3:ResponseOnEvent (infinite event window) – sub-function parameter “onComparisonOfValues”
这个例子只解释了子函数参数“onComparisonOfValues”的用法,假设案例1和案例2中描述的ROE服务的通信行为没有改变。因此,此示例没有描述完整的消息流。相反,事件窗口设置请求消息和对发生事件的肯定应答报文将被展示和解释。开始和停止请求报文以及不同的响应消息已经在上面的例子中描述了,以下条件适用:
—— 0x22服务-根据标识符读取数据服务(ReadDataByIdentifier),被挑选为serviceToRespondTo;
—— 0x0104数据标识符包含了测量值,这个测量值需要在数据字节#11和#12中被比较;
—— 如果测量值(MV)大于所谓的比较参数(comparison parameter - CP),那么操作符值(operator)则变为0x01 - “MV > CP”;
—— hysteresis value 0x0A - 设置为10%;
—— eventWindowTime值设置为0x02,表示“infinite”;
—— storageState (eventType sub-function bit 6)设置为1,表示“storeEvent”;
—— 在任何情况下,应答都是需要的;
案例的定义:
—— Byte#4&5: dataIdentifier 0x0104
—— Byte#6&7: 读取的位置和读取类型的定义
例1 如果读取数据记录的第11个字节,适用于以下情况:
—— 11 * 8 = 88(dec) = 00 0101 1000(binary) Bit#10 - Bit#14: length in bits - 1.
—— 使用5 bits,最多可表示32bits = “long”
例2 对于"word",长度为15(dec) = = 0 1111(binary),Bit#15: Sign entry: 1=signed, 0=unsigned;
例3 Total assignment would be:
—— 1011 1100 0101 1000b= 0xBC58,因此 byte#6 contains 0xBC, byte#7 contains 0x58
—— Byte#8,比较运算符(operator);
例4 操作符MV > CP = 0x01:
—— Byte#9-12:比较参数由于占四个字节,所有数据类型都可以从’Bit’ 到’Long’类型转换;
例5 如果比较值是5242(dec) = 0x0000 147A:
—— byte#9 = 0x00, byte#10 = 0x00, byte#11 = 0x14 and byte#12 = 0x7A
—— Byte#13: Hysteresis value (指定比较参数的百分比). It only applies to 只有在操作符(operators)为 “<” 和 ">"时,才能应用。 为了防止0作为比较参数值,hysteresis value应该被定义为绝对值。
例6 Hysteresis value 10% = 0x0A。
案例3中,事件响应服务的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ResponseOnEvent Request SID | 0x86 |
#2 | eventTypeRecord [ eventType ] = onComparisonOfValues, storageState = StoreEvent suppressPosRspMsgIndicationBit = FALSE | 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 ] = Comparison Parameter (Byte#4) | 0x00 |
#10 | eventTypeRecord [ eventTypeParameter#7 ] = Comparison Parameter (Byte#3) | 0x00 |
#11 | eventTypeRecord [ eventTypeParameter#7 ] = Comparison Parameter (Byte#2) | 0x14 |
#12 | eventTypeRecord [ eventTypeParameter#7 ] = Comparison Parameter (Byte#1) | 0x7A |
#13 | eventTypeRecord [ eventTypeParameter#10 ] = Hysteresis [%] | 0x0A |
#14 | serviceToRespondToRecord [ serviceID ] = ReadDataByIdentifier | 0x22 |
#15 | serviceToRespondToRecord [ serviceParameter#1 ] = dataIdentifier (MSB) | 0x01 |
#16 | serviceToRespondToRecord [ serviceParameter#2 ] = dataIdentifier (LSB) | 0x04 |
注意: 响应消息和后续的初始化序列没有显示。
事件窗口成功设置以及ROE机制被激活后,如果测量值大于5242(dec),服务端中指定的事件会发生,如下报文也会被发送:
案例3中0x22服务(根据标识符读取数据服务)的肯定应答报文定义如下:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadDataByIdentifier Response SID | 0x62 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0x01 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x04 |
#4 | dataRecord [ data#1 ] | 0xXX |
#5 | dataRecord [ data#2 ] | 0xXX |
#6 | dataRecord [ data#3 ] | 0xXX |
#7 | dataRecord [ data#4 ] | 0xXX |
#8 | dataRecord [ data#5 ] | 0xXX |
#9 | dataRecord [ data#6 ] | 0xXX |
#10 | dataRecord [ data#7 ] | 0xXX |
#11 | dataRecord [ data#8 ] | 0xXX |
#12 | dataRecord [ data#9 ] | 0xXX |
#13 | dataRecord [ data#10 ] | 0xXX |
#14 | dataRecord [ data#11 data content of byte#11: 0x14 ] | 0x14 |
#15 | dataRecord [ data#12 data content of byte#12: 0x7B ] | 0x7B |
另一个事件发生在测量值至少一次低于比较参数值的90%之前。这种行为由hysteresis value指定。如果满足此条件,并且测量值再次高于比较值,则会发生新的事件,服务端将会发送新的ReadDataByIdentifier应答报文。