汽车UDS诊断之诊断设备在线服务(0x3E)深度剖析

TesterPresent就是诊断设备在线服务,它是最简单的一个诊断服务。

诊断设备在线
服务 描述
TesterPresent

客户端向某服务端请求来确认此服务端是否在线,客户端有没有跟服务端连接上

目录

1.英文术语

2.缩写表

3.服务描述

4.请求消息定义 

4.1.请求消息子功能定义

4.2.请求消息数据参数定义

5.肯定响应消息定义

5.1.肯定响应消息数据参数定义

6.否定响应消息定义

6.1.否定响应码

7.服务使用示例

7.1.示例#1-诊断设备在线(抑制肯定响应位 = 假) 

7.1.1.步骤1:诊断设备在线请求

7.1.2.操作汇总

7.2.示例#2-诊断设备在线(抑制肯定响应位 = 真) 

7.2.1.步骤1:诊断设备在线请求

7.2.2.操作汇总


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,那么服务端就会向客户端回复肯定响应消息(回复一句“我很好)。

诊断设备在线服务还有一个特殊功能:如果服务端可以在非默认会话模式下,再去请求此服务时,服务端就可以保留在此非默认会话模式下,其实就是将诊断会话计时器S3_{server}中记录的还没有超过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服务

你可能感兴趣的:(UDS诊断,c语言)