基于Python和PYQT5实现UDS功能,与ECU应用层软件交互

        本人汽车应用层软件工程师一枚,去年入职新公司。年中突接任务,要通过上位机,实现和应用层软件标定量的交互功能(比如改标定参数,写入VIN码,更改工作时间等)。当时是一头雾水啊,毕竟入行以来一直从事的都是基于MATLAB实现应用层的逻辑搭建,根本没接触过上位机编程。没办法,再硬的骨头也只能啃啃看。由于我们ECU的供应商提供了底层UDS变量在应用层访问的可行性,又想着在前一家公司的时候,自学了一些python编程。因此初步定下了用pyqt5编写上位机界面,通过PCAN去连接ECU,用python代码实现UDS功能读、写、安全交互等服务,实现和ECU应用层标定量的交互。

        想着这样去做之后就开始行动了,先买了本书学着一点点搭上位机界面。开头是真的难,但后面不懂的就查资料,网上搜教程,倒也搭建了基本的界面,并且实现了基于PCAN的硬件连接和CAN信号接收和发送。就是下图这样

基于Python和PYQT5实现UDS功能,与ECU应用层软件交互_第1张图片

        不管怎么说算开了个头,但其实和真正要完成的任务还差的有点远。上文说过,我以前一直做的是应用层控制策略的逻辑搭建,对于UDS诊断真的完全没有概念,没有办法,又从头开始查UDS的资料,理解了什么是物理寻址,功能寻址,以及不同的服务,初步明白了对于我的上位机而言,只要实现2E写服务,27安全访问服务,22按标识符读服务等,就能基本满足要求。

        再深入了解之后,发现纯通过代码编写去实现UDS的功能是一个非常庞大的工程,比如要通过2E写服务写入17位VIN码,17个byte一帧发不完,就要考虑首帧,连续帧和ECU的流控帧回复,时间有限任务紧迫,又让我陷入了两难的境地。这时候非常感谢强大的CSDN和下面这篇博客,让我知道了原来开源的python库有成熟的UDS库,库里已经实现了tp层和服务的定义,只需要按规则定义参数和调用服务即可实现UDS功能。我把涉及到的库链接放下面了。

给我启发的这篇文章,再次表示感谢:

诊断网络层和应用层交互_用Python实现的UDS诊断工具_Raymond Fei的博客-CSDN博客

会用到的三个python的库

1)UDSONCAN:Underlying protocol (Connections) — udsoncan 0 documentation

2)  ISOTP:Examples — isotp 0 documentation

3) UDS服务CAN通道的初始化:Configuration — python-can 3.3.4 documentation

        现在回头码字的时候,寥寥数行就把整个思路都理清了,但回想当时即使摸索到了门路,实现起来依然非常的艰难。特别卡了很久的一段,是明明基于udsoncan库的说明,配置了CAN通道的时候,按定义编写了pcan的收发报文格式,但发现死活收不到ECU的响应,尝试了各种方法都毫无进展,甚至都想过放弃,直到无意中发现了上述的第三个库。。。其实可以直接调用这个库建立PCAN的CAN通道连接,真是一把辛酸泪。然后就实现了几个基本的UDS服务,实现了和ECU应用层标定量的交互,通过上位机就可以更改并且存储。通过软件逻辑的配合,使得我们的现场工程师可以直接现场标定和存储标定量。至于后面安全交互和读取总表等功能的实现,没过多久就攻克了。

        好了,抱歉废话了这么多却没干货,总得来说是想先记录一下自己的心路历程,毕竟这对于一个应用层工程师来说,还是非常有成就感的,诊断大佬请无视我。后续有人看的话,我会陆续贴上实现过程的代码。

你可能感兴趣的:(python,python,qt,交互,pyqt5)