【ISO14229_UDS_0x2C服务详解】

1、0x2C服务(DynamicallyDefineDataIdentifier,动态定义数据标识符服务)

  Service description:
  0x2C服务(DynamicallyDefineDataIdentifier,动态定义数据标识符服务)允许客户端在服务端动态地定义一个数据标识符(DID),在之后一段时间内可以通过0x22服务(ReadDataByIdentifier,读取数据标识符服务)读取。
  该服务的目的是为客户端提供将一个或多个数据元素分组到一个数据超集的能力,该超集可以通过0x22服务(ReadDataByIdentifier,读取数据标识符服务)或 0x2A服务(ReadDataByPeriodicIdentifer,根据周期数据标识符读取数据)进行请求。要分组的数据元素可以参考如下:
  ——一个源数据标识符,一个position和size
  ——一个内存地址和一个内存长度
  ——上面列出的两种方法的组合,并使用多个请求定义单个数据元素。然后,动态定义的数据标识符将包含一连串的数据参数定义。
  在处理诊断应用程序的临时数据需求,该服务有更大的灵活性,这些数据需求超出了通过静态定义数据标识符读取的信息。该服务可以通过避免与频繁请求/响应任务相关的开销损失,来降低带宽使用率。
  动态定义数据标识符可以通过一条请求报文或者多个请求报文来完成。这允许引用源标识符和内存地址的单个数据元素。服务端必须连接单个数据元素的定义。动态定义的数据标识符的重新定义可以通过清除当前定义并重新使用新定义来实现。当多个DynamicallyDefineDataIdentifier请求报文用于配置单个数据标识符,并且服务端在该数据标识符的后续请求期间检测到最大字节数的溢出(例如,周期性数据标识符的定义),那么服务端将保留数据标识符的定义,因为它在请求之前会导致溢出。
  尽管此服务不禁止此类功能,但不建议客户端从一个动态定义的数据记录中引用另一个动态定义的数据记录,因为删除被引用的记录可能会在引用记录中产生数据一致性问题。
  此服务提供了清除现有动态定义数据记录的功能。如果指定的数据记录标识符在服务端支持的有效动态数据标识符范围内,则对清除数据记录的请求报文作出肯定应答。服务端应该保持动态定义数据记录直到其被删除或者是车辆制造厂商指定的条件(如会话切换时删除或者服务端下电时删除)。
  服务端可以用两种不同的方式实现数据记录:
  ——包含不单独引用的多个元素数据记录的组合数据记录;
  ——唯一的2字节标识“tag”或数据标识符(DID)值,用于服务端中支持的单个元素数据记录(例如元素数据记录,或DID,是发动机转速或进气温度)。数据记录的实现是复合数据记录实现的一个子集,因为它只引用单个元素数据记录,而不是包含多个元素数据记录的数据记录。
  ——DynamicallyDefineDataIdentifier服务支持以上两种实现数据记录的方法来定义动态的数据标识符。复合数据块:position参数必须引用复合数据块中的起始点,size参数必须反映要放在动态定义的数据标识符中的数据的长度。测试人员有责任在动态数据记录中不只包括复合数据块的基本数据记录的一部分。
  ——2字节DID: position参数必须设置为1,size参数必须反映DID的长度(元素数据记录的长度)。测试人员负责在动态数据记录中不只包括2字节DID值的一部分。动态定义数据记录内的数据顺序应与客户端请求消息中指定的顺序相同。此外,客户请求中指定的数据的第一个位置应根据前句所述的排序要求,使其最靠近动态数据记录的开始位置。
  除了通过逻辑引用(记录数据标识符)定义动态数据标识符之外,此服务还提供了通过绝对内存地址和内存长度信息定义动态定义数据标识符的功能。建议仅在服务端的开发阶段使用这种定义动态数据标识符的机制。

2、请求报文格式

2.1 请求报文定义

  sub-function = defineByIdentifier的请求报文定义:

字节序号参数值约定字节值
#1DynamicallyDefineDataIdentifier Request SIDM0x2C
#2sub-function = [
       definitionType = defineByIdentifier ]
M0x01

#3
#4
dynamicallyDefinedDataIdentifier[] = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

M
M

0xF2/0xF3
0x00 - 0xFF

#5
#6
sourceDataIdentifier[]#1 = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

M
M

0x00 - 0xFF
0x00 - 0xFF
#7positionInSourceDataRecord#1M0x00 - 0xFF
#8memorySize#1M0x00 - 0xFF
.
.
.
.
.
.
.
.

#n-3
#n-2
sourceDataIdentifier[]#m = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

U
U

0x00 - 0xFF
0x00 - 0xFF
#n-1positionInSourceDataRecord#mU0x01 - 0xFF
#nmemorySize#mU0x00 - 0xFF

  sub-function = defineByMemoryAddress的请求报文定义:

字节序号参数值约定字节值
#1DynamicallyDefineDataIdentifier Request SIDM0x2C
#2sub-function = [
       definitionType = defineByMemoryAddress ]
M0x02

#3
#4
dynamicallyDefinedDataIdentifier[] = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

M
M

0xF2/0xF3
0x00 - 0xFF
#5addressAndLengthFormatIdentifierM10x00 - 0xFF

#6
.
.
#(m-1)+6
memoryAddress[] = [
                 byte#1 (MSB)
                 .
                 .
                 byte#m ]

M
.
.
C1

0x00 - 0xFF
.
.
0x00 - 0xFF

#m+6
.
.
#(m+6)+(k-1)
memorySize[] = [
                 byte#1 (MSB)
                 .
                 .
                 byte#k ]

M
.
.
C2

0x00 - 0xFF
.
.
0x00 - 0xFF
.
.
.
.
.
.
.
.

#n-k-(m-1)
.
.
#n-k
memoryAddress[] = [
                 byte#1 (MSB)
                 .
                 .
                 byte#m ]

M
.
.
C1

0x00 - 0xFF
.
.
0x00 - 0xFF

#n-(k-1)
.
.
#n
memorySize[] = [
                 byte#1 (MSB)
                 .
                 .
                 byte#k ]

U
.
.
U/C2

0x00 - 0xFF
.
.
0x00 - 0xFF

  M1:addressAndLengthFormatIdentifier参数只在请求消息的开头出现一次,它定义了整个请求消息中每个内存位置引用的地址长度和长度信息。
  C1:该参数的存在取决于addressAndLengthFormatIdentifier的地址长度信息参数。
  C2:该参数的存在取决于addressAndLengthFormatIdentifier的内存大小长度信息。

  sub-function = clearDynamicallyDefinedDataIdentifier的请求报文定义:

字节序号参数值约定字节值
#1DynamicallyDefineDataIdentifier Request SIDM0x2C
#2sub-function = [
       definitionType = clearDynamicallyDefinedDataIdentifier ]
M0x03

#3
#4
dynamicallyDefinedDataIdentifier[] = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

C
C

0xF2/0xF3
0x00 - 0xFF

  C:这个参数的存在要求服务端清除包含在字节#1和字节#2中的动态定义数据标识符。如果该参数不存在,服务端中的所有dynamallydefineddataidentifier都将被清除。

2.2 请求报文中子函数参数定义

  子函数参数定义如下表:

字节值描述约定
0x00ISOSAEReserved
ISO保留
M
0x01defineByIdentifier
该值用于向服务端指定动态数据标识符的定义应通过引用数据标识符发生。
U
0x02defineByMemoryAddress
该值用于向服务端指定动态数据标识符的定义应通过引用地址发生。
U
0x03clearDynamicallyDefinedDataIdentifier
该值用于清除指定的动态数据标识符。请注意,服务端应该正响应来自客户端的明确请求,即使在请求时指定的动态数据标识符不存在。但是,指定的动态数据标识符必须在有效范围内。如果在请求时正在周期报告的动态数据标识符,则应首先停止动态标识符,然后清除。
U
0x04-0x7FISOSAEReserved
ISO保留
M
          

2.3 请求报文中数据参数定义

  该服务在请求报文中的数据参数定义如下表所示:

定义
dynamicallyDefinedDataIdentifier
该参数指定客户端定义的动态数据记录将如何在将来调用ReadDataByIdentifier或ReadDataByPeriodicDataIdentifier服务时被引用。动态定义的数据标识符应该在ReadDataByIdentifier服务中作为数据标识符(DID)来处理。它应该在ReadDataByPeriodicDataIdentifier服务中作为一个periodicRecordIdentifier来处理(请参阅ReadDataByPeriodicDataIdentifier服务,了解该参数值的要求,以便能够定期请求动态定义的数据标识符)。
sourceDataIdentifier
此参数仅在sub-function = defineByIdentifier中出现。此参数在逻辑上指定了要包含在动态数据记录中的信息源。例如,可用于表示发动机转速的2字节DID,或者一个用于表示包含发动机转速、车速、进气温度等信息的复合块的2字节DID。
positionInSourceDataRecord
此参数仅在sub-function = defineByIdentifier中出现。这个1字节的参数指定了包含在动态数据记录中源数据记录的摘录起始字节位置。1位置应该表示由sourceDataIdentifier引用的数据记录的第一个字节。
addressAndLengthFormatIdentifier
该参数是一个单独编码的单字节值:
bit 7 - 4: memorySize参数的长度(字节数);
bit 3 - 0: memoryAddress参数的长度(字节数);
memoryAddress
此参数仅在sub-function = defineByMemoryAddress中出现。此参数指定了包含在动态数据记录中的信息的内存源地址。用于此地址的字节数由addressAndLengthFormatIdentifier的低位(Bit3 - 0)定义。memoryAddress参数中的字节#m始终是服务端中引用的地址中最低位字节。地址的最高位字节可用作内存标识符。
memorySize
该参数用于指定要包含在动态数据记录中的源数据记录/内存地址的总字节数。
在sub-function = defineByIdentifier的情况下,此外,还使用positionInSourceDataRecord参数指定源数据标识符中memorySize应用的起始位置。用于此大小的字节数是一个字节。
在sub-function = defineByMemoryAddress的情况下,这个参数反映了从指定的memoryAddress开始的动态定义的数据标识符中要包含的字节数。用于此大小的字节数由addressAndLengthFormatIdentifier的高位(位7 - 4)定义。

3、肯定应答报文

3.1 肯定应答报文格式定义

  肯定应答报文的定义见下表。

字节序号参数值约定字节值
#1DynamicallyDefineDataIdentifier Response SIDM0x6C
#2sub-function = [ definitionType ]M0x00 - 0x7F

#3
#4
dynamicallyDefinedDataIdentifier[] = [
                 byte#1 (MSB)
                 byte#2 (LSB) ]

C
C

0xF2/0xF3
0x00 - 0xFF

  C:如果请求消息中存在dynamallydefineddataidentifier参数,则需要此参数的存在,否则将不包含该参数。

3.2 肯定应答报文数据参数定义

  肯定应答报文中报文数据参数的定义见下表:

Definition
definitionType
请求报文中子函数中的bit6-0。
dynamicallyDefinedDataIdentifier
请求报文中数据参数dynamicallyDefinedDataIdentifier。

4、支持的否定应答码(NRC_)

  本服务应实施如下否定响应代码,下表记录了每个应答代码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应代码。

NRC描述
0x12sub-functionNotSupported
子函数参数不支持,会发送该NRC
0x13incorrectMessageLengthOrInvalidFormat
请求报文长度不正确,会发送该NRC
0x22conditionsNotCorrect
服务端的运行条件不满足去执行请求的动作时,会发送该NRC。
0x31requestOutOfRange
如下情况发送该NRC:
— 请求报文中任意一个数据标识符不支持或者无效时;
— positionInSourceDataRecord参数不正确(小于1,或者超出最大值);
— 请求报文中任意的内存地址在服务端中不支持时;
— 指定的内存尺寸无效时;
— 动态数据标识符中打包的数据总量超出了服务端所允许的最大值;
— 指定的addressAndLengthFormatIdentifier无效;
— 动态定义的periodicDataIdentifier的总长度超过了用于传输周期性响应消息的数据链路的单个帧所能容纳的最大长度;
0x33SecurityAccessDenied
如下情况发送该NRC:
— 请求报文中任何的数据标识符(动态定义数据标识符或者源数据标识符)是保密的,而服务端处理处于未解锁状态;
— 请求报文中任何的内存地址是保密的,而服务端处理处于未解锁状态;

5、0x2C服务(DynamicallyDefineDataIdentifier,动态定义数据标识符服务)案例说明

  Assumptions:
  假设如下案例中0x2C服务的前提条件都是满足的。
  在第一个案例中,服务端支持两个字节的DID,其表示单个数据信息。该案例中使用defineByIdentifier方法构建一个动态数据标识符,然后发送一个ReadDataByIdentifier请求来读取刚刚配置的动态数据标识符。
  在第二个案例中,服务端支持数据标识符,它引用了包含多个数据信息的复合数据块。该案例也使用defineByIdentifier方法构建一个动态标识符,并发送一个ReadDataByIdentifier请求来读取刚刚定义的数据标识符。
  第三个案例使用defineByMemoryAddress方法构建动态数据标识符,并发送ReadDataByIdentifier请求来读取刚刚定义的数据标识符。
  在第四个案例中,服务端支持数据标识符,它引用包含多个数据信息的复合数据块。该示例使用defineByIdentifier方法构建动态数据标识符,然后使用ReadDataByPeriodicIdentifier服务请求服务器定期发送动态定义的数据标识符。
  第五个案例中演示了如何删除动态定义的数据标识符。
  下表将用于下面的例子。在真实车辆上,报告的值可能会随着时间的推移而变化,但为了清晰起见,将其显示为常数。
  复合数据块-数据标识符定义

数据标识符(Block)数据字节数据记录内容字节值
0x010A#1
#2
#3
#4
#5
#6
#7
#8
#9
#10
#11
#12
dataRecord [ data#1 ] = B+
dataRecord [ data#2 ] = ECT
dataRecord [ data#3 ] = TP
dataRecord [ data#4 ] = RPM
dataRecord [ data#5 ] = RPM
dataRecord [ data#6 ] = MAP
dataRecord [ data#7 ] = MAF
dataRecord [ data#8 ] = VSS
dataRecord [ data#9 ] = BARO
dataRecord [ data#10 ] = LOAD
dataRecord [ data#11 ] = IAC
dataRecord [ data#12 ] = APP
0x8C
0xA6
0x66
0x07
0x50
0x20
0x1A
0x00
0x63
0x4A
0x82
0x7E
0x050B#1
#2
dataRecord [ data#1 ] = SPARKADV
dataRecord [ data#2 ] = KS
0x00
0x91

  元素数据记录 - DID定义

数据标识符(Block)数据字节数据记录内容字节值
0x1234#1
#2
EOT (MSB)
EOT (LSB)
0x4C
0x36
0x5678#1AAT0x4D
0x9ABC#1
#2
#3
#4
EOL (MSB)
EOL
EOL
EOL(LSB)
0x49
0x21
0x00
0x17

  内存数据记录 - 内存地址定义

内存地址数据字节数据记录内容字节值
0x21091968#1
#2
#3
#4
#5
#6
#7
#8
#9
#10
#11
#12
dataRecord [ data#1 ] = B+
dataRecord [ data#2 ] = ECT
dataRecord [ data#3 ] = TP
dataRecord [ data#4 ] = RPM
dataRecord [ data#5 ] = RPM
dataRecord [ data#6 ] = MAP
dataRecord [ data#7 ] = MAF
dataRecord [ data#8 ] = VSS
dataRecord [ data#9 ] = BARO
dataRecord [ data#10 ] = LOAD
dataRecord [ data#11 ] = IAC
dataRecord [ data#12 ] = APP
0x8C
0xA6
0x66
0x07
0x50
0x20
0x1A
0x00
0x63
0x4A
0x82
0x7E
0x13101994#1
#2
dataRecord [ data#1 ] = SPARKADV
dataRecord [ data#2 ] = KS
0x00
0x91

  Example #1: DynamicallyDefineDataIdentifier, sub-function = defineByIdentifier
  下表中案例将会使用2个字节的DID作为所需数据的参考,来搭建动态数据标识符(DDDI 0xF301),其包含了发动机油温,环境空气温度,和发动机油液等级。
  DynamicallyDefineDataIdentifier请求DDDDI 0xF301消息流案例 #1
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#5
#6
sourceDataIdentifier#1 [ byte#1 ] (MSB) - Engine Oil Temperature
sourceDataIdentifier#1 [ byte#2 ]
0x12
0x34
#7positionInSourceDataRecord#10x01
#8memorySize#10x02
#9
#10
sourceDataIdentifier#2 [ byte#1 ] (MSB) - Ambient Air Temperature
sourceDataIdentifier#2 [ byte#2 ]
0x56
0x78
#11positionInSourceDataRecord#20x01
#12memorySize#20x01
#13
#14
sourceDataIdentifier#3 [ byte#1 ] (MSB) - Engine Oil Level
sourceDataIdentifier#3 [ byte#2 ]
0x9A
0xBC
#15positionInSourceDataRecord#30x01
#16memorySize#30x04

  下表定义了动态定义数据标识符DDDDI 0xF301的消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2sub-function = defineByIdentifier0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  下表定义了使用了0x22服务请求DDDDI 0xF301的消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x22
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  下表定义了使用了0x22服务请求DDDDI 0xF301的肯定应答报文消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x62
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#4
#5
#6
#7
#8
#9
#10
dataRecord [ data#1 ] = EOT
dataRecord [ data#2 ] = EOT
dataRecord [ data#3 ] = AAT
dataRecord [ data#4 ] = EOL
dataRecord [ data#5 ] = EOL
dataRecord [ data#6 ] = EOL
dataRecord [ data#7 ] = EOL
0x4C
0x36
0x4D
0x49
0x21
0x00
0x17

  Example #2: DynamicallyDefineDataIdentifier, sub-function = defineByIdentifier
  下表中案例搭建了动态数据标识符(DDDI 0xF302),其包含了发动机冷却液温度(来源于数据记录0x010A),发动机转速(来源于数据记录0x010A),IAC曲轴销位(来源于数据记录0x010A)和爆震传感器(来源于数据记录0x050B)。
  DynamicallyDefineDataIdentifier请求DDDDI 0xF302消息流案例 #2
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x02
#5
#6
sourceDataIdentifier#1 [ byte#1 ] (MSB)
sourceDataIdentifier#1 [ byte#2 ] (LSB)
0x01
0x0A
#7positionInSourceDataRecord#1- Engine Coolant Temperature0x02
#8memorySize#10x01
#9
#10
sourceDataIdentifier#2 [ byte#1 ] (MSB)
sourceDataIdentifier#2 [ byte#2 ] (LSB)
0x01
0x0A
#11positionInSourceDataRecord#2 - Engine Speed0x04
#12memorySize#20x02
#13
#14
sourceDataIdentifier#3 [ byte#1 ] (MSB)
sourceDataIdentifier#3 [ byte#2 ] (LSB)
0x01
0x0A
#15positionInSourceDataRecord#3 – Idle Air Control0x0B
#16memorySize#30x01
#17
#18
sourceDataIdentifier#4 [ byte#1 ] (MSB)
sourceDataIdentifier#4 [ byte#2 ] (LSB)
0x05
0x0B
#19positionInSourceDataRecord#3 – Idle Air Control0x02
#20memorySize#40x01

  下表定义了动态定义数据标识符DDDDI 0xF302的消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2sub-function = defineByIdentifier0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x02

  下表定义了使用了0x22服务请求DDDDI 0xF302的消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x22
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x02

  下表定义了使用了0x22服务请求DDDDI 0xF302的肯定应答报文消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x62
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x02
#4
#5
#6
#7
#8
dataRecord [ data#1 ] = ECT
dataRecord [ data#2 ] = RPM
dataRecord [ data#3 ] = RPM
dataRecord [ data#4 ] = IAC
dataRecord [ data#5 ] = KS
0xA6
0x07
0x50
0x82
0x91

  Example #3: DynamicallyDefineDataIdentifier, sub-function = defineByMemoryAddress
  下表中案例搭建了动态数据标识符(DDDI 0xF303),其包含了发动机冷却液温度(来源于起始地址为0x21091969的内存块),发动机转速(来源于起始地址为0x2109196B的内存块),和爆震传感器(来源于起始地址为0x13101995的内存块)。
  DynamicallyDefineDataIdentifier请求DDDDI 0xF302消息流案例 #3
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByMemoryAddress,
              suppressPosRspMsgIndicationBit = FALSE
0x02
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x02
#5addressAndLengthFormatIdentifier0x14
#6
#7
#8
#9
memoryAddress#1 [ byte#1 ] (MSB) - Engine Coolant Temperature
memoryAddress#1 [ byte#2 ]
memoryAddress#1 [ byte#3 ]
memoryAddress#1 [ byte#4 ]
0x21
0x09
0x19
0x69
#10memorySize#10x01
#11
#12
#13
#14
memoryAddress#2 [ byte#1 ] (MSB)- Engine Speed
memoryAddress#2 [ byte#2 ]
memoryAddress#2 [ byte#3 ]
memoryAddress#2 [ byte#4 ]
0x21
0x09
0x19
0x6B
#15memorySize#20x02
#16
#17
#18
#19
memoryAddress#3 [ byte#1 ] (MSB) - Knock Sensor
memoryAddress#3 [ byte#2 ]
memoryAddress#3 [ byte#3 ]
memoryAddress#3 [ byte#4 ]
0x13
0x10
0x19
0x35
#20memorySize#30x01

  下表定义了动态定义数据标识符DDDDI 0xF302的消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = defineByMemoryAddress0x02
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x02

  下表定义了使用了0x22服务请求DDDDI 0xF302的消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x22
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x02

  下表定义了使用了0x22服务请求DDDDI 0xF302的肯定应答报文消息流案例

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x62
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x02
#4
#5
#6
#7
dataRecord [ data#1 ] = ECT
dataRecord [ data#2 ] = RPM
dataRecord [ data#3 ] = RPM
dataRecord [ data#5 ] = KS
0xA6
0x07
0x50
0x91

  Example #4: DynamicallyDefineDataIdentifier, sub-function = defineByIdentifier
  下表中案例搭建了动态数据标识符(DDDI 0xF2E7),其包含了发动机冷却液温度(来源于0x101A),发动机转速(来源于0x101A),和爆震传感器(来源于0x050B)。
  动态数据标识符的值是从可用于周期请求数据的范围中选择的。根据动态数据标识符的定义,客户端请求定期(快速)发送数据标识符。
  DynamicallyDefineDataIdentifier请求DDDDI 0xF2E7消息流案例 #4
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF2
0xE7
#5
#6
sourceDataIdentifier#1 [ byte#1 ] (MSB)
sourceDataIdentifier#1 [ byte#2 ] (LSB)
0x01
0x0A
#7positionInSourceDataRecord#1- Engine Coolant Temperature0x02
#8memorySize#10x01
#9
#10
sourceDataIdentifier#2 [ byte#1 ] (MSB)
sourceDataIdentifier#2 [ byte#2 ] (LSB)
0x01
0x0A
#11positionInSourceDataRecord#2 - Engine Speed0x04
#12memorySize#20x02
#13
#14
sourceDataIdentifier#3 [ byte#1 ] (MSB)
sourceDataIdentifier#3 [ byte#2 ] (LSB)
0x05
0x0B
#15positionInSourceDataRecord#3- Knock Sensor0x02
#16memorySize#30x01

  下表定义了动态定义数据标识符DDDDI 0xF2E7的消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = defineByIdentifier0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF2
0xE7

  下表定义了使用了0x2A服务请求DDDDI 0xF2E7的消息流案例

数据字节描述字节值
#1ReadDataByPeriodicIdentifier Request SID0x2A
#2transmissionMode = sendAtFastRate0x04
#3PeriodicDataIdentifier0xE7

  下表定义了使用了0x2A服务请求DDDDI 0xF2E7初始的肯定应答报文消息流案例

数据字节描述字节值
#1ReadDataByPeriodicIdentifier Response SID0x6A

  下面两个表定义了ReadDataByPeriodicIdentifier周期数据响应#1 DDDDI 0xF2E7消息流示例#4。

数据字节描述字节值
#1PeriodicDataIdentifier0xE7
#2
#3
#4
#5
dataRecord [ data#1 ] = ECT
dataRecord [ data#2 ] = RPM
dataRecord [ data#3 ] = RPM
dataRecord [ data#4 ] = KS
0xA6
0x07
0x50
0x91

  ReadDataByPeriodicIdentifier周期数据响应#n DDDDI 0xF2E7消息流示例#4。

数据字节描述字节值
#1PeriodicDataIdentifier0xE7
#2
#3
#4
#5
dataRecord [ data#1 ] = ECT
dataRecord [ data#2 ] = RPM
dataRecord [ data#3 ] = RPM
dataRecord [ data#4 ] = KS
0xA6
0x07
0x55
0x98

  Example #5: DynamicallyDefineDataIdentifier, sub-function = clearDynamicallyDefined-DataIdentifier
  下表中示例演示了清除动态定义数据标识符,并假设DDDDI 0xF303在请求时存在。
  DynamicallyDefineDataIdentifier请求清除DDDDI 0xF303消息流案例 #5
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = clearDynamicallyDefinedDataIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x03
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x03

  下表定义了清除动态定义数据标识符DDDDI 0xF303消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = clearDynamicallyDefinedDataIdentifier0x03
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x03

  Example #6: DynamicallyDefineDataIdentifier, concatenation of definitions (defineByIdentifier / defineByAddress)
  下表中案例使用两种定义类型搭建了动态数据标识符(DDDI 0xF301),下面的列表显示了动态定义的数据标识符中的数据顺序(定义动态数据标识符请求消息的隐式顺序):
  —— 第一部分:2个字节DID表示发动机油液温度和环境空气温度;
  —— 第二部分:内存地址表示的发动机冷却液温度和发送机转速;
  —— 第三部分:2个字节DID表示发动机油液等级;
  Step #1: DynamicallyDefineDataIdentifier, sub-function = defineByIdentifier (1 st portion)
  下表定义了第一部分DynamicallyDefineDataIdentifier请求DDDI 0xF301的报文消息流案例#6,由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#5
#6
sourceDataIdentifier#1 [ byte#1 ] (MSB) - Engine Oil Temperature
sourceDataIdentifier#1 [ byte#2 ] (LSB)
0x12
0x34
#7positionInSourceDataRecord#10x01
#8memorySize#10x02
#9
#10
sourceDataIdentifier#2 [ byte#1 ] (MSB) - Ambient Air Temperature
sourceDataIdentifier#2 [ byte#2 ] (LSB)
0x56
0x78
#11positionInSourceDataRecord#20x01
#12memorySize#20x01

  下表定义了动态定义数据标识符DDDDI 0xF301消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = defineByIdentifier0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  Step #2: DynamicallyDefineDataIdentifier, sub-function = defineByMemoryAddress (2nd portion)
  下表定义了第二部分(defineByMemoryAddress) DynamicallyDefineDataIdentifier请求DDDI 0xF301的报文消息流案例#6,由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByMemoryAddress,
              suppressPosRspMsgIndicationBit = FALSE
0x02
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#5addressAndLengthFormatIdentifier0x14
#6
#7
#8
#9
memoryAddress#1 [ byte#1 ] (MSB) - Engine Coolant Temperature
memoryAddress#1 [ byte#2 ]
memoryAddress#1 [ byte#3 ]
memoryAddress#1 [ byte#4 ]
0x21
0x09
0x19
0x69
#10memorySize#10x01
#11
#12
#13
#14
memoryAddress#2 [ byte#1 ] (MSB) - Engine Speed
memoryAddress#2 [ byte#2 ]
memoryAddress#2 [ byte#3 ]
memoryAddress#2 [ byte#4 ]
0x21
0x09
0x19
0x69
#12memorySize#20x02

  下表定义了动态定义数据标识符DDDDI 0xF301消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = defineByMemoryAddress0x02
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  Step #3: DynamicallyDefineDataIdentifier, sub-function = defineByIdentifier (3 rd portion)
  下表定义了第三部分(defineByIdentifier) DynamicallyDefineDataIdentifier请求DDDI 0xF301的报文消息流案例#6,由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = defineByIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#5
#6
sourceDataIdentifier#1 [ byte#1 ] (MSB) - Engine Oil Level
sourceDataIdentifier#1 [ byte#2 ] (LSB)
0x9A
0xBC
#7positionInSourceDataRecord#10x01
#8memorySize#10x04

  下表定义了动态定义数据标识符DDDDI 0xF301消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = defineByIdentifier0x01
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  Step #4:ReadDataByIdentifier - dataIdentifier = DDDDI 0xF301
  下表定义了0x22服务(ReadDataByIdentifier)请求DDDDI 0xF301的消息报文流

数据字节描述字节值
#1ReadDataByIdentifier Request SID0x22
#2
#3
dataIdentifier [ byte#1 ] (MSB)
dataIdentifier [ byte#2 ] (LSB)
0xF3
0x01
#4
#5
#6
#7
#8
#9
#10
#11
#12
#13
dataRecord [ data#1 ] = EOT(MSB)
dataRecord [ data#2 ] = EOT
dataRecord [ data#3 ] = AAT
dataRecord [ data#4 ] = ECT
dataRecord [ data#5 ] = RPM
dataRecord [ data#6 ] = RPM
dataRecord [ data#7 ] = EOT(MSB)
dataRecord [ data#8 ] = EOL
dataRecord [ data#9 ] = EOL
dataRecord [ data#10 ] = EOL
0x4C
0x36
0x4D
0xA6
0x07
0x50
0x49
0x21
0x00
0x17

  Step #5:DynamicallyDefineDataIdentifier - clear definition of DDDDI 0xF301
  DynamicallyDefineDataIdentifier请求清除DDDDI 0xF301消息流案例 #6
  请求报文由客户端发向服务端(ECU):

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x2C
#2sub-function = clearDynamicallyDefinedDataIdentifier,
              suppressPosRspMsgIndicationBit = FALSE
0x03
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

  下表定义了清除动态定义数据标识符DDDDI 0xF301消息流的肯定应答,应答报文由服务端发向客户端:

数据字节描述字节值
#1DynamicallyDefineDataIdentifier Request SID0x6C
#2definitionMode = clearDynamicallyDefinedDataIdentifier0x03
#3
#4
dynamicallyDefinedDataIdentifier [ byte#1 ] (MSB)
dynamicallyDefinedDataIdentifier [ byte#2 ] (LSB)
0xF3
0x01

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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iso-14229是一项用于汽车电子系统通信的协议,其全称为ISO14229 Unified Diagnostic Services(UDS)on Controller Area Network(CAN)。该协议旨在为车辆的诊断、维护和修复提供标准化的方法。ISO 14229定义了诊断服务和通信的标准化消息格式,包括诊断数据、错误码、故障清除等,以使不同车辆的系统实现得到统一和互操作性。 ISO14229 UDS协议栈是用于实现ISO 14229诊断协议的软件组件。该协议栈的实现可分为物理层和软件层两个部分,其中物理层是指使用CAN总线对车辆的执行单元进行通信,而软件层则是指实现ISO 14229标准的协议堆栈。该协议栈具有标准化、可重用和可配置的特点,可在不同的客户平台上使用。 ISO 14229的文档是对该协议的规范和说明,包括协议的基本架构、消息格式、错误码表、会话层和传输层的细节等。该文档是实现ISO 14229协议的必要依据,可用于开发UDS协议栈的开发人员和车辆诊断工程师。 源码.zip则是UDS协议栈的实现源代码,包括物理层和软件层代码。开发人员可根据该源码了解UDS协议栈的实现细节和技术实现,并根据需求进行二次开发。 综上所述,ISO-14229_14229_UDS协议栈_UDS-ISO-14229_ISO14229文档_ISO 14229_源码.zip等组件,是用于实现汽车电子系统诊断的标准化协议,可为车辆的维护和修复提供规范的方法。开发人员和车辆诊断工程师可根据这些组件进行UDS协议栈的开发和实现。 ### 回答2: ISO-14229是用于诊断汽车电子控制单元(ECU)的标准协议。该协议旨在提供一种标准化的方法,让技术人员可以使用相同的工具和流程诊断不同制造商的汽车。 14229 UDS是该标准的通信协议栈。UDS指协议栈中定义的通用诊断服务,该服务可用于访问ECU的内部数据和状态。ISO14229文档提供了UDS协议栈的详细规范,以及相关的数据格式和命令集合。 此外,文档和源代码可以帮助工程师实现符合ISO-14229标准的诊断工具或ECU,提高汽车诊断系统的质量和效率。源码.zip则是UDS协议栈的代码包。 总之,ISO-14229标准和UDS协议栈提供了一种标准化的、可靠的汽车诊断协议。它们有助于提高汽车技术人员的工作效率,同时减少汽车诊断工具和软件的开发成本。 ### 回答3: ISO-14229是一种用于汽车电子系统的通讯协议。它定义了诊断通信的规范和协议,允许车辆厂商和供应商使用这些规范和协议来开发和测试车载电子控制单元。其中,UDS协议栈是实现ISO-14229的关键技术之一,能够为客户端提供远程访问ECEs的可能性。 ISO-14229规定了接口:UDS(Unified Diagnostic Service),用于与电子控制单元(ECU)之间进行通讯。 UDS协议栈则实现了UDS协议的接口,可以自动进行诊断和测试,发生故障时还能产生错误报告。 相应地, ISO14229文档描述了在ISO14229-1文档中定义的UDS协议的特定应用,与ISO15765-2的特定要求相结合。 它还包括了EVITA Light文档中的安全方面。 源码.zip文件则包含了UDS协议栈的源代码,可以在开发与应用中使用,实现对汽车电子控制单元的简便对话操作。 总之,ISO-14229及其UDS协议栈实现了车载控制电子单元的标准化通讯,可简化车辆诊断和维护过程,提高效率和可靠性。同时,相应的规范、文档和源代码也为相关人员提供了方便和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值