UDS-诊断服务功能

DiagnosticSessionControl(0x10)

  • 客户端请求控制与某个服务器的诊断会话
  • 支持子功能

ECU的某些诊断服务必须在指定的诊断会话下才能进行,所以在请求某些服务前,必须用10服务请求ECU切到指定的诊断会话下,不同的子功能代表不同的诊断会话,比如说:

10 01 默认模式

10 02 编程模式

10 03 扩展诊断模式

这里有两个点需要注意:

  • ECU上电或者复位后,都会变成默认模式
  • 从默认模式切换到其他模式后,都会启动定时器,超时时间内如果没有诊断通信,ECU就会切回默认模式,如果有诊断通信,就会重新计时

ECU如果确认10请求成功,就会切换诊断模式,同时回复肯定响应,比如10 03就会回复50 03

那如果请求失败,ECU回复否定响应,否定响应服务标识符是7F,但是失败的原因可能有多种,所以7F后面还需要有否定响应码NRC,用它来表明失败的具体原因

10服务支持的否定响应码

在这里插入图片描述

否定响应码NRC

常用的否定响应码

UDS-诊断服务功能_第1张图片

最后一个78,并不代表请求失败,只是说明ECU现在正忙,无法处理此诊断请求,待ECU空闲时,就会处理此请求

TesterPresent(0x3E)

  • 客户端向服务器指示客户端仍然在线
  • 支持子功能

比如说发10 03让ECU切到扩展模式,正常过几秒后ECU就会切回默认会话,而你需要让ECU一直保持在扩展模式,你就可以先周期性地发送3E 00,告诉ECU我是一直在线的,这样ECU就会一直维持在扩展模式

3E服务支持的否定响应码

在这里插入图片描述

SecurityAccess(0x27)

  • 客户端请求解锁某个受安全保护的服务器
  • 支持子功能

ECU如果支持27服务的安全保护,就可以用27服务解锁,受保护的ECU是无法执行某些诊断请求的

解锁的过程

UDS-诊断服务功能_第2张图片

诊断仪向ECU请求种子,然后用ECU回复的种子,代入到特定的算法中,计算得到秘钥,然后把这个秘钥再发给ECU,ECU拿到秘钥验证正确后,解锁即成功。所以,诊断仪这边必须要有ECU的算法

27服务支持的否定响应码

UDS-诊断服务功能_第3张图片

CommunicationControl(0x28)

  • 客户端请求服务器控制其通信
  • 支持子功能

28服务是用来打开/关闭对非诊断消息的发送/接收

28服务支持的否定响应码

UDS-诊断服务功能_第4张图片

ECUReset(0x11)

  • 客户端强制服务器执行复位
  • 支持子功能

11服务可以让ECU重启复位,包括断电重启(模拟断电上电)和软重启(模拟长按power键)

有的请求服务会规定ECU必须重启才能生效,这时候就可以用11服务重启ECU

WriteDataByIdentifier(0x2E**)**

  • 客户端请求写入由数据标识符(DataIdentifier)指定的某个记录
  • 2字节数据标识符DID(DataIdentifier)
  • DataIdentifier的参数由制造商自己定义

什么意思?通过诊断刷写的方式对ECU功能配置做相关的设置

比如说某厂商的语音导航系统可以通过诊断刷写的方式支持/不支持WLAN功能,那么WLAN功能会定义一个DID值,比如0x035F,然后用00代表不支持,用01代表支持,那么完整的诊断请求就是:

2E 03 5F 00 -> 通过诊断方式让ECU不支持WLAN功能

2E 03 5F 01 -> 通过诊断方式让ECU支持WLAN功能

还有的功能包含了很多小的功能,比如说蓝牙功能,它的DID是0x055F,它里面有很多配置功能,比如说显示/不显示,支持/不支持A2DP功能,支持/不支持HFP功能等等,你可以在DID的后面用一个字节来表示子功能,再用一个byte表示动作,比如

UDS-诊断服务功能_第5张图片

虽然可以这样定义,但是这样会不会很麻烦,你需要写三次,才能配置好整个的蓝牙功能,有没有一次就搞定的方式?当然是有的,可以这样定义

UDS-诊断服务功能_第6张图片

用一个byte的不同bit位表示不同的子功能,0和1的值表示动作,这样只要刷写一次2E 05 5F 05就表示配置蓝牙功能:显示,不支持A2DP,支持HFP

当然如何定义这些参数具体还是要看厂商的需求是什么

ReadDataByIdentifier(0x22)

  • 客户端请求读取由数据标识符(DataIdentifier)识别的某个记录的当前值
  • 2字节数据标识符DID(DataIdentifier)
  • DataIdentifier的参数由制造商自己定义

上面的2E是写入配置,这个22是读取配置,2E是把配置的值写进去,22就是读取ECU回复的值,然后根据值可以判断ECU配置的功能是如何

比如22 05 5F,ECU回复62 05 5F 05,就可以根据最后的05值在需求定义中查看功能配置的情况

ReadDTCInformation(0x19)

  • 读取DTC code
  • 支持子功能

DTC, Diagnostic Trouble Code,当ECU的某些功能发生了错误,比如说连接的音频线路短路、开路,ECU所接的电压过高过低,ECU有些消息未收到等等等等,都会产生相应地DTC code,通过19 + 子功能,就可以读取当前DTC或者历史DTC

什么是当前DTC,历史DTC?

当前DTC就是故障当前还是存在的,历史DTC就是故障之前发生过,现在你读取的时候已经消失了

当前DTC和历史DTC都是同一个DTC code的两种状态而已,而且同一时刻是互斥的,一个DTC不可能既是当前DTC又是历史DTC

ClearDiagnoticInformation(0x14)

  • 清除DTC code

会把储存当前DTC和历史DTC的内存空间清除,如果清除完了再读,读取的就是当前DTC,历史DTC就没有了

DTC生成的条件各有不同,有的是需要重新上电才会生成,有的是实时生成

InputOutputControlByIdentifier(0x2F)

  • 用于替换ECU输入信号的值或内部功能
  • 控制电子系统的某个输出(执行器)

可以简单的理解成模拟某些功能,比如说可以让喇叭发出声音,可以模拟按键的操作,可以连接蓝牙设备等等

2F服务支持的否定响应码

UDS-诊断服务功能_第7张图片

RoutineControl(0x31)

  • 用于远程请求启动、停止某个例程或请求例程的执行结果
  • 支持子功能

比如清空蓝牙配对列表,恢复某些默认值,通过诊断刷写软件版本等

31服务支持的否定响应码

UDS-诊断服务功能_第8张图片

你可能感兴趣的:(汽车通信协议,汽车总线协议,UDS)