诊断会话控制服务,其服务ID是0x10,主要功能为控制服务端的会话模式的切换。
诊断会话模式分为默认会话模式和非默认会话模式,不同的会话模式所支持的功能、权限、时间参数等等是不一样的。
1.会话模式定义
首先明确一点就是一个服务端(ECU)正常运行的时候,当前只会存在一个会话模式,不会同时存在两个会话模式。
无特殊情况下上电会在默认会话模式下,在该模式下仅支持一般的信息读取和查询操作,例如读取VIN和软硬件版本,查询和清除故障信息等。
非默认会话模式不是一个模式,而是一个模式分类的称呼,除了默认会话模式,其他的会话模式都是非默认会话模式。常用的非默认会话模式有扩展会话模式和编程会话模式:扩展会话模式主要是用来写入一些信息如VIN和序列号等,以及控制ECU执行一些特殊请求如控制应用通信和故障信息的更新等;编程会话从字面上就很好理解,如果需要对ECU进行程序刷写操作,就需要进入编程会话才能执行相关操作。除了以上非默认会话模式,实际还有一些其他的主机厂自己定义的模式如OTA模式,定义这类自定义的模式的目的就是为了满足特定的场景需求。
2.会话模式切换
当服务端(ECU)收到诊断会话模式请求时,需要切换到请求的诊断会话模式中去,一般情况下响应之后完成切换即可,特殊情况如编程会话模式的切换可能需要在切换之后再进行响应。切换会话模式的时候,有可能会有一些条件限制如车速、发动机转速、传感器位置等,这时候如果条件不满足则需要给出否定响应(NRC22),因为会话模式切换意味着可能要对服务端进行一些操作,这些操作会对车辆产生影响,所以这些条件限制主要目的是保证人员安全。如果请求的会话模式与当前会话模式相同,那么也需要给出肯定响应。
上图是标准里的一张诊断会话模式切换图,里面包含接收到会话模式请求的四种情况,下面按标准内容进行解释。
①在默认会话模式下收到默认会话模式请求:服务端应当重新初始化默认会话,即之前被临时激活或者改变的数据都应该恢复到刚上电初始化的状态,写入到非易失存储器(断电数据不会消失的存储器)的数据不会重新初始化。
②在默认会话模式下收到任何非默认会话模式请求:服务端应当切换到被请求的会话模式,并且如果通过0x86服务设置了事件的话,这时候需要暂停。但是目前基本上不会使用0x86服务,所以一般直接切换即可。
③在非默认会话模式下收到非默认会话模式请求:服务端完成会话模式切换的同时需要完成以下操作:
④在非默认会话模式下收到默认会话模式请求:服务端应当恢复之前被暂停的通过0x86服务设置的事件,停止所有默认会话模式不支持的服务,其余需要执行的操作与第①条一样。
对于哪些服务在哪个会话模式下支持,可参照ISO14229-1里面的表格,这里就不贴了。
1.请求报文
下表是请求报文的数据格式,格式比较简单,只包含两个字节,服务ID占一个字节0x10,子功能占一个字节,数据可取范围为0x00-0xFF。
2.响应报文
下表是响应报文的数据格式,与请求报文有两点不同,响应的服务ID变成了0x50,子功能之后带了四个字节的时间参数。时间参数的作用是为了告知激活的会话模式支持的参数值,便于客户端(诊断仪)按照该参数处理响应。
3.子功能
子功能表示具体的诊断会话模式,下表列举了常见会话模式:
子功能 | 诊断会话模式 |
---|---|
01 | 默认会话模式 |
02 | 编程会话模式 |
03 | 扩展会话模式 |
一般常见的就这三种会话模式,除默认会话模式是强制要求的,标准里并没有强制支持其他会话模式,但是这里注意一般主机厂会有强制要求,因为如果仅支持默认会话的话很多功能是不方便执行的。
4.时间参数
时间参数有两个,P2server_max和P2*server_max,每个参数占用两个字节,所以一共占用四个字节。虽然每个参数都是两个字节,但是其单位(精度)是不一样的,P2*参数的单位是10ms,也就是说P2*的结果需要把后面两个字节的数值乘以10才是实际的时间。关于P2和P2*是什么,后续在ISO14229-2里面会详细说明。
5.常用NRC
在ISO标准里给出了该服务的常用NRC,主要有三个,如下表所示,服务端需要根据实际的情况进行响应。
1.请求
现在假设我们请求服务端切换到编程会话模式,那么请求报文里,SID=0x10,子功能=0x02,此次请求需要响应,所以抑制肯定响应位=0,应用数据如下表所示。
2.响应
响应报文里,SID=0x10+0x40=0x50,子功能=0x02,P2server_max=50ms=0x0032,P2*server_max=5000ms=500*10ms=0x01F4*10ms,应用数据如下表所示。
UDS诊断系列链接汇总_ChenglimK的博客-CSDN博客