TesterPresent就是诊断设备在线服务,它是最简单的一个诊断服务。
服务 | 描述 |
TesterPresent | 客户端向某服务端请求来确认此服务端是否在线,客户端有没有跟服务端连接上。 |
目录
1.英文术语
英文术语 | 翻译 |
TesterPresent | 诊断设备在线 |
TesterPresent Request SID | 诊断设备在线请求SID ISO14229定义此值为0x3E |
sub-function | 子功能 |
zeroSubFunction | 零子功能 |
TesterPresent Response SID | 诊断设备在线响应SID ISO14229定义此值为(0x3E+0x40) |
2.缩写表
缩写 | 解释 |
SID | 服务标识符 |
Cvt | 约定值 M 强制的 C 有条件的 U 用户选项 |
NRC | 否定响应码 |
3.服务描述
诊断设备在线服务就是客户端用来确认无服务端是否在线的操作,利用此服务可实现客户端与服务端的一次“握手”。
可以直接理解就是 客户端给服务端发诊断设备在线请求消息(问候一下“你好吗”),这时候如果服务端接收到此请求消息,而且此请求消息都符合服务端的条件并且抑制肯定响应位为0,那么服务端就会向客户端回复肯定响应消息(回复一句“我很好
”)。
诊断设备在线服务还有一个特殊功能:如果服务端可以在非默认会话模式下,再去请求此服务时,服务端就可以保留在此非默认会话模式下,其实就是将诊断会话计时器中记录的还没有超过5000ms的时间记录清除,让他再去从0开始计时,这时候要想回到默认会话就得再等5000ms。
注:这个特殊功能其实并不是在我们这个服务里边做的,而是诊断会话服务中本身具有的一项特性,即有除诊断会话服务以外的其他诊断请求指令时,而且服务器当前处于非默认会话模式下,诊断会话计时器就是重新进行计时5000ms,这样我们去诊断设备在线请求时,也就是在这个“其他诊断请求指令”之内。
服务白话解读:“我叫你一声,你答应就完了”
4.请求消息定义
请求消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 诊断设备在线请求SID | M | 0x3E | TP |
#2 | 子功能=[零子功能] | M | 0x00/0x80 | LEV_ZSUBF |
注:子功能字节为0x80表示服务器不能去发肯定响应,即使服务器正常去响应请求,也不能发肯定响应消息。
4.1.请求消息子功能定义
该服务使用子功能参数选择(此字节的bit7表示抑制肯定响应位,下表并没有介绍此位)。
请求消息子功能定义 | |||
位6-0 | 描述 | Cvt | 助记符 |
0x00 | 零子功能 该值表示此服务不支持除抑制肯定响应消息指示位之外的子功能值。此服务其实是没有子功能字节的,但是因为它需要设置一个抑制肯定响应位(来控制服务器是否需要发出肯定响应消息),所以我们这个服务就设置一个子功能字节,而0-6bit位本身没有实际意义,ISO14229就用0x00来强制规定一下,其他值目前还是没有定义的。 | M | ZSUBF |
0x01-0x7F | ISOSAEReserved 该值为本文件为未来定义预留。 | M | ISOSAERESRVD |
4.2.请求消息数据参数定义
此服务中请求消息中没有数据参数。
5.肯定响应消息定义
肯定响应消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 诊断设备在线响应SID | M | 0x7E | TPPR |
#2 | 子功能 = [零子功能] | M | 0x00 | LEV_ZSUBF |
5.1.肯定响应消息数据参数定义
肯定响应消息数据参数定义 |
定义 |
零子功能 此参数与请求消息的子功能参数的位6~0相同。 |
6.否定响应消息定义
否定响应消息定义 | ||||
A_Data字节 | 参数名称 | 字节值 | Cvt | 助记符 |
#1 | 否定响应SID | 0x7F | M | SIDNR |
#2 | 诊断设备在线请求SID | 0x3E | M | SIDRQ |
#3 | 否定响应码 | 0xXX | M | NRC_ |
6.1.否定响应码
此服务支持的否定响应码 | ||
否定响应码 | 描述 | 助记符 |
0x12 | 子功能不支持 如果不支持子功能参数,则应发送此否定响应码。 | SFNS |
0x13 | 消息长度错误或格式无效 如果消息的长度错误,则应发送此否定响应码。 | IMLOIF |
7.服务使用示例
7.1.示例#1-诊断设备在线(抑制肯定响应位 = 假)
7.1.1.步骤1:诊断设备在线请求
确认服务端有没有跟客户端连接上
诊断设备在线请求消息 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 诊断设备在线请求SID | 0x3E | TP | |
#2 | 子功能 = 零子功能 抑制肯定响应位 = 假 | 0x00 | ZSUBF |
诊断设备在线响应消息 | ||||
消息方向 | 服务端→客户端 | |||
消息类型 | 响应 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 诊断设备在线响应SID | 0x7E | TPPR | |
#2 | 子功能 = 零子功能 | 0x00 | ZSUBF |
注意:响应报文是不会有抑制肯定响应位的。
7.1.2.操作汇总
步骤1:诊断设备在线请求
图解:
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
诊断设备在线请求 | 0x02 | 0x3E | 0x00 | 客户端 | |||||
肯定响应 | 0x02 | 0x7E | 0x00 | 服务端 |
7.2.示例#2-诊断设备在线(抑制肯定响应位 = 真)
7.2.1.步骤1:诊断设备在线请求
确认服务端有没有跟客户端连接上
诊断设备在线请求消息 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 诊断设备在线请求SID | 0x3E | TP | |
#2 | 子功能 = 零子功能 抑制肯定响应位 = 真 | 0x80 | ZSUBF |
这时候服务端不会发送肯定响应(其实这时候也无法判定服务端是在线的,因为服务端都没有响应了,客户端无法确认服务端是否响应了自己的请求)。
7.2.2.操作汇总
步骤1:诊断设备在线请求
图解:
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
诊断设备在线请求 | 0x02 | 0x3E | 0x80 | 客户端 | |||||
到这里我们的0x3E服务基本学完了。
以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!
有CSDN号的也可以帮忙点个关注,我会陆续更新其它UDS服务。