• 1420查看
  • 0回复

[Autosar] AUTOSAR入门-基于以太网诊断

[复制链接]


该用户从未签到

发表于 3-3-2024 09:15:53 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


AUTOSAR入门-基于以太网诊断

AUTOSAR入门-基于以太网诊断w1.jpg

    人生病比如发烧了要看病,医生通过各种手段比如把脉、拍片等了解病情,然后对症下药。汽车也一样,当一个零部件ECU出现故障的时候一般会在仪表盘上显示出来,重大故障可能车都开不了,一些小的故障参数也会记录存储到汽车的内存里面,然后利用诊断仪器连接汽车读取出来,就知道汽车啥毛病了。

    下面一步一步深入,快速了解诊断功能和AS中对应的代码,给你提供无上心法,直通最高境界。


    诊断框架

直观-》模型框架-》代码

AUTOSAR入门-基于以太网诊断w2.jpg

    上图是不是很熟悉,你到4S店做保养,肯定有这个流程。直观上看师傅手里拿的就是诊断仪器,通过物理线连接到汽车上就可以知道车是否有毛病。

AUTOSAR入门-基于以太网诊断w3.jpg

    上面介绍了4S店过程,现在先上升到模型角度,再描述下这个过程。上图中:

黄色箭头:当汽车出现故障的时候,DEM会收到故障信息,然后存储在NVRAM内存中

绿色箭头:记录故障后,如果故障影响其他功能,则FIM会禁用其他功能

蓝色箭头:诊断仪器连接汽车,经过硬件、协议栈层层软件到达DCM,然后去DEM读取故障信息。

    DCM: Diagnostic Communication Manager,诊断通信管理。实现诊断通信协议,我们通常说的UDS协议(即ISO14229,是Unified Diagnostic Services,统一诊断服务,是诊断服务的规范化标准,比如读取故障码应该向ecu发什么指令,读数据流又是发什么指令),就是在这里配置的

    DEM: Diagnostic Event Manager,诊断事件管理。就是用来记录和存储诊断事件的DTC(诊断故障码),下面连接NVRAM Manager,就是将这些诊断事件记录到EEP或者Flash中

    FIM: Function Inhibition Manager,功能禁止管理。也就是当一些error出现的时候,禁止一些功能。比如当检测到控制器过电流的时候,关闭MOS或IGBT,防止炸管。就是说有一部分SWC是需要使能条件的,这些条件取决于故障内容(就是来源于下面的DEM中),而FIM负责根据故障内容关闭一些SWC或执行一些SWC。


2. 基于以太网诊断架构

为什么诊断这么重要?

    做AUTOSAR或者汽车相关的工作,总是跟诊断有很大的关系,我感觉诊断是汽车跟外界打通的第一条路,用来检查车辆故障用。但是其他的功能一看已经有了一条路,比如OTA升级,就没必要自己开辟一条路了,直接复用这条路就可以跟汽车通信,广义的诊断其实就是汽车跟外界的通信通道。

为什么需要网络诊断?

    传统的诊断是基于CAN总线的,就是上面说的去4S店,师傅用诊断仪器通过CAN连接线连接到汽车上导出数据。很明显需要线,这有点过时了,如果像家里的无线路由器一样,通过wifi就可以诊断,或者汽车5G联网后,在任何地方都可以诊断,4S店都不用去了。这些通过以太网都可以实现。

为什么需要DoIP?

    UDS只负责诊断业务,要实现网络上传输的秘密在DoIP(Diagnostic communication over Internet Protocol)。DoIP把跟网络相关的任务都揽过去了,比如DHCP分配IP的过程,网络会话管理、网络路由等。DoIP模块解析完DoIP报文后,剥离出来UDS报文再给Dcm处理。

DoIP协议格式是什么?

计算机网络中四层网络协议栈如下:

AUTOSAR入门-基于以太网诊断w4.jpg

对应网络协议栈如下图:

AUTOSAR入门-基于以太网诊断w5.jpg

DoIP Data是应用层协议报文。

DoIP协议报文如下(参考ISO13400规范,可以关注公众号,回复ISO获取):

AUTOSAR入门-基于以太网诊断w6.jpg

可以看到应用层是可以嵌套的,这里就是DoIP协议之上还有UDS协议。

Protocol Version:版本号

Inverse version:Protocol version的取反的值

Data Type: 业务类型--重点

DataLength:数据长度

Source Address:源地址

Target Address:目的地址

UDS:UDS报文(参考ISO14229规范,可以关注公众号,回复ISO获取)

3. 诊断实操

最新的代码我添加了一个发送诊断报文的socket工具,可以git pull更新
git clone https://github.com/thatway1989/as.gitcd asgit pull./autorun.sh
cd as/socket_toolmake./send_client.sh
AUTOSAR入门-基于以太网诊断w7.jpg

上图中可以看到,发出去了两条DoIP报文,十六进制显示的,解析见下面wireshar抓包中比较清晰。下面先来看下DoIP的过程:

AUTOSAR入门-基于以太网诊断w8.jpg

激活线激活:AS代码用的虚拟机,不需要

DHCP过程:AS中直接配置死的IP 172.18.0.200,这里不需要,见代码com/as.application/common/config/SoAd_Cfg.c中
{   /* for DCM */     .SocketId = 0,     .SocketLocalIpAddress = "172.18.0.200",     .SocketLocalPort = 13400,     .SocketProtocol = SOAD_SOCKET_PROT_TCP,     .AutosarConnectorType = SOAD_AUTOSAR_CONNECTOR_DOIP, },
车辆识别:AS虚拟机中可以先省略不做这个过程,后续再研究。

路由激活:基于TCP协议,我们发送的DoIP协议报文如下:

02 fd 00 05 00 00 00 07 be ef da 00 00 00 00

利用wireshark工具在ubuntu上对tap0端口(qemu虚拟出来的)抓包对应报文如下:

AUTOSAR入门-基于以太网诊断w9.jpg

可以看到这条DoIP报文基于TCP,目的端口是13400,从172.18.0.1发给172.18.0.200,功能是0x0005 路由激活,源地址是0xbeef 激活类型是0xda

诊断请求:基于TCP协议,我们发送的DoIP协议报文如下:

02 fd 80 01 00 00 00 06 be ef fe ed 11 01

AUTOSAR入门-基于以太网诊断w10.jpg

可以看到这条报文是DoIP报文的基础上又封装了UDS报文。

DoIP报文的功能类型是0x8001诊断请求,源地址是0xbeef,目的地址是0xfeed,这些地址都是在AS代码里面规定好的,见代码com/as.application/common/config/SoAd_Cfg.c里面。

另外UDS报文里面服务id是0x11ECU复位,类型是0x01硬复位。

4. 代码实操

    这里先说下AUTOSAR规范,因为这个规范非常详细,甚至繁琐。把某个模块里面有哪些函数,哪些变量名字参数都定义好了,跟代码息息相关。这里以DoIP为例,我们找DoIP的规范:https://www.autosar.org/nc/document-search/?tx_sysgsearch_pi1%5Bquery%5D=&tx_sysgsearch_pi1%5Bcategory%5D%5B64%5D=64

打开后,如下图,点击“Specification of Diagnostic over IP”

AUTOSAR入门-基于以太网诊断w11.jpg

下载AUTOSAR_SWS_DiagnosticOverIP.pdf

打开发现全英文,不过这是一手的参考资料,我也是把这个pdf看了几遍的,能看英文就看吧。查看DoIP sws规范的第一章可以看到这么一个图:

AUTOSAR入门-基于以太网诊断w12.jpg

    图里面的箭头就是我们发包工具的包在AUTOSAR框架里面走的路:

网卡驱动-》网络接口-》网络协议栈-》SoAd模块-》DoIP模块-》PduR模块-》Dcm模块。这个pdf其他部分,讲到具体模块了再详细展开说明。这里我们先串一下代码,查看qemu运行起来telnet中的打印:

AUTOSAR入门-基于以太网诊断w13.jpg

AUTOSAR入门-基于以太网诊断w14.jpg

这个是Pci网卡驱动打印的,代码在:com/as.infrastructure/communication/Pci/pci_asnet.c

网络协议栈Arccore代码里面用的LWIP,在as/release/download/lwip/src/netif/etharp.c中的ethernet_input-》ip_input-》tcp_input-》tcp_receive里面自己加打印

AUTOSAR入门-基于以太网诊断w15.jpg

SoAd模块的打印,代码在com/as.infrastructure/communication/SoAd/SoAd.c

AUTOSAR入门-基于以太网诊断w16.jpg

DoIP模块的打印,代码在com/as.infrastructure/communication/DoIP/DoIP.c

AUTOSAR入门-基于以太网诊断w17.jpg

Dcm模块的打印,代码在com/as.infrastructure/diagnostic/Dcm/*.c中

    另外发包工具as/socket_tool文件夹下client.c和send_client.sh,了解socket编程就可以看懂,比较简单,这里不说明了。

后记:

    无上秘籍这篇文章里面就有,就看你资质如何能吸收多少了。笔者也是看AUTOSAR官网文档、Arccore源码、AS源码、csdn等研究了小半年一点一点摸索出来的,这个文章都串起来了,冰山一角已经为你打开,星辰大海等你来探索。

    后续为围绕数据报文走的路:网卡驱动-》网络接口-》LWIP网络协议栈-》SoAd模块-》DoIP模块-》PduR模块-》Dcm模块,一个一个模块的代码结合AUTOSAR规范和ISO规范进行介绍。

    Talk is cheap,show methe code!后续会继续更新,纯干货分享,无广告,不打赏,欢迎转载,欢迎评论交流!

往期回顾:

AUTOSAR入门-江湖

AUTOSAR入门-AS开源代码运行环境搭建

AUTOSAR入门-AS开源代码编译过程详解

AUTOSAR入门-AS平台工具命令和目录介绍


该用户从未签到

发表于 14-3-2025 14:38:00 | 显示全部楼层
针对AUTOSAR入门并基于以太网诊断的讨论:

尊敬的同行,您好!针对AUTOSAR入门并基于以太网诊断的问题,我们首先需要理解诊断的重要性。汽车与人的关系越来越密切,类似于人类生病了需要医生诊断治疗,汽车中的ECU和其他部件发生故障时,也需要通过诊断工具进行故障检测与修复。基于以太网的诊断已成为现代汽车领域的发展趋势。它借助网络通讯技术,实现汽车与诊断设备之间的信息交互。这不仅提高了诊断效率,还使得诊断功能更加智能化和灵活。

在AUTOSAR架构中,我们可以直观看到诊断框架的结构。它基于特定的模型框架,这些框架通过抽象层将硬件与软件分离,使得开发者可以专注于上层应用的开发。代码实现是建立在这一框架之上的关键部分。为了深入了解诊断功能和代码实现,我们可以从直观层面开始,逐步深入到模型框架和代码层面。这对于初学者来说是一个很好的入门途径。通过与在汽车行业常见的4S店保养流程对比,我们更能直观理解这一流程的实用性和必要性。对于新手而言,深入理解并掌握这些内容将会大大缩短适应期,提高工作效率。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 10:53 , Processed in 0.333869 second(s), 35 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.