DiagnosticSessionControl就是诊断会话控制服务,它是最为基础的一个诊断服务。
服务 | 描述 |
DiagnosticSessionControl | 客户端向服务端请求启用不同的诊断会话。 |
目录
1.英文术语
2.缩写表
3.服务描述
3.1.诊断会话
3.2.诊断会话间的转换
3.3.易失性存储器和非易失性存储器
3.3.1.易失性存储器
3.3.2.非易失性存储器
3.4.在默认会话或非默认会话下允许的服务
4.请求消息定义
4.1.请求消息子功能定义
4.2.请求消息数据参数定义
5.肯定响应消息定义
5.1.肯定响应消息数据参数定义
5.1.1.会话参数记录定义
5.1.2.会话层计时参数定义
6.否定响应消息定义
6.1.否定响应码
7.服务使用示例
7.1.示例#1- 启动编程会话
7.1.1.步骤1:请求启动编程会话
7.1.2.操作汇总
英文术语 | 翻译 |
DiagnosticSessionControl | 诊断会话控制 |
diagnostic session | 诊断会话也可以称为诊断模式 |
non-volatile memory | 非易失性存储器(缩写为NVM) |
diagnostic session timer | 诊断会话计时器(在ISO15765-3中定义为) |
DiagnosticSessionControl Request SID | 诊断会话控制请求SID ISO14229定义此值为0x10 |
sub-function | 子功能 |
diagnosticSessionType | 诊断会话类型 |
DiagnosticSessionControl Response SID | 诊断会话控制响应SID ISO14229定义此值为(0x10+0x40) |
sessionParameterRecord | 会话参数记录 |
defaultSession | 默认会话 |
non-defaultSession | 非默认会话 |
ProgrammingSession | 程序会话,又称编程会话 |
extendedDiagnosticSession | 扩展会话 |
safetySystemDiagnosticSession | 安全系统会话 |
缩写 | 解释 |
SID | 服务标识符 |
NVM | 非易失性存储器 |
DTC | 故障码 |
Cvt | 约定值 M 强制的 C 有条件的 U 用户选项 |
NRC | 否定响应码 |
诊断会话也可以称为诊断模式,服务端在同一时刻必然会处于某一种诊断会话下,且只能处于唯一一种诊断会话下,其实我们可以当诊断会话是UDS的“环境条件”,不同的诊断会话下所支持的诊断服务是不同的。譬如:请求某种诊断服务,但是当前的诊断会话是不支持此请求的服务,所以服务器就会去给服务器发一个否定响应。同时也记录着当前会话下数据链路层关于诊断服务的特定参数值(例如,计时参数值也就是诊断定时参数(如诊断响应的最大允许时间))。
诊断会话总体上分为默认会话(也可称为默认会话模式)和非默认会话(也可称为非默认会话模式)两种,非默认会话还可以进一步分为多个具体的诊断会话(如:程序会话、扩展会话等)。
注意:
1、如果客户端请求了一个正在运行的诊断会话,那么服务端应该发送一个肯定响应。
例如:服务端当前处于默认会话下,客户端再去请求服务端进入默认会话,不要误以为此时我们服务端已经在默认模式下了,我们服务端就不需进行切换,服务端只需要发送一个肯定响应给客户端就可以了,这个考虑方式有点想当然了。此时我们要发的并不是一个肯定响应就够了,服务端还需要做的事情是完全初始化这个会话模式,如:将这个当前会话模式重新赋默认模式;这时也不需要定时器来定时;当这个会话模式重新赋值时(会话模式初始化也是会话模式变化的一种),服务端要重新上锁,还有一些就是跟UDS诊断状态和控制状态有关的都需要变回此服务端刚上电时的预定状态。
注意:上面的诊断会话如果是非默认会话,那么服务端初始化这个会话模式时,需要做的事情是
2、服务器在上电时会处于默认会话下,我们可以通过给服务端发送诊断会话控制请求指令,使服务端切换到非默认会话。如果想要服务端保持在非默认会话,就需要在服务端自动跳转回默认会话之前这段时间给服务端发送诊断指令(注意不要发默认会话指令,不然服务端会直接跳回默认会话模式),如果在这段时间没有发送诊断指令,那么服务端就会自动跳回默认会话。
注意:
定时参数 | 说明 | 类型 | 推荐超时ms |
服务器在非默认会话模式下,没有接收到任何请求信息,服务器保持在此会话模式的时间,如果超出这个时间,服务端就会从非默认会话模式下跳转到默认会话模式下。 | 时间重置值 | 5000ms |
服务端诊断会话状态图
服务端在默认会话和非默认会话间转换的时候遵循如下规则:
3、服务端在非默认会话下,也可以通过向服务端发送非诊断会话控制的诊断指令,以实现向默认会话的切换。
譬如:客户端向服务器发送ECU软件复位或者硬件复位后,如果服务端执行此服务诊断指令,系统就会重新开始,这样服务端又会回到默认会话。
易失性存储器就是指RAM,也叫主存,是与CPU直接交换数据的内部存储器,它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它的易失性表现在一旦断电所储存的数据将随之丢失。
非易失性存储器指断电后存储的数据没有丢失的存储器。
根据存储器内的数据是否能够在使用电脑时随时被改写为标准,可以将其分为两大类产品,即ROM和Flash memory。
非易失性存储器主要有以下类型:
1、ROM (Read-only memory,只读内存)
2、Flash memory(闪存)
服务 | 默认会话 | 非默认会话 |
诊断会话控制(0x10) | 允许 | 允许 |
ECU复位(0x11) | 允许 | 允许 |
安全访问(0x27) | 不适用 | 允许 |
通信控制(0x28) | 不适用 | 允许 |
待机握手(0x3E) | 允许 | 允许 |
访问计时参数(0x83) | 不适用 | 允许 |
安全数据传输(0x84) | 不适用 | 允许 |
DTC设置控制(0x85) | 不适用 | 允许 |
事件响应(0x86) | 允许^a | 允许 |
链路控制(0x87) | 不适用 | 允许 |
通过标识符读数据(0x22) | 允许^b | 允许 |
通过地址读取内存(0x23) | 允许^c | 允许 |
通过标识符读取比例数据(0x24) | 允许^b | 允许 |
通过周期标识符读取数据(0x2A) | 不适用 | 允许 |
动态定义数据标识符(0x2C) | 允许^d | 允许 |
通过标识符写数据(0x2E) | 允许^b | 允许 |
通过地址写内存(0x3D) | 允许^c | 允许 |
清除诊断信息(0x14) | 允许 | 允许 |
读取DTC信息(0x19) | 允许 | 允许 |
通过ID控制输入输出(0x2F) | 不适用 | 允许 |
例程控制(0x31) | 允许^e | 允许 |
请求下载(0x34) | 不适用 | 允许 |
请求上传(0x35) | 不适用 | 允许 |
传输数据(0x36) | 不适用 | 允许 |
请求退出传输(0x37) | 不适用 | 允许 |
请求文件传输(0x38) | 不适用 | 允许 |
a:在默认会话下是否允许事件响应服务由具体实施情况(车辆制造商内部内部决定即可)而定。 b:在默认会话下,对于数据标识符的操作可以说是不支持的,因为他加了安全访问等级,而我们在默认模式下是不支持安全访问服务的,就只能切换至非默认会话下请求安全访问服务才可解锁,再去请求此服务才可响应。 c:在默认会话下,对于内存地址的操作可以说是不支持的,因为他加了安全访问等级,而我们在默认模式下是不支持安全访问服务的,就只能切换至非默认会话下请求安全访问服务才可解锁,再去请求此服务才可响应。 d:数据标识符能够在默认会话和非默认会话下被动态定义 e:例程控制需要使用安全访问服务,因此需要非默认会话,客户端主动停止的例程程序也需要在非默认会话下。 这里的允许^b、允许^c、允许^e并不是说此服务在当前会话中需要去请求安全访问服务进行解锁,而这里的安全访问服务必须在非默认会话下进行的,所以我们在此默认会话下,需用诊断会话服务切换至非默认会话,再去请求安全访问服务进行解锁,当进入此解锁状态,我们就可以在此非默认会话模式下请求可支持的服务。 所以我们如果已经是非默认会话服务,标有b、c、e的服务也就需要服务端先解锁后才能支持这些服务。其他服务可由车辆制造商定义安全访问等级或者不支持安全访问。 |
从表中可以看出,在默认会话下支持的服务由诊断会话控制、服务端复位、数据读取、故障码读取和清除等服务,而写入数据、通讯控制、输入输出控制、等服务都需要在非默认会话下执行,原因可以归纳为以下几点:
请求消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 诊断会话控制请求SID | M | 0x10 | DSC |
#2 | 子功能=[诊断会话类型] | M | 0x00-0xFF | LEV_DS_ |
该服务使用子功能参数“诊断会话类型”选择服务端的特定行为。(此字节的bit7表示抑制肯定响应位,下表并没有介绍此位)。
请求消息子功能参数定义 | |||
位6-0 | 描述 | Cvt | 助记符 |
0x00 | ISOSAEReserved 该值为本文件为未来定义预留。 | M | ISOSAERESRVD |
0x01 | 默认会话 此诊断会话启用服务端中的默认会话,在此会话下不存在超时,就是说不存在有自动跳转到某个会话模式的情况,它也不需要诊断设备在线服务(0x3E)来维持这种模式。 如果服务端处于非默认会话时,再次启动默认会话,应遵循以下实施规则: 1、当客户端发送默认会话请求时,停止当前的非默认会话,并启动默认会话后,向客户端发送肯定响应。 2、在服务端发送肯定响应之前,重新对服务器上锁(把门关起来,把锁锁上,在门里面服务,不解锁就享受不了)。 3、如果服务端发送带有诊断会话控制请求服务标识符的否定响应,则应继续保持非默认会话模式,时长是建议的5000ms,也就是在发送否定响应之后开始重新计时5000ms。 4、在非诊断会话下,其他非诊断会话控制服务(除ECU复位服务之外,这也是一种特殊情况)请求,服务端无论发送的是肯定响应还是否定响应之后,可继续保持非默认会话模式,时长是建议的5000ms,即继续保持在非默认会话5000ms。 | M | DS |
0x02 | 编程会话 此诊断会话启用服务端中的编程会话,在此会话下用于支持所有有关服务端内存编程的诊断服务。 经验总结:在非引导程序(应用程序)中,编程会话一般都是不用的,所以在默认会话下,请求跳转到编程会话下一般都设为不支持。 如果服务端在引导软件(bootloader)中运行编程会话,则只能通过三种方式退出编程会话: 1、客户端向服务端请求ECU复位(0x11)服务; 2、客户端向服务端请求会话类型等于默认会话的诊断会话控制(0x10)服务; 3、服务端中的会话层超时(就是设定的5000ms的计时超时了,就直接跳回到默认会话模式) 如果服务端在引导软件运行时接收到默认诊断会话控制(0x10)服务或会话层超时时,且存在有效的应用程序软件,则服务端应重新启动应用程序软件。 本标准并没有明确如何去实现有效应用程序重新启动的方法。 (这个我们在做bootloader的UDS的时候,再去深入研究吧) | U | PRGS |
0x03 | 扩展会话 此诊断会话可用于启用支持与调整服务端内存中诸如“怠速、CO值等”功能所需的所有诊断服务。 也可以用于在此会话模式下,进入新非默认会话,譬如:有些系统功能供应商定义了一些其他的非默认会话模式,需要先进入扩展模式后才能根据相应的会话指令进入新的非默认会话模式。 (这也就是我们为什么叫它扩展会话的原因。) | U | EXTDS |
0x04 | 安全系统诊断会话 此诊断会话启用支持与安全系统相关功能(例如,安全气囊展开)所需的所有诊断服务。 | U | SSDS |
0x05-0x3F | ISOSAEReserved 该值为本文件为未来定义预留。 | M | ISOSAERESRVD |
0x40-0x5F | 车辆制造商特定 此值范围保留以供车辆制造商特定使用 | U | VMS |
0x60-0x7E | 系统供应商特定 此值范围保留以供系统供应商特定使用 | U | SSS |
0x7F | ISOSAEReserved 该值为本文件为未来定义预留。 | M | ISOSAERESRVD |
此服务不支持请求消息中的数据参数。(所以我们请求报文只有2个字节数据,一个是SID,另一个是子功能)
肯定响应消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 诊断会话控制响应SID | M | 0x50 | DSCPR |
#2 | 子功能 = [诊断会话类型] | M | 0x00 - 0xFF | LEV_DS_ |
#3 : #6 | 会话参数记录[] = [ 数据#1 : 数据#4] | M : M | 0x00 - 0xFF : 0x00 - 0xFF | SPREC_ DATA_1 : DATA_4 |
肯定响应消息数据参数定义 |
定义 |
诊断会话类型 此参数与请求消息子功能参数的位6~0相同。 |
会话参数记录 此参数记录包含服务端报告的会话特定参数值。(此会话特定参数在下面表格中有明确定义) |
会话参数记录定义 | ||||
记录中的字节位置 | 描述 | Cvt | 字节值 | 助记符 |
#1 #2 #3 #4 | 会话参数记录[] = [ P2Server_max(高字节) P2Server_max(低字节) P2*Server_max(高字节) P2*Server_max(低字节)] | M M M M | 0x00 - 0xFF 0x00 - 0xFF 0x00 - 0xFF 0x00 - 0xFF | SPREC_ P2SMH P2SML P2ESMH P2ESML |
会话参数记录内容定义 | |||||
参数 | 描述 | 字节数 | 分辨率 | 最小值 | 最大值 |
P2Server_max | 服务端支持的默认P2Server_max计时,用于当前诊断会话。 (车辆制造商可定义此最大值) | 2 | 1ms | 0ms | 65535ms |
P2*Server_max | 服务端支持的增强(NRC0x78)P2Server_max,用于当前诊断会话 (车辆制造商可定义此最大值) | 2 | 10ms | 0ms | 655350ms |
会话层计时参数定义 | ||
计时参数 | 描述 | 类型 |
P2Server | 服务端在接收到请求消息后从响应消息开始的性能要求(通过T_Data.ind指示)。 | 性能要求 |
P2*Server | 在传输带有否定响应代码0x78的否定响应消息(通过T_Data.con指示)后,服务器从响应消息开始的性能要求 (增强的响应时间)。 | 性能要求 |
否定响应消息定义 | ||||
A_Data字节 | 参数名称 | 字节值 | Cvt | 助记符 |
#1 | 否定响应SID | 0x7F | M | SIDNR |
#2 | 诊断会话控制请求SID | 0x10 | M | SIDRQ |
#3 | 否定响应码 | 0xXX | M | NRC_ |
此服务支持的否定响应码 | ||
NRC | 描述 | 助记符 |
0x12 | 不支持该子功能 如果不支持该子功能参数,则应发送此否定响应码。 | SFNS |
0x13 | 不正确的消息长度或无效格式 如果消息长度错误,则应发送此否定响应码。 | IMLOIF |
0x22 | 条件不正确 如果未满足请求诊断会话控制的条件,则应返回此否定响应码。 | CNC |
假定P2Server_max 等于50ms并且P2*Server_max 等于5000ms
诊断会话控制请求 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 诊断会话控制请求SID | 0x10 | DSC | |
#2 | 子功能 = 编程会话 抑制肯定响应位 = 假 | 0x02 | DS_ECUPRGS |
肯定响应消息 | ||||
消息方向 | 服务端→客户端 | |||
消息类型 | 响应 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 诊断会话控制响应SID | 0x50 | DSCPR | |
#2 | 子功能 = 编程会话 | 0x02 | DS_ECUPRGS | |
#3 | 会话参数记录[P2Server_max(高字节)] | 0x00 | SPREC_1 | |
#4 | 会话参数记录[P2Server_max(低字节)] | 0x32 | SPREC_2 | |
#5 | 会话参数记录[P2*Server_max(高字节)] | 0x01 | SPREC_3 | |
#6 | 会话参数记录[P2*Server_max(低字节)] | 0xF4 | SPREC_4 |
步骤1:请求启动编程会话
图解:
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
请求启动编程会话 | 0x02 | 0x10 | 0x02 | 客户端 | |||||
肯定响应 | 0x06 | 0x50 | 0x02 | 0x00 | 0x32 | 0x01 | 0xF4 | 服务端 |
到这里我们的0x10服务基本学完了。
以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!
有CSDN号的也可以帮忙点个关注,我会陆续更新其它UDS服务。