目录
1、0x24服务(根据标识符读取缩写信息服务)
Service description:
0x24服务(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)允许客户端从服务端请求DID的缩写信息。
客户端请求报文中包含了一个dataIdentifier(DID)值,用于标识服务端中维护的数据记录。数据记录(dataRecord)的格式和定义应该由汽车制造厂商来指定,可包括一些模拟输入和输出信号、数字输入和输出信号、内部的数据和系统状态信息(如果服务端支持)。
在接收到0x24服务(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的请求后,服务端应该访问与指定dataIdentifier(DID)参数有关的缩写信息,并在肯定应答报文中去传输这些缩写信息值。
2、请求报文格式
2.1 请求报文定义
请求报文的定义:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | ReadScalingDataByIdentifier Request SID | M | 0x24 |
#2 #3 | dataIdentifier[] = [ byte#1 (MSB) byte#2 ] | M M | 0x00 – 0xFF 0x00 – 0xFF |
2.2 请求报文中子函数参数定义
该服务未使用子函数参数。
2.3 请求报文中数据参数定义
该服务在请求报文中的数据参数定义如下表所示:
定义 |
---|
DataIdentifier 该参数标识了客户端正在请求服务端的数据记录,即DID。 |
3、肯定应答报文
3.1 肯定应答报文格式定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | ReadScalingDataByIdentifier Response SID | M | 0x64 |
#2 #3 | dataIdentifier[] =[ byte#1 (MSB) byte#2 (LSB) ] | M M | 0x00 – 0xFF 0x00 – 0xFF |
#4 | scalingByte#1 | M | 0x00 – 0xFF |
#5 . . #(p-1)+5 | scalingByteExtension[]#1 = [ scalingByteExtensionParameter#1 . . scalingByteExtensionParameter#p ] ] | C1 . . C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
. . | . . | . . | . . |
#n-r | scalingByte#k | C2 | 0x00 – 0xFF |
#n-(r-1) . . #n | scalingByteExtension[]#k = [ scalingByteExtensionParameter#1 . . scalingByteExtensionParameter#r ] | C1 . . C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
C1:该参数的存在取决于scalingByte的high nibble。如果scalingByte high nibble被编码为公式、单位/格式或bitmappedreporttedwithoutmask,则必须存在。
C2:此参数的存在取决于缩写信息的编码是否需要超过一个字节。
3.2 肯定应答报文数据参数定义
Definition |
---|
dataIdentifier 请求报文中的DID。 |
scalingByte (#1 to #k) 0x24服务(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)肯定应答报文中提供给客户端的换算数据记录值。 |
scalingByteExtension (#1 to #p / #1 to #r) high nibble被编码为公式、单位/格式或bitmappedreporttedwithoutmask,为scalingByte提供额外信息 |
其中,参数scalingByte (SBYT)由一个字节(high和low nibble)组成。scalingByte high nibble定义了用于表示数据标识符(DID)的数据类型。scalingByte low nibble定义了在数据流中用于表示参数的字节数。
scalingByte (High Nibble)的定义如下表:
High Nibble编码 | 数据类型描述 | 约定 |
---|---|---|
0x0 | unSignedNumeric (1 to 4 bytes) 这种编码使用一种通用的二进制加权方案,通过离散增量步来表示一个值。一个字节表示256步;两个字节产生65536个步骤,等等。 | U |
0x1 | signedNumeric (1 to 4 bytes) 这种编码使用二补二进制加权方案,通过离散增量步来表示一个值。一个字节表示256步;两个字节产生65536个步骤,等等。 | U |
0x2 | bitMappedReportedWithOutMask 位映射编码使用单个位或小组位来表示状态。有效掩码用于指示特定应用中每个位的有效性。bitmappedreporttedwithoutmask编码表示有效掩码不是参数定义本身的一部分。 | U |
0x3 | bitMappedReportedWithMask 位映射编码使用单个位或小组位来表示状态。bitmappedreporttedwithmask编码表示有效掩码包含在参数定义本身中。对于每个表示状态的位,需要一个相应的掩码位作为参数定义的一部分。掩码表示特定应用中每个比特的有效性。这种类型的位映射参数为表示数据的每个状态字节包含一个有效掩码字节。由于有效性掩码是参数定义的一部分,因此不需要单独的scalingByteExtension。 | U |
0x4 | BinaryCodedDecimal 传统的二进制编码十进制编码用于表示每个字节的两个数字。upper nibble用来表示最高有效数字(0 -9),lower nibble用来表示最低有效数字(0 -9)。 | U |
0x5 | stateEncodedVariable (1 byte) 这种编码使用二进制加权方案来表示多达256种不同的状态。一个例子是参数,它表示点火开关的状态。代码“00”、“01”、“02”和“03”分别表示点火关闭、锁定、运行和启动。这种表示总是被限制为一个字节。 | U |
0x6 | ASCII (1 to 15 bytes for each scalingByte) 传统的ASCII编码用于表示多达128个标准字符,MSB =逻辑’0’。另外128个自定义字符可以用MSB =逻辑’1’表示。 | U |
0x7 | signedFloatingPoint 浮点编码用于需要用浮点或科学记数法表示的数据。标准IEEE格式应根据ANSI/IEEE标准754-1985使用。 | U |
0x8 | packet 数据包包含多个数据值,通常是相关的,每个值都有惟一的缩放。不包括各个值的缩放信息。 | U |
0x9 | formula 使用公式从原始数据计算一个值。公式标识符在定义公式标识符编码的表中指定。 | U |
0xA | unit/format 这些单位和格式用于以更加用户友好的格式表示数据。单位标识符和格式标识符在定义formulaIdentifier编码的表中指定。 如果使用组合单位和/或格式,例如mV,则每个单位/格式的scalingByte(和scalingData)应包含在readScalingDataByIdentifier的正响应中。 | U |
0xB | stateAndConnectionType (1 byte) 这种编码特别用于输入和输出信号。编码在数据字节中的信息指定了高级物理布局、电平和功能状态。建议对数字输入和输出参数使用此选项。 | U |
0xC - 0xF | ISOSAEReserved ISO保留 | M |
scalingByte (Low Nibble)的定义如下表:
Low Nibble编码 | 数据类型描述 | 约定 |
---|---|---|
0x0 – 0xF | numberOfBytesOfParameter 此值范围由数据流中引用的参数标识符的数据字节数指定。参数的长度由缩放字节 scaling byte(s) 定义,其前面总是有一个参数标识符(一个或多个字节)。如果参数标识符后面有多个缩放字节,则参数标识符引用的数据长度是缩放字节中low nibbles内容的总和。 如VIN是由一个单字节参数标识符和后跟两个缩放字节来标识的。长度最多计算为17个数据字节。两个low nibbles的内容可以是任何值的组合,加起来最多17个数据字节。 对于以公式或单位/格式编码的high nibble的scalingByte,该值为0x0。 | U |
4、支持的否定应答码(NRC_)
本服务应实施如下否定响应代码,下表记录了每个应答代码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应代码。
NRC | 描述 |
---|---|
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC |
0x22 | conditionsNotCorrect 服务端的运行条件不满足去执行请求的动作时,会发送该NRC |
0x31 | requestOutOfRange 如下情况发送该NRC: — 请求的DID值不被设备所支持; — 请求的DID值被设备所支持,但是没有指定标识符(dataIdentifier,DID)换算信息; |
0x33 | SecurityAccessDenied DID是保密的,并且服务端处于上锁状态,会发送该NRC |
0x24服务(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的否定应答码(NRC)具体处理过程如下图所示:
5、0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)案例说明
Assumptions:
如下案例中,假定运行0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的条件都满足,客户端可以在任何时候请求与服务端状态无关的数据标识符(DID)的换算数据。
案例1读取了两个字节的0xF190 DID的换算信息,其包含了17个字符的VIN数字。
案例2展示了在服务器中指定的数据变量,如何使用公式和单元标识符。
案例3展示了第三个示例演示了如何使用readScalingDataByIdentifier返回位映射的数据标识符支持的位(有效掩码),该数据标识符通过使用readDataByIdenditfier报告时没有掩码。
例1:readScalingDataByIdentifier wth dataIdentifier 0xF190 (VIN number)
案例1 0x24(ReadScalingDataByIdentifier,根据标识符读取换算信息服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadScalingDataByIdentifier Request SID | 0x24 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0xF1 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x90 |
案例1 0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Response SID | 0x64 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0xF1 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x90 |
#4 | scalingByte#1 {ASCII, 15 data bytes} | 0x6F |
#5 | scalingByte#2 {ASCII, 2 data bytes} | 0x62 |
例2:readScalingDataByIdentifier wth dataIdentifier 0x0105 (Vehicle Speed)
案例2 0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadScalingDataByIdentifier Request SID | 0x24 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0x01 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x05 |
案例2 0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadScalingDataByIdentifier Response SID | 0x64 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0x01 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x05 |
#4 | scalingByte#1 {unsigned numeric, 1 data byte} | 0x01 |
#5 | scalingByte#2 {formula, 5 data bytes} | 0x95 |
#6 | scalingByteExtension#2 [ byte#1 ] {formulaIdentifier = C0 * x + C1} | 0x00 |
#7 | scalingByteExtension#2 [ byte#2 ] {C0 high byte} | 0xE0 |
#8 | scalingByteExtension#2 [ byte#3 ] {C0 low byte} [ C0 = 75 * 10P-2P ] | 0x4B |
#9 | scalingByteExtension#2 [ byte#4 ] {C1 high byte} | 0x00 |
#10 | scalingByteExtension#2 [ byte#5 ] {C1 low byte} [ C1 = 30 * 10P0P ] | 0x1E |
#11 | scalingByte#3 {unit / format, 1 data byte} | 0xA1 |
#12 | scalingByteExtension#3 [ byte#1 ] {unit ID, km/h} | 0x30 |
单位,车速数据变量采用下式计算:
Vehicle Speed = (0.75 * x + 30) km/h.
例3:readScalingDataByIdentifier wth dataIdentifier 0x0967
这个案例展示了客户端如何确定服务端中的数据标识符支持哪些位,该数据标识符被格式化为无有效掩码的位映射记录。案例中,dataIdentifier (0x0967)定义如下:
字节 | Bit(s) | 描述 |
---|---|---|
#1 | 7-4 3 2 1 0 | Unusued 命令打开中速风扇 检测到中速风扇输出故障 Purge monitor soak time status flag Purge monitor idle test is prevented due to refuel event |
#1 | 7 6 5 4 3 2 1 0 | 检查燃油盖指示灯是否已亮起 检查油盖灯输出是否有故障 A模式风扇控制输出故障 B模式风扇控制输出故障 高速风扇输出故障检测 命令高速风扇输出 Purge monitor idle test (small leak) ready to run Purge monitor small leak has been monitored |
案例3 0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadScalingDataByIdentifier Request SID | 0x24 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0x09 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x67 |
案例3 0x24(ReadScalingDataByIdentifier,根据标识符读取缩写信息服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadScalingDataByIdentifier Response SID | 0x64 |
#2 | dataIdentifier [ byte#1 ] (MSB) | 0x09 |
#3 | dataIdentifier [ byte#2 ] (LSB) | 0x67 |
#4 | scalingByte#1 {bitMappedReportedWithOutMask, 2 data bytes} | 0x22 |
#5 | scalingByteExtension#1 [ byte#1 ] {dataRecord#1 Validity Mask} | 0x03 |
#6 | scalingByteExtension#1 [ byte#2 ] {dataRecord#2 Validity Mask} | 0x43 |
上面的示例假设服务器中该dataIdentifier支持的唯一位(即包含信息的位)是字节#1、位1和位0,以及字节#2、位6、位1和位0。