UDSonCAN

一、概述

  UDS全称统一的诊断服务,ISO-14229系列标准。

ISO 14229-1定义了诊断服务,不涉及网络及实现,只有应用层的内容。
ISO 14229-3则定义了UDS在CAN总线上的实现。
  诊断通信的过程从用户角度来看,即诊断仪发送诊断请求(request),ECU给出诊断响应(response),而UDS就是为不同的诊断功能请求和响应之间定义了统一的内容和格式,位于OSI模型中的应用层
CAN(Controller Area Network)现场总线仅仅定义了OSI 7 层网络模型的第 1 层(物理层,见 ISO11898-2 标准)、第 2 层(数据链路层,见 ISO11898-1 标准)。在实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关软件( Software)或固件(Firmware)。

UDS在诊断中作用主要体现在以下:

  • 在诊断故障码中运用
  • 数据传输
  • 控制例程
  • 上传下载

  诊断通信的过程就是诊断仪和ECU交换数据,前者发的是request,后者发的是response,而UDS最重要的作用就是定义了这些request和response的格式及内容。
  UDS一般有两种寻址模式:

  • 物理寻址:点对点的寻址模式,一条报文对应于单独一个Server(ECU)。
  • 功能寻址:一条报文对应本网络中所有Server。

1 Request的格式

Request的格式可以分为两类:

图1 Request格式
  • Service ID长度固定为1字节,代表了这条诊断命令执行的什么功能
  • sub-function长度也为1个字节,通常表示对这个诊断服务的具体操作,比如是启动、停止还是查询这个诊断服务

  sub-function严格来说是7bit,因为最高位bit被用于抑制正响应(SPR),如果这个bit被置1,则ECU不会给出正响应;如果这个bit被置0,则ECU会给出正响应。这样做的目的是可以告诉ECU不要发不必要的response,从而节约通信资源。

  • parameter根据各个诊断服务的不同具有不同的内容,长度和格式并没有统一规格,它用于限定诊断服务执行的条件,比如某个诊断服务执行的时间等。parameter的一个重要应用是作为标识符,标识诊断请求要读出的数据内容。

2 Response的格式

分为positive和negative两种。

2.1 positive response

  意味着诊断仪发送的诊断请求被执行。
在这里插入图片描述

图2 positive response格式

  其中response SID这个字节作为诊断请求的echo,它等于SID+0x40;后面的两个部分则视具体的诊断服务而定。

2.2 negative response

  ECU因为某种原因无法执行诊断仪发过来的诊断请求,原因存在于negative response的报文中。
  格式固定为3个字节,第一个字节为0x7F,第二个字节是被拒绝掉的SID,第三个字节是这个诊断服务无法被执行的原因。比如,ECU给出7F 22 13这个negative response,则说明22这个服务因为诊断请求数据长度不对的原因无法执行。
在这里插入图片描述

图3 NRC类型

通讯标准
在这里插入图片描述

二、诊断服务

类别SID(0x)服务
诊断通讯管理功能单元10
11
27
28
3E
85
诊断会话控制
电控单元复位
安全访问
通信控制
待机握手(测试工具保持连接)
控制诊断故障代码设置
数据传输功能单元22
23
2A
2C
2E
3D
根据标识符读取数据
读取内存
读取数据(周期标识符)
动态定义数据标识符
根据标识符写入数据
写入内存
存储数据传输功能单元14
19
清除诊断信息
读取诊断故障代码信息
输入/输出控制功能单元2F根据标识符输入输出控制
远程激活程序功能单元
(例行程序功能单元)
31例程控制
上传下载功能单元34
36
37
38
请求下载
数据传输
请求退出传输
请求文件传输

10h服务

  诊断会话控制服务用于在ECU所支持的诊断会话中转换会话模式,常用的sub-function有:

  • 0x01:默认会话,ECU上电之后,默认状态

  • 0x02:编程会话,这个session中可以进行软件刷写的一系列诊断服务

  • 0x03:拓展会话,在这个session中可执行较多的诊断服务

不同会话不能随意切换,转换流程如下图:
在这里插入图片描述

27h服务

  用于在活动诊断会话中达到更高的安全级别,可能需要从security access请求来解锁并访问受保护的功能及数据(例如通过DID读取ECU ID信息),也可以用于从一个会话通过解锁以成功切换到其他会话。

  该服务在默认会话中不可用。

  安全访问是为车辆安全设计的,允许诊断设备访问ECU内部的重要数据或请求ECU执行影响车辆安全的诊断服务的授权方式。
  安全访问是通过种子-密钥(Seed-Key) 的方式实现的,未经过安全访问解锁时。ECU处于锁定状态,不允许访问重要数据(DID)/存储区域和执行某些影响车辆安全的诊断服务。需要通过安全访问的方式解锁ECU,来允许上述操作的执行。

解锁ECU需要执行如下操作:

  • 诊断设备通过UDS的安全访问服务(27服务)向ECU请求种子
  • ECU通过诊断响应,提供随机生成的种子;
  • 诊断设备收到种子后,按照事先约定的安全算法,根据种子计算密钥,并将密钥通过27服务发送给ECU;
  • ECU收到诊断设备发来的密钥后,与自身根据约定的安全算法计算的密钥进行比对。如果二者一致则通过安全访问,ECU被解锁;不一致则校验失败,ECU仍处于锁定状态。

安全访问算法:一种数字处理的函数,该函数的作用是根据输入数据计算出唯一的输出数据。

28

该服务请求ECU控制其通信行为,一个典型的示例包括要求CAN总线中的ECU关闭车载通信,以提高诊断通信的效率。

3E(TesterPresent)

  Tester Present请求通常定期发送,并包含一个功能地址,它指示测试仪仍处于连接状态,并请求ECU保持当前诊断状态,对这个服务的正响应抑制可以减少总线负载。

subfunction
0x00ECU给出response
0x80ECU不需要给出response

  一般来说主机厂会为该服务定义两个时间参数,一个参数用于规定自己的诊断仪发送0x3E服务的间隔,另一个参数用于定义ECU收不到0x3E服务的timeout时间。

三、诊断服务示例

步骤:

  1. 开启ECU
  2. 读取ECU识别码
  3. 切换到programming会话层
  4. 安全访问
  5. 烧写变体编码
  6. 编写变成日期
  7. 重置ECU

四、DTC

  诊断故障码用于汽车故障时对故障部位及原因的排查,一个DTC信息占用4个字节:
在这里插入图片描述

4.1 DTC内容

4.2 DTC状态

  DTC Status表示当前的故障处于什么状态,它由8位组成,每个位代表了不同的故障状态信息。

功能
说明
Bit 0TestFailed通常来说,ECU内部以循环的方式不断地针对预先定义好的错误路径进行测试,如果在最近一次的测试中,在某个错误路径中发现了故障,则相应DTC的这一个状态为就要被置1,表示出错。当错误消失或者诊断仪执行了清除DTC指令时,testFailed会再次被置为0.
Bit 1TestFailedThisOperationCycle标识该DTC在当前这个operation cycle是否出现过错误。
Bit 2PendingDTC表示某个DTC在当前或者上一个operation cycle中是否出现过。pending DTC=1时,DTC被存储。
Bit 3ConfirmedDTC当confirmed DTC=1时,说明某个DTC已经被存储到ECU的non-volatile memory中,说明这个DTC曾经满足了confirm条件。
Bit 4TestNotCompletedSinceLastClear用于标识自从上次调用了清理DTC的服务后,是否成功执行了对某个DTC的测试。
Bit 5TestFailedSinceLastClear标识上次执行过清理DTC之后某个DTC是否出过错。
Bit 6TestNotCompletedThisOperationCycle标识在当前operation cycle中是否成功执行了对某个DTC的测试。
Bit 7WarningIndicatorRequestedECU是否请求激活警告指示。

【注:】

  • testFailed位被置为1,但是它不一定被ECU存储到non-volatile memory中,只有当pending DTC或confirmed DTC被置为1时DTC才会被存储。而pending DTC或confirmed DTC被置1的条件应该是检测到错误出现的次数或时间满足某个预定义的门槛。

  • operation cycle的起始点是:ECU通过网络管理唤醒,到ECU通过网络管理进入睡眠。对于没有网络管理的ECU,这个起始点就是KL15通断。

  • pendingDTC是位于test failed和confirmed DTC之间的一个状态,有的DTC被确认的判定条件比较严苛,需要在多个operation cycle中出现才可以被判定为confirmed的状态,此时就需要借助pending DTC位。

  • confirmedDTC=1时,不代表当前这个DTC仍然出错。如果confirmedDTC=1,但是testFailed=0,则说明这个DTC表示的故障目前已经消失了。将confirmedDTC重新置0的方法只有删除DTC(UDS 0x14服务)。

  • test not completed since last clear只关心是否执行了测试,不关心测试结果。很多DTC的测试需要满足某些边界条件,并非ECU上电就会对DTC进行检测。

    • testNotCompletedSinceLastClear=1:自从上次清理DTC后还没有完成过针对该DTC的测试;
    • testNotCompletedSinceLastClear=0:自从上次清理DTC后已经完成过针对该DTC的测试。
  • 某些比较严重的DTC会与用户可见的警告指示相关联,比如仪表上的报警灯、文字、声音等,warningIndicatorRequested就用于此类DTC。warningIndicatorRequested=1则ECU请求激活警告指示。如果DTC不支持警告指示,则这个位永远置为0。

参考

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UdsOnCan是一种面向汽车诊断系统的通信协议,它用于在汽车电子控制单元(ECU)之间进行诊断和通信。Python是一种高级编程语言,拥有强大的数据处理和分析能力。 通过使用Python编程语言,我们可以使用UdsOnCan协议进行汽车诊断和通信。Python拥有丰富的库和工具,可以帮助我们解析和处理从汽车发送的诊断数据。 在Python中,我们可以使用不同的库来实现对UdsOnCan协议的支持。例如,可以使用python-can库来建立与汽车CAN总线的通信,并使用UDS(Unified Diagnostic Services)类来发送和接收诊断请求和响应。 通过编写Python程序,我们可以利用UdsOnCan协议获取汽车的诊断信息。我们可以发送特定的诊断请求给车辆中的ECU,如发动机控制单元、制动系统控制单元等,然后解析并分析收到的响应信息,来获取车辆的状态、故障码和诊断数据。 使用UdsOnCan和Python,我们能够开发出功能强大的汽车诊断工具。这些工具可以用于故障排除、车辆维修和性能优化。同时,也可以将这些工具与其他数据处理工具和可视化工具结合使用,进一步提高汽车诊断和维护的效率。 总的来说,UdsOnCan和Python的结合使得汽车诊断和通信变得更加容易和高效。Python的灵活性和强大的数据处理能力使得我们可以更好地处理和分析从汽车发送的大量诊断数据,从而有效地诊断和维护汽车。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值