目录
1、0x23服务(根据地址读取内存服务)
Service description:
0x23服务(ReadMemoryByAddress,根据地址读取内存服务)允许客户端从服务端通过起始地址和内存大小空间来读取指定内存的数据。
0x23服务(ReadMemoryByAddress,根据地址读取内存服务)请求报文中包含了两个参数memoryAddress和memorySize,其定义了内存的相关信息,可以用于请求读取内存数据。用于表示内存地址(memoryAddress)和内存大小(memorySize)参数的字节数在地址长度格式标识符(addressAndLengthFormatIdentifier)来定义。
一个固定地址长度格式标识符(addressAndLengthFormatIdentifier),在memoryAddress 或者 memorySize参数中高地址范围未使用到的字节用0x00去填充。
如果内存区域有重叠,则使用附加内存地址字节作为内存标识符(如内部和外部闪存的使用)。
服务端通过ReadMemoryByAddress的肯定应答报文来发送数据记录值。数据记录(dataRecord)参数的格式和定义由车辆制造厂商来定义。如果服务端支持,数据记录(dataRecord)参数会包含模拟输入输出信号量,数字输入输出信号量,内部数据和系统状态信息等参数。
2、请求报文格式
2.1 请求报文定义
请求报文的定义:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | ReadMemoryByAddress Request SID | M | 0x23 |
#2 | addressAndLengthFormatIdentifier | M | 0x00 - 0xFF |
#3 . . #(m-1)+3 | memoryAddress[] = [ byte#1 (MSB) . . byte#m ] | M . . C1 | 0x00 – 0xFF . . 0x00 – 0xFF |
#n-(k-1) . . #n | memorySize[] = [ byte#1 (MSB) . . byte#k ] | M . . C2 | 0x00 – 0xFF . . 0x00 – 0xFF |
C1:该参数的出现取决于地址和长度格式标识符(addressAndLengthFormatIdentifier)参数中地址长度信息;
C2:该参数的出现取决于地址和长度格式标识符(addressAndLengthFormatIdentifier)参数中内存大小长度信息;
2.2 请求报文中子函数参数定义
该服务未使用子函数参数。
2.3 请求报文中数据参数定义
该服务在请求报文中的数据参数定义如下表所示:
定义 |
---|
addressAndLengthFormatIdentifier 该参数是单独编码的字节值: bit 7 - 4:内存大小(memorySize)参数的长度(字节数量) bit 3 - 0:内存地址(memoryAddress)参数的长度(字节数量) |
memoryAddress 内存地址(memoryAddress)参数是所获取数据内存的起始地址。用于表示地址的字节数量在地址和长度格式标识符(addressAndLengthFormatIdentifier)参数的bit 0 - 3定义。Byte#m是内存地址(memoryAddress)参数中最低有效字节(least significant byte,LSB)。地址的最高有效字节(most significant byte,LSB)可以用作于内存标识符。 使用内存标识符的一个示例是具有16位寻址和内存地址重叠的双处理器服务器(当给定的地址对任一处理器都有效,但产生不同的物理内存设备或使用内部和外部闪存时)。在这种情况下,可以将memoryAddress参数中未使用的字节指定为用于选择所需内存设备的内存标识符。此功能的使用应由车辆制造商/系统供应商定义。 |
memorySize ReadMemoryByAddress请求报文中memorySize参数指定了需要读取的字节数,这些字节数从服务端内存中由内存地址(memoryAddress)指定的地址开始。用于表示内存大小的字节数量在地址和长度格式标识符(addressAndLengthFormatIdentifier)参数中的bit 7 - 4中定义。 |
3、肯定应答报文
3.1 肯定应答报文格式定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | ReadMemoryByAddress Response SID | M | 0x63 |
#2 . . #n | dataRecord[] = [ data#1 . . data#m ] | M . . U | 0x00 – 0xFF . . 0x00 – 0xFF |
3.2 肯定应答报文数据参数定义
Definition |
---|
dataRecord 该参数用于ReadMemoryByAddress服务肯定应答报文中,以提供给客户端请求的数据记录(dataRecord)值。数据记录(dataRecord)的内容没有在文档中定义,但应该反应请求的内容值。数据格式应该由车辆制造厂商/系统供应商来定义。 |
4、支持的否定应答码(NRC_)
本服务应实施如下否定响应代码,下表记录了每个应答代码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应代码。
NRC | 描述 |
---|---|
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC |
0x22 | conditionsNotCorrect 服务端的运行条件不满足去执行请求的动作时,会发送该NRC |
0x31 | requestOutOfRange 如下情况发送该NRC: — 在[0xMA, (0xMA + 0xMS -0x1)]区间内的任何内存地址都是无效的; — 在[0xMA, (0xMA + 0xMS -0x1)]区间内的任何内存地址被限制了; — 请求报文中内存大小(memorySize)参数服务端不支持时; — 指定的地址和长度格式标识符(addressAndLengthFormatIdentifier)参数无效; — 请求报文中内存大小(memorySize)参数值为0; |
0x33 | SecurityAccessDenied 在[0xMA, (0xMA + 0xMS - 0x1)]区间内的任何内存地址都是保密的并且服务端被锁住,会发送该NRC |
0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的否定应答码(NRC)具体处理过程如下图所示:
5、0x23服务(ReadMemoryByAddress,根据地址读取内存服务)案例说明
Assumptions:
如下案例中,假定运行0x23服务(ReadMemoryByAddress)的条件都满足,该案例中的服务不会被服务端中任何约束条件限制。
例1:ReadMemoryByAddress - 4-byte (32-bit) addressing
客户端从服务端内存起始地址为0x2048 1392位置处读取了259个数据字节。
案例1 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Request SID | 0x23 |
#2 | addressAndLengthFormatIdentifier | 0x24 |
#3 | memoryAddress [ byte#1 ] (MSB) | 0x20 |
#4 | memoryAddress [ byte#2 ] | 0x48 |
#5 | memoryAddress [ byte#3 ] | 0x13 |
#6 | memoryAddress [ byte#4 ] | 0x92 |
#7 | memorySize [ byte#1 ] (MSB) | 0x01 |
#8 | memorySize [ byte#2 ] | 0x03 |
案例1 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Response SID | 0x63 |
#2 . . #259+1 | dataRecord [ data#1 ] (memory cell#1) . . dataRecord [ data#259 ] (memory cell#259) ] | 0x00 . . 0x8C |
例2:ReadMemoryByAddress - 2-byte (16-bit) addressing
客户端从服务端内存起始地址为0x4813位置处读取了5个数据字节。
案例2 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Request SID | 0x23 |
#2 | addressAndLengthFormatIdentifier | 0x12 |
#3 | memoryAddress [ byte#1 ] (MSB) | 0x48 |
#4 | memoryAddress [ byte#2 ] | 0x13 |
#5 | memorySize [ byte#1 ] | 0x05 |
案例2 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Response SID | 0x63 |
#2 | dataRecord [ data#1 ] (memory cell#1) | 0x43 |
#3 | dataRecord [ data#1 ] (memory cell#2) | 0x2A |
#4 | dataRecord [ data#1 ] (memory cell#3) | 0x07 |
#5 | dataRecord [ data#1 ] (memory cell#4) | 0x2A |
#6 | dataRecord [ data#1 ] (memory cell#5) | 0x55 |
例3:ReadMemoryByAddress, 3-byte (24-bit) addressing
客户端从服务端外部RAM单元地址从0x204813位置处,读取了3个数据字节。
案例3 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的请求报文使用如下,由客户端发向服务端(ECU):
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Request SID | 0x23 |
#2 | addressAndLengthFormatIdentifier | 0x23 |
#3 | memoryAddress [ byte#1 ] (MSB) | 0x20 |
#4 | memoryAddress [ byte#2 ] | 0x48 |
#5 | memoryAddress [ byte#2 ] (LSB) | 0x13 |
#6 | memorySize [ byte#1(MSB) ] | 0x00 |
#7 | memorySize [ byte#2(LSB) ] | 0x03 |
案例3 0x23服务(ReadMemoryByAddress,根据地址读取内存服务)的肯定应答报文见下表,由服务端(ECU)发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress Response SID | 0x63 |
#2 | dataRecord [ data#1 ] (memory cell#1) | 0x00 |
#3 | dataRecord [ data#1 ] (memory cell#2) | 0x01 |
#4 | dataRecord [ data#1 ] (memory cell#3) | 0x8C |