UDS-统一诊断服务

2023-05-16

什么是诊断服务?

在还没有诊断服务的时候,如果车辆故障,需要有经验的师傅长时间的摸排查找,费时费力。而车辆的ECU节点有了诊断模块后,就具有了诊断功能,这样车辆如果有了故障,就会自动生成故障代码储存在诊断模块中,然后利用诊断仪就可以读取故障代码,车辆哪个节点出现的哪个故障就一目了然

当然除了通过诊断服务读取故障代码外,还可以通过诊断服务做:

诊断服务

车载网络分为四层,物理层、数据链路层、网络层和应用层,诊断服务位于应用层

UDS

Unified Diagnostic Services,统一诊断服务,ISO14229标准规范,是诊断服务的其中一种协议规范,是目前普遍使用的诊断协议

UDS基于CAN通讯诊断,也就是说它的网络层采用CAN网络协议

UDS服务结构为:服务标识符(Service ID) + 子功能(SubFunction)/数据位(DataIdentifier) + 数据(Data)

Service ID

表明了服务类型,由1字节无符号整数表示,从请求和响应的角度看,有三种类型的Service ID

  • 请求服务标识符

格式:x0xx xxxx

UDS请求服务标识符的bit6要为0,比如请求读取DTC故障信息的服务标识符是0x19,二进制是0001 1001,bit6就是0

  • 肯定响应服务标识符

既然有请求,ECU肯定要有响应,而响应又有正负之分

格式:x1xx xxxx

肯定响应标识符是把请求服务标识符的bit6置为1,其他位不变,比如诊断仪向ECU发送请求读取DTC故障信息的服务0x19,ECU回复肯定响应,就需要把0x19的bit6设为1,就是0101 1001,也就是0x59,从中可以看出,bit6置为1对应成16进制就是加上0x40,所以肯定响应服务标识符就是把请求服务标识符加上0x40

  • 否定响应服务标识符

当请求的服务ECU不支持,或者请求服务的参数不正确,或者。。。时,ECU需要回复否定响应告知

格式:0111 1111

可以看出,否定响应服务标识符是一个固定值,0x7F

SubFunction

如果UDS诊断服务支持子功能,子功能参数的第一个字节的bit7是禁止肯定响应指示位,bit7 = 1表示ECU禁止肯定响应,bit7 = 0表示ECU可以肯定响应,比如请求ECU reset服务11 02,02的bit7为0,表示ECU执行复位时回复肯定响应

UDS-传输层参数

前言
""诊断服务作为应用层的服务功能,实现逻辑很简单,请求-响应,一来一回之间,需要对每个间断进行时间设置""

之前在介绍UDS服务时,UDS由物理层、链路层、网络层和应用层组成,其中并没有传输层

然而不管是ISO官方文档还是CANoe工具,把应用层的定时参数看作是传输层功能,其中有以下几种:

P2Client

客户端在成功发送请求消息到收到响应消息的超时时间

P2Server

服务器在收到请求消息后到发出响应消息时的性能要求

P2*Client

客户端在接收到78 hex的否定响应后等待服务器发送响应时的增强型超时设置

78否定响应码表示服务器暂时繁忙,用来提示客户端继续等待,而P2*Client就是继续等待的超时时间

P2*Server

服务器在发送78 hex的否定响应后,到服务器发出响应消息时间的性能要求

S3Client

客户端为保持非默认会话而连续发送的Tester Present请求消息的时间间隔

Tester Present会话保持服务SID是3E hex

S3Server

服务器在未收到任何诊断请求消息的情况下使诊断会话保持在非默认会话的时间

我们知道如果ECU在一定时间内未收到诊断消息,就会从其他会话返回默认会话,这个时间就是S3Server

所以只要在S3Server内一直有诊断通信,ECU就会维持在活动状态(非默认会话),那为什么还要定义一个3E服务来维持会话呢?

因为有的时候通信可能暂停,等到下次想使用诊断服务时,又需要重新切会话,比较麻烦,所以就定义了一个专门用来维持通信的服务,其实就是定时发送3E请求消息,ECU收到后回复7E响应的过程

P3ClientPhys

客户端在成功发送无需 响应物理寻址的请求消息后,再次发送下一条物理寻址请求消息的 最小时间间隔

什么意思?就是客户端如果发送需要响应的请求消息时,需要等收到响应后才能继续发送,然而如果发送那些不需要响应的消息时,也需要有一个最小时间间隔,不能像下饺子一样,这样服务器会无法及时响应

P3ClientFunc

客户端在成功发送 所有服务器无需响应或仅需 部分服务器响应功能寻址的请求消息后,再次发送下一条功能寻址请求消息的 最小时间间隔

 

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

常用的否定响应码

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

TesterPresent(0x3E)

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

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

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

SecurityAccess(0x27)

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

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

解锁的过程

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

27服务支持的否定响应码

CommunicationControl(0x28)

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

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

28服务支持的否定响应码

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表示动作,比如

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

用一个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服务支持的否定响应码

RoutineControl(0x31)

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

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

31服务支持的否定响应码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDS-统一诊断服务 的相关文章

  • 从Adaptive AUTOSAR的角度看SOA

    前言 身处汽车行业的我们深知 xff0c 新技术的应用或者新概念的提出 xff0c 一定是事出有因的 通常是为了抢夺新技术高地 xff0c 让汽车更好地满足未来的需求 那么 xff0c 汽车电子电气架构领域掀起的这股SOA热潮是由什么导致的
  • 什么是BSP?理解LINUX BSP

    BSP 可支持操作系统更好地运行于硬件主板 BSP xff08 Board Support Package xff09 指板级支持包 对于一般的嵌入式系统 xff0c 硬件部分需要嵌入式硬件工程师设计硬件电路 xff0c 而新出厂的电路板需
  • c++11 std::move() 的使用

    std move函数可以以非常简单的方式将左值引用转换为右值引用 xff08 左值 左值引用 右值 右值引用 参见 xff1a http www cnblogs com SZxiaochun p 8017475 html xff09 通过s
  • Adaptive AUTOSAR 学习笔记 3 - AP 背景、技术及特征

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20 11 版本 本文从AUTOSAR EXP PlatformDesign pdf开始 xff0c 一边学习 xff0c 一边顺带着翻译一下 尽力而为 x
  • MySQL导入数据(命令行、脚本方式)

    docker安装MySQL并导入数据 安装步骤省略 xff0c 详细可参考百度上文档 一 命令方式 1 把数据传进服务器中 dfc span class token annotation punctuation 64 BBC span sp
  • Linux 终端快捷键

    Linux 终端快捷键 你可能会有这样的疑问 xff1a 对于有些快捷键 xff0c 明明有等效的 一个按键就能搞定的操作 xff0c 为什么非要舍近求远 用两个组合键来实现 xff1f 当对键盘 终端命令熟练到一定程度之后 xff0c 你
  • Adaptive AUTOSAR----Adaptive studio

    Adaptive studio Adaptive Studio 是包含在 RTA VRTE SK 中的 AUTOSAR 编辑器 Adaptive studio 通过高级抽象支持所有 adaptives autosar arxml 元素的配置
  • Linux tcpdump命令详解

    简介 用简单的话来定义tcpdump xff0c 就是 xff1a dump the traffic on a network xff0c 根据使用者的定义对网络上的数据包进行截获的包分析工具 tcpdump可以将网络中传送的数据包的 头
  • 什么是 E2E 保护 ?

    安全在每个领域都是一个永恒的话题 xff0c 汽车也不例外 xff0c 而随着最近几年汽车电动化 智能化和网联化的发展 xff0c 汽车安全也越来越受到用户及开发人员的重视 xff0c 安全的要素也是多方面的 xff0c 例如用户可能关心在
  • CAN总线基础

    概述 汽车电子设备的不断增多 xff0c 对汽车上的线束分布以及信息共享与交流提出了更高的要求 传统的电气系统往往采用单一连接的方式通信 xff0c 这必将带来线束的冗余以及维修的成本的提高 单一布线连接 传统的单一通信的对接方式 xff0
  • 说一说LIN总线

    前几天小编画点时间看了一些关于LIN总线基础的内容 xff0c 把其中的关键点提取了出来 xff0c 在这里分享给大家 在这里你可能要问 不都有CAN总线了吗 xff1f 这个LIN总线又是从哪里来的 xff1f 其实理由很简单 xff0c
  • CAN FD 介绍

    随着电动汽车 xff0c 无人驾驶汽车技术的快速发展 xff0c 以及对汽车高级驾驶辅助系统和人机交互HMI需求的增加 xff0c 传统的CAN总线在传输速率和带宽等方面越来越显得力不从心 xff0c 其主要原因如下 xff1a 1 通常整
  • FlexRay 介绍

    汽车上的总线技术包括 xff1a LIN CAN CAN FD FlexRay MOST及Ethernet xff0c 我们之前已经分享了LIN xff0c CAN CAN FD总线 在开始阅读之前 xff0c 如果你对已介绍的总线技术还不
  • FlexRay总线原理及应用

    由于传统的CAN解决方案不能满足汽车线控系统 xff08 X by Wire xff09 的要求 于是在 2000 年 9 月 xff0c 宝马和戴姆勒克莱斯勒联合飞利浦和摩托罗拉成立了 FlexRay 联盟 该联盟致力于推广 FlexRa
  • SENT信号介绍

    Vehicle攻城狮 The people who are crazy enough to think they can change the world are the ones who do SENT背景介绍 提到车载总线 xff0c
  • Linux 日志管理

    常用日志文件 系统日志是由一个名为syslog的服务管理的 xff0c 如以下日志文件都是由syslog日志服务驱动的 xff1a var log boot log xff1a 录了系统在引导过程中发生的事件 xff0c 就是Linux系统
  • SPI 通讯协议

    Cuitbasics 汽车ECU设计 2 2 当您将微控制器连接到传感器 xff0c 显示器或其他模块时 xff0c 您是否考虑过这两种设备是如何相互通信的 xff1f 他们到底在说什么 xff1f 事实上电子设备之间的通信就像人类之间的交
  • UART串口通讯

    UART代表通用异步接收器 发送器也称为串口通讯 xff0c 它不像SPI和I2C这样的通信协议 xff0c 而是微控制器中的物理电路或独立的IC UART的主要目的是发送和接收串行数据 xff0c 其最好的优点是它仅使用两条线在设备之间传
  • 一文搞懂AUTOSAR的DEM模块

    Dem全称为Diagnostic Event Manager xff0c 负责故障事件的处理 故障数据的存储和管理 简单说其功能是故障事件确认前的故障debounce xff0c 故障事件确认时的故障数据存储 xff0c 故障发生后的故障老
  • linux父子进程问题——孤儿进程与僵尸进程[总结]

    今天遇到一个linux进程启动时指定Max open files不对的问题 xff0c 导致程序建立socket异常 xff0c 进而导致fullgc问题 xff0c 影响正常服务 所以顺带又温习了下linux下的父子进程的特性 孤儿进程与

随机推荐

  • C++11/14/17一些好用新特性自己整理下

    1 override xff1a 子类继承父类的时候 xff0c 子类虚函数名字写错了或者参数列表不匹配会变成另外一个函数编译器无法判断对错 xff0c 和你写不写virtual也没关系 xff0c 这时候可以在虚函数结尾加上overrid
  • vector中emplace_back方法的用途

    在写代码的过程中 xff0c CLion提醒我把 span style background color ffd900 push back span 方法替换成 span style background color ffd900 empl
  • constexper+const+常量表达式

    常量表达式 xff08 const expression xff09 是指值不会改变并且在编译过程就能得到计算结果的表达式 显然 xff0c 字面值属于常量表达式 xff0c 用常量表达式初始化的 const 对象也是常量表达式 一个对象
  • 这篇 CPU Cache,估计也没人看

    无论你写什么样的代码都会交给 CPU 来执行 xff0c 所以 xff0c 如果你想写出性能比较高的代码 xff0c 这篇文章中提到的技术还是值得认真学习的 另外 xff0c 千万别觉得这些东西没用 xff0c 这些东西非常有用 xff0c
  • 每天一个 Linux 命令

    https blog csdn net k346k346 category 9267835 html uptime 命令 1 命令简介 uptime 用于显示系统总共运行了多长时间和系统的平均负载 无选项 uptime 命令会显示一行信息
  • Docker 安装Jenkins并配置Maven

    系统环境 系统版本 xff1a Centos7 9 docker安装参考此链接 xff1a https blog csdn net clover661 article details 122226083 下载docker时候如果报错参考 x
  • 一文详解自动驾驶的运行设计域(ODD)| 自动驾驶系列

    一文详解自动驾驶的运行设计域 xff08 ODD xff09 n 自动驾驶系列 2021年4月30日 xff0c SAE发布了第四版J3016 驾驶自动化分级 xff0c 这是即2014年1月16日 2016年9月30日 2018年6月15
  • QNX BSP分析

    QNX相关历史文章 xff1a QNX简介QNX Neutrino微内核QNX IPC机制QNX进程管理器QNX资源管理器QNX字符I OQNX之编写资源管理器 xff08 一 xff09 QNX之编写资源管理器 xff08 二 xff09
  • SOA面向服务的分布式架构详解

    导语 xff1a SOA作为一种面向服务的架构 xff0c 是一种软件架构设计的模型和方法论 从业务角度来看 xff0c 一切以最大化 服务 的价值为 出发点 xff0c SOA利用企业现有的各种软件体系 xff0c 重新整合并构建起一套新
  • 自动驾驶软件架构之:中间件与SOA(一)

    本文是将中间件作为一个专题 xff0c 专门展开进行详细的分析和讨论 中间件相关技术在计算机分布式系统中发展了很多年 xff0c 尤其在互联网服务 大型商业系统中得到广泛使用 随着智能网联汽车的发展 xff0c 现代汽车也逐步增加了以太网支
  • 嵌入式系统BSP基础知识

    嵌入式系统BSP基础知识 板级支持包 BSP 是定义如何支持特定硬件设备 设备组或硬件平台的信息集合 BSP 包括有关设备上存在的硬件功能的信息和内核配置信息以及所需的任何其他硬件驱动程序 除了用于基本和可选平台功能的通用 Linux 软件
  • constexpr

    constexpr 标志返回值或者其他表达式是常量 xff0c 在编译时就会被计算出来 这个关键字常被用来 C 43 43 const 和 constexpr 的区别 xff1f 知乎 include lt iostream gt usin
  • inline namespace

    include lt iostream gt using namespace std namespace ALL namespace V2014 void fun int num cout lt lt 34 int 34 lt lt 34
  • 进程与线程

    对于操作系统来说 xff0c 一个任务就是一个进程 xff08 Process xff09 xff0c 比如打开一个浏览器就是启动一个浏览器进程 xff0c 打开一个记事本就启动了一个记事本进程 xff0c 打开两个记事本就启动了两个记事本
  • 详解SOME/IP协议文档

    以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 详解SOME IP协议文档 2 知乎 以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 SOME IP P
  • AP AUTOSAR——Update and Configuration Management UCM

    15 Update and Configuration Management 15 1 What is Update and Configuration Management 更新和配置管理是Adaptive Platform Servic
  • 基于Docker安装Jenkins并实现CI/CD实战部署

    本实践介绍了利用Jenkins和docker技术 xff0c 如何实现CI CD的各环节的步骤 xff0c 包括环境准备 xff0c 代码提交 xff0c 编译程序 xff0c 构建镜像 xff0c 部署一套完整的安装部署流程 工具介绍 x
  • 左值引用与右值引用

    include lt iostream gt using namespace std void change int amp rnum 引用就是变量名的别名 rnum 61 111 c 43 43 中能用引用的地方 xff0c 就不要使用指
  • C++ 11的移动语义

    目录 可拷贝和可移动的概念 移动构造函数和移动赋值函数 小结移动构造和移动赋值std move 使用 std move 实现一个高效的 swap 函数Move and swap 技巧参考 可拷贝和可移动的概念 在面向对象中 xff0c 有的
  • UDS-统一诊断服务

    什么是诊断服务 xff1f 在还没有诊断服务的时候 xff0c 如果车辆故障 xff0c 需要有经验的师傅长时间的摸排查找 xff0c 费时费力 而车辆的ECU节点有了诊断模块后 xff0c 就具有了诊断功能 xff0c 这样车辆如果有了故