基于Python的汽车CAN总线报文格式转换系统的设计与实现
2021-07-05刘淞铭马洪彦王贵山佟新禹张成庆王家雁
刘淞铭,马洪彦,王贵山,佟新禹,张成庆,王家雁
(东风汽车股份有限公司商品研发院,湖北 武汉 430000)
1 引言
近年来,汽车电子系统的功能越来越强大,其电子控制单元(Electronic control unit,ECU)越来越多,各ECU之间的信息交换主要依赖于车载网络技术,而控制器局域网络(Controller area network,CAN)总线作为车载网络系统的重要组成部分,在汽车电子系统的网络通信与控制中得到广泛应用[1-2]。
在汽车行业中,CAN总线报文的分析贯穿于汽车电子系统开发的全过程,从前期的系统开发,到中期的系统标定,再到后期的系统维护,都依赖于CAN总线报文的分析,CAN总线报文是汽车开发、调试、维护过程中分析解决问题的“第一手数据”。然而,目前市面上的CAN总线报文采集与录制工具种类繁多,不同工具录制的报文格式往往不同,具体体现在报文文件类型不同或报文信息排列方式不同,因此,报文文件往往只能通过录制报文时所采用的上位机工具或其同一公司的分析工具进行解析。在实际开发过程中,开发人员经常要解析不同公司录制的报文,如主机厂解析供应商录制的报文,如果没有相应的报文解析工具,报文分析过程将会异常繁琐甚至无法进行。
现目前,应用比较广泛的CAN总线报文格式转换工具为德国PEAK-System公司提供的PEAK-Converter软件,此软件实现了部分报文格式的转换,但此软件只支持目前国际上应用比较广泛的报文格式,对于国内开发的CAN卡录制的报文格式以及一些小众的报文格式则无法提供很好的支持。一些国内的CAN卡厂家也开发了面向自家产品的报文格式转换工具,但其一般只支持自家产品录制报文的格式转换,且大多并未得到广泛的应用。综上所述,现目前国内亟须开发一种低成本、通用性强、二次开发方便的CAN总线报文格式转换系统。
本文旨在开发一种CAN总线报文格式转换系统,实现CAN总线报文文件格式转换的功能,进而解决汽车电子系统开发过程中因CAN总线报文文件格式的多样性给报文分析带来的诸多困难,提高开发效率。
2 系统架构
本系统面向的报文录制软件为目前现场应用比较广泛的CAN Test和ECAN Tools软件,具体包括5种格式的报文:由CAN Test录制的*.txt格式报文、*.csv格式报文以及由ECAN Tools录制的*.txt格式报文、*.csv格式报文、*.can格式报文。
本系统面向的报文分析软件为德国Vector公司开发的CAN open environment(CANoe)软件,即将上述5种格式的报文转换为CANoe软件能够直接解析的*.asc格式报文。
本系统基于Python语言实现CAN总线报文格式转换功能,从整体架构上分为3个层次:工具层、应用层和人机交互层,如图1所示。
图1 系统整体架构图
工具层是一系列通用方法的集合,按原始报文录制工具分类,定义了报文处理过程中的通用方法,供应用层中的报文类继承。应用层是报文属性与非通用方法的集合,按报文格式分类,分别定义了不同格式报文具有的不同属性及处理不同格式报文过程中用到的个性方法,并继承了工具层中定义的通用方法,负责实际的报文格式转换过程。目标格式报文类定义了目标报文的属性,并提供了生成及储存目标格式报文的方法。同时,目标格式报文类提供了与原始报文类之间的通用化接口,只需在二次开发接口中添加相应的属性和方法,便可实现系统的功能拓展。人机交互层提供了用户的操作界面以及系统状态的指示界面,是用户与系统之间沟通的桥梁。
本系统主要由3个功能模块组成,分别为:人机交互、数据处理、目标格式报文生成。系统整体流程如图2所示。人机交互主要包括原始报文路径的选择、目标报文路径的选择、原始报文录制工具的选择、原始报文录制格式的选择、系统工作状态的提示等,并实现将原始报文中包含的信息和数据传递给系统应用层的功能。数据处理包括数据的提取、Time转换、Channel转换、ID转换、Dir转换、Message转换等,实现将原始报文中的信息和数据按一定的规则存储在原始报文对象的属性中,并通过通用化接口将这些属性传递给目标格式报文对象。目标格式报文生成包括数据重组、数据写入、目标格式报文文件生成等,实现将接收到的报文对象属性按一定的规则重组为CANoe能够直接解析的格式,并生成新的报文文件。
图2 系统整体流程图
3 系统功能
Python是一种面向对象的、交互式的、解释型的计算机编程语言,具有实用性强、功能全面、性能高的特点,拥有丰富的标准库和第三方库[3]。本系统基于Python3平台,通过面向对象开发方式进行软件开发。
3.1 人机交互功能
本系统的人机交互功能基于Qt的Python库——PySide2实现,PySide2提供了Python与Qt之间的接口,通过调用PySide2中的API,便可以快速完成GUI应用程序的创建。
系统主界面包括:原始报文路径和目标报文路径的选择和显示、原始报文录制工具和格式的选择、开始转换按钮。对于原始报文路径和目标报文路径的选择和显示,通过QPushButton类和QLineEdit类创建对象push_button_om(原始报文选择按钮)、line_edit_om(原始报文路径显示框)、push_button_tm(目标报文选择按钮)、line_edit_tm(目标报文路径显示框),通过QFileDialog类中的getOpenFileName方法和getSaveFileName方法实现文件的选择和文件路径的获取,并将返回的文件路径分别传递到UI界面的报文路径显示框和系统的应用层中。对于原始报文录制工具和格式的选择通过QComboBox类创建对象combo_box_tool(工具选择框)和combo_box_format(格式选择框),并通过currentText方法获取用户当前选项并传递到系统的应用层中。系统主界面效果如图3a所示。
状态提示界面包括转换进度条界面和转换完成提示界面。其中转换进度条界面通过QProgressBar类创建进度条对象并调用相关方法来实现,转换进度条界面和转换完成提示界面如图3b、图3c所示。
图3 人机交互界面效果展示
使用时,用户分别在主窗口选择“原始报文路径”、“目标报文路径”、“录制工具”及“报文格式”后,点击“转换”按钮,系统将开始报文格式转换并弹出转换进度条界面,提示用户转换进度,转换完成后,系统将弹出转换完成提示界面,提示用户转换完成。
3.2 数据处理功能
3.2.1 原始报文格式分析要实现信息提取的功能,首先要了解原始报文的记录规则。本文以ECAN Tools软件录制的*.can格式报文为例进行分析,图4是一段ECANTools_*.can格式的报文范例。
图4 ECANTools_*.can报文范例
ECAN Tools软件的用户手册中对*.can格式的报文进行了介绍,每条报文中包含的数据可以分为5组。第1组表示帧时间间隔,记录格式为:s.ms.μs;第2组表示此条报文为标准帧还是扩展帧,标准帧为0,扩展帧为1;第3组表示此条报文为数据帧还是远程帧,数据帧为0,远程帧为1;第4组和第5组分别用于记录帧ID和帧数据,具体如图5所示。
图5 ECANTools_*.can报文格式
3.2.2 模块功能
数据处理功能是本系统的核心功能。此模块的代码主要包括通用方法类和原始报文类,通用方法类为原始报文类提供一系列方法,原始报文类则执行具体任务。数据处理功能的实现主要分为两个部分:第1部分,系统分别将原始报文以参数的形式逐条传递给原始报文类,原始报文类分别为每条原始报文创建一个通用化报文对象,通用化报文对象调用原始报文类中的方法将原始报文中的信息提取出来并转换为通用化的格式(符合目标格式报文类通用化接口规定的格式)存储在对象的属性中;第2部分,系统分别将通用化报文对象以参数形式逐条传入目标格式报文类,提供给目标格式报文生成模块使用。数据处理模块的工作流程如图6所示。
图6 数据处理流程图
3.3 目标格式报文生成功能
3.3.1 目标报文格式分析
CANoe软件的说明文档《CAN_LOG_TRIGGER_ASC_Format》中规定了*.asc格式报文的记录方式。文件的开头需要声明报文记录的开始时间、信息记录方式和时间戳格式,文档中规定信息记录方式可以为十六进制(“base hex”)或十进制(“base dec”),时间戳可以为绝对时间戳(“timestamps absolute”)或相对时间戳(“timestamps relative”)。本文选用十六进制和绝对时间戳的记录方式。
文档中规定的报文记录的内容包括:时间、通道序号、报文ID、报文传输方向、信息长度、信息、特殊消息标志,具体如图7所示。
图7 *.asc报文格式
报文文件以“End TriggerBlock”结束,因此,完成数据录入后,需要在文件结尾输入“End TriggerBlock”,表示记录结束。
3.3.2 模块功能
此模块的功能主要包括数据重组、数据写入、文件生成。系统将数据处理模块创建的通用化报文对象以参数形式传递给目标格式报文类,目标格式报文类创建目标报文对象接收通用化报文对象中包含的数据,并按照规定的格式进行组合,组合完成后,系统将重组后的数据写入文件中。本模块的部分实现代码请详见附录1。
3.4 多线程工作模式
上述功能如果均在系统主线程中执行,会导致本系统无法同时进行多个报文格式转换任务,此外,在报文格式转换任务进行的过程中,系统的主界面也将无法操作。为了进一步优化系统性能,实现多任务同时处理的功能,本系统采用多线程工作模式。
本功能通过Python3的标准库threading实现。本系统的人机交互模块在系统主线程中执行,系统中的数据处理模块和目标格式报文生成模块则封装到子线程调用函数中,当用户发起“转换”指令后,系统将为此任务创建一个子线程,并在子线程中执行数据处理和目标格式报文生成的工作。系统会为每项“转换”任务分别创建一个子线程,并在任务结束后关闭对应的子线程。
4 实验测试
4.1 实验搭建
本文中报文采集的硬件工具为:德国Vector公司的VN1630A和国产的CAN总线分析仪USBCAN-ⅡC,报文录制的软件工具为:CANoe 11.0 SP3、CAN Test 2.70、ECAN Tools 5.99,报文分析软件工具为:CANoe 11.0 SP3。IDE环境为PyCharm。报文采集硬件工具如图8所示,其中图8a为VN1630A,图8b为USBCAN-ⅡC。
图8 报文采集硬件工具
4.2 实验结果分析
将USBCAN-Ⅱ C与Vector VN1630A同时接入某新能源纯电动汽车的同一路CAN总线中,分别通过CAN Test2.70、ECAN Tools 5.99软件录制CANTest_*.txt、CANTest_*.csv、 ECANTools_*.txt、ECANTools_*.csv、ECANTools_*.can格式的报文作为原始报文,通过CANoe 11.0 SP3软件录制*.asc格式的报文作为参照报文,分别通过本文中开发的系统将上述5种格式的原始报文转换为*.asc格式,并将转换完成后的报文与参照报文分别导入CANoe 11.0 SP3软件中进行数据分析,由于汽车CAN总线报文中包含大量的信息,本文选取整车绝缘电阻值作为分析对象,具体分析结果如图9所示,其中每组图像上部分为参照报文的分析图像,下部分为本系统转换得到的报文的分析图像,两者在时间轴上的偏差为报文录制开始时间不同步导致。
图9 测试数据分析图像
通过对以上5组数据的对比分析可知,本系统能够将上述5种格式的报文转换为*.asc格式的报文供CANoe软件进行分析,本系统对CAN Test和ECAN Tools这两款软件录制的报文均具有较好的兼容性,且转换过程不会导致信息丢失或改变,符合设计要求。
5 结语
本文利用Python语言实现了一种汽车CAN总线报文格式转换系统,本系统具有性价比高、通用性强的特点,并针对小众报文格式提供了灵活的二次开发接口,增强了系统的兼容性,同时其多线程工作模式保证了系统的工作效率。经实验测试,本系统能够高效、准确地实现报文格式的转换功能,给汽车电子电器工程师的开发工作提供便利。
附录1
目标格式报文生成模块部分代码如下: