一.什么是10服务?
--诊断会话控制(DiagnosticSessionControl),用于启用服务器中的不同诊断会话模式。
10服务一般有3个服务子功能,01 default默认指令,02 Programming编程会话,03 Extended扩展会话。
二.诊断服务的格式:SID+Subfunction
字节 | 字节值 | |
#1 | SID | 0x10 |
#2 | Sub-function | 0x00-0xFF |
三.会话之前的跳转:
诊断10服务中,SID=10,Subfunction=01(进入默认会话)、02(进入编程会话)、03(进入扩展会话)。会话之间的跳转如下图所示:
1.在默认会话下收到默认会话模式请求:服务器应当重新初始化默认会话,即之前被临时激活或者改变的数据应该恢复到刚上电初始化的状态,写入到非易失存储器(断电不会消失的存储器)的数据不会重新初始化。
2.在默认会话下收到任何非默认会话模式请求:服务器应当切换到被请求的会话模式。
3.在非默认会话下收到非默认会话模式请求:服务器完成会话模式切换的同时需要完成以下操作: 停止通过86服务(事件响应)设置的事件; 重新锁定安全访问状态,并且重置依赖于安全访问的服务; 不依赖安全访问的服务,如果在被请求的会话模式也支持,保持不变;
4.在非默认会话下收到默认会话模式请求:服务器完成会话模式切换的同时需要完成以下操作: 服务器恢复之前被暂停的通过86服务(事件响应)设置的事件; 停止默认会话不支持的服务; 其余与1一样
注:在非默认会话下,如果没有发送3E服务(会话保持), 则S3service(一般是5s)time超时后,会话将回到默认会话模式。
四.关于测试
1、请求和响应的测试:在物理寻址和功能寻址(相当于周期性报文的ID)下,发送会话请求:10 01(相当于周期性报文的data).
诊断仪,如电脑,向控制器发送诊断请求,控制器收到诊断请求后会根据实际情况做相应的回复:肯定响应或否定响应,肯定响应则是SID+40,否定响应则是7F+SID+NRC。
2、实例--肯定响应
请求:10 01
肯定响应:50 01 00 32 01 F4
--50: 肯定响应的SID=请求的SID+40;
--01:sub-function;
--00 32:P2server_max(50ms 转换成十六进制:00 32);
--01 F4:P2*server_max(5000ms*0.1=500,500转换成十六进制:01 F4)
00 32 01 F4--根据具体需求而定,
其中:
P2server_max:从ECU接收完一帧完整的请求后,开启该定时器,且ECU应在该定时器定时时间内发送响应报文。如果在该定时器timeout前ECU就开始发送响应报文,那么该定时器在ECU开始发送响应报文的时候停止计时,否则超时;
P2*server_max:若在ECU中支持了78NRC的机制,那么当ECU忙于处理其他的事情的时候,诊断仪发送了一条请求到ECU,此时ECU是没空对该请求做出响应的(并不意味着否定响应),因此由于78这个机制的存在,ECU会回一个78NRC的响应报文,告知诊断仪ECU现在处于忙碌状态,稍后回复你,这个回复的时间就由P2*时间决定。
3、实例--否定响应
请求:10 01
否定响应:7F 10 12;12则是NRC码;诊断10服务的NRC主要包括表格中几个;
0x12 | 不受支持的子功能 | 10 05、10 06、…、10 FF、 |
0x13 | 消息长度不正确或格式无效 | 10、10 01 11、10 01 10 14、… |
0x22 | 执行条件不满足时 | 速度大于3km/h |
0x21 | 服务器忙 | |
0x11 | 诊断服务不支持 | |
0x7E | 诊断服务在当前会话下不支持 | |
0x78 | 收到诊断请求,等待响应 | 在回复准确响应前,回复的 |
补充一下: NRC12:子功能不支持,多数出现在子功能未被定义;10 05 、10 06、10 07 … NRC7E:该子功能在当前会话下不支持;如:1001会话下,不支持1002跳转,则会回复7F 10 7E 一般情况下:12/7E功能二选一,目前我们这边普遍统一为NRC12。
3、肯定响应抑制位---无响应
请求:10 01 转译成二进制:0001 0000 0000 0001
请求:10 81 转译成二进制:0001 0000 1000 0001
第7位置1,则表示肯定响应抑制,肯定响应则不反馈;
请求:10 01 响应:50 01 00 32 01 F4
请求:10 81 响应:无