UDS统一诊断服务【一】诊断会话控制0X10服务

诊断会话控制服务 DiagnosticSessionControl,SID是0X10,主要功能是控制服务端的会话模式切换。一般默认上电后是在默认会话模式下,当某一个服务端正在运行时,只会出现一个会话模式,不会同时存在两个会话模式。

大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断会话控制0X10服务介绍,希望能对你有所帮助

前言

最近在做诊断相关的开发工作,将自己接触到的知识点记录下来。前面的文章已经介绍过UDS的一些基础知识,和基本的一些概念,不清楚的可以查看之前的文章:UDS基础知识介绍

诊断会话控制简介

诊断会话控制服务 DiagnosticSessionControl,SID是0X10,主要功能是控制服务端的会话模式切换。一般默认上电后是在默认会话模式下,当某一个服务端正在运行时,只会出现一个会话模式,不会同时存在两个会话模式。

会话模式

常用的会话模式有如下几种:

默认会话:01 Default Session,支持信息的读取和查询操作,权限最小。

编程会话:02 Programming Session 顾名思义这个是用来烧录程序的

扩展会话:03 Extended Session,主要是用来读写数据,如写入VIN,序列号,读写诊断码等

UDS统一诊断服务【一】诊断会话控制0X10服务

  1. 默认会话:当服务端在默认会话模式下收到默认会话的请求时,服务端应当重新初始化默认会话,即之前被临时激活或者改变的数据都应该恢复到刚上电初始化的状态,写入到非易失存储器(断电数据不会消失的存储器)的数据不会重新初始化。

  2. 其他会话:当服务端在默认会话模式下收到任何非默认会话模式请求,服务端应当切换到被请求的会话模式,并且如果通过0x86服务设置了事件的话,这时候需要暂停。但是目前基本上不会使用0x86服务,所以一般直接切换即可。

  3. 在非默认会话模式下收到非默认会话模式请求:服务端完成会话模式切换的同时需要完成以下操作:

a, 停止通过ResponseOnEvent(0x86)服务设置的事件;

b,重新锁定安全访问状态,并且重置依赖于安全访问的服务; 

c,不依赖于安全访问的服务,如果在被请求的会话模式也支持,应当保持当前状态,例如通信控制服务和DTC控制服务。

4. 在非默认会话模式下收到默认会话模式请求:服务端应当恢复之前被暂停的通过0x86服务设置的事件,停止所有默认会话模式不支持的服务,其余需要执行的操作与第一条一样。

报文格式

请求报文

上篇文章介绍UDS基础知识的时候,也有介绍过诊断请求的格式,有如下3种:

格式1:[Service Identifier] + [Sub-function]

格式2:[SID] + [Data Identifier]

格式3:[SID] + [Sub-function] + [DID]

UDS统一诊断服务【一】诊断会话控制0X10服务

子功能

诊断会话控制使用子功能参数diagnosticSessionType诊断会话类型,被用于激活电控单元中对应的诊断会话,具体的参数含义如下:

UDS统一诊断服务【一】诊断会话控制0X10服务

更完整的参数含义请参考ISO14229-1,表格很长,此处只截了一部分

UDS统一诊断服务【一】诊断会话控制0X10服务

sub-function严格来说是7个bit,而不是1个byte,因为它的最高位bit被用于抑制正响应(suppress positive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response);如果这个bit被置0,则ECU会给出正响应。这样做的目的是可以告诉ECU不要发不必要的 response,从而节约通信资源。

UDS统一诊断服务【一】诊断会话控制0X10服务

响应报文

当服务端收到诊断请求时,如果能执行则回复肯定响应,不能执行则回复否定响应;也有不给出响应的情况,就是抑制正响应(suppress positive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response)

肯定响应

肯定响应的格式为:[SID + 0X40] + [Sub-function] + xx xx xx xx xx

当然肯定响应的格式是根据请求报文的格式来的,请求报文是[SID] + [Sub-function],则肯定响应就为[SID + 0X40] + [Sub-function];请求报文是[SID] + [DID],则肯定响应就是[SID + 0X40] + [DID]。其余字节是时间参数,后面举例子说明。

UDS统一诊断服务【一】诊断会话控制0X10服务

否定响应

negative response的格式为3个字节,格式为:[0X7F] + [SID] + [NRC]

UDS统一诊断服务【一】诊断会话控制0X10服务

常用的否定响应码如下:

UDS统一诊断服务【一】诊断会话控制0X10服务

更详细完整的否定应答码请参考ISO14229-1 Table A.1

UDS统一诊断服务【一】诊断会话控制0X10服务

时间参数

时间参数有两个,P2server_max和P2*server_max,每个参数占用两个字节,所以一共占用四个字节。虽然每个参数都是两个字节,但是其单位(精度)是不一样的,P2*参数的单位是10ms,也就是说P2*的结果需要把后面两个字节的数值乘以10才是实际的时间

UDS统一诊断服务【一】诊断会话控制0X10服务

举例说明:

ISO14229的例子:

UDS统一诊断服务【一】诊断会话控制0X10服务

实际的例子:

此处的例子都是针对CAN总线网络为例。在举例之前,先介绍简单介绍一下CAN总线的诊断报文格式,后面文章会单独详细介绍

报文的类型包括了首帧FF,流控帧FC,连续帧CF和单帧SF四种。N_PCL中字节1的4-7位用来区分类型。N_PCLType = 0 单帧
N_PCLType = 1 首帧
N_PCLType = 2 连续帧
N_PCLType = 3 流控帧

UDS统一诊断服务【一】诊断会话控制0X10服务

肯定响应:

TX     02 10 03 00 00 00 00 00 // 02: 0表示单帧,2表示后面的数据有2个字节;10:10服务是诊断会话控制服务;03:表示子功能,扩展诊断会话;后面的0是填充位 

RX     06 50 03 00 32 01 F4 AA // 06:0表示单帧,6表示后面的数据有6个字节;50:肯定响应码,值为服务请求的值加0X40;03表示子功能;00 32表示P2server_max,转换成十进制就是50,那么P2server_max就是50ms

01 F4表示P2*server_max,转换成十进制就是500,再乘以单位10ms,即P2*server_max为5000ms

否定响应:

TX      02 10 02 00 00 00 00 00 // 10:诊断会话控制服务,02:编程会话模式 

RX     03 7F 10 78 AA AA AA AA // 03: 0表示单帧,3表示后面的数据有3个字节;7F为否定响应的SID;10为会话请求;78为否定应答码

最后,如果觉得有帮助,希望你能点个关注,一键三连,感激不尽。

 

声明:本站内容资源均来源于网友分享及网络公开合法渠道,但我们不对这些内容的观点、描述的准确性负责,也不保证所有信息的原创性、真实性、完整性及即时性。对于本站所含文章或资料的版权问题,如您发现有侵犯版权的情况,请联系我们进行处理。同时,我们提倡将本站内容用于个人学习交流,严禁未授权的商业用途,否则由此产生的法律后果由使用者自行承担。感谢支持!
技术分享资料下载

资料下载|2024年汽车国家标准汇总

2024-4-26 20:07:15

技术分享电子电气车载通讯

UDS统一诊断服务【二】ECU复位0X11服务

2024-4-26 21:16:35

3 条回复 A文章作者 M管理员
  1. […] 一开始执行 11 服务的时候,回复了个否定应答,否定应答码为78,这个NRC的含义之前介绍过(不记得这个NRC含义的话请查看之前的文章:UDS统一诊断服务【一】诊断会话控制0X10服务),表示已经收到请求,但响应没那么快,那要等多久呢,取决于P2*server_max时间,通常定义为5000ms也就是5s,这个时间就足够大部分ECU复位了。 […]

  2. […] 0X10服务:UDS统一诊断服务【一】诊断会话控制0X10服务 […]

个人中心
今日签到
有新私信 私信列表
搜索