分享好友 资讯首页 频道列表

使用Python访问CANoe COM接口实践

2021-03-01 10:43
CANoe提供的COM接口使得外部脚本能够访问或控制CANoe软件,从而实现自动化测试任务,而易用且具有丰富生态的Python无疑是一个很好的选择。 本文将介绍CANoe COM基本构成、常用COM对象以及Python脚本调用CANoe COM的方法 ,在此之前,先介绍一些基本概念。

CANoe COM Server& Python pywin32

COM全称Component Object Model,是微软为Windows平台软件提出的、实现软件之间互操作的标准。它不会规定软件的具体实现,而是声明一种对象模型,使得满足这种模型的对象之间能交互,这些对象通常被称为组件(Component)。组件会实现特定的功能,而这些功能以特定的方式提供——即接口(Interface),其他组件通过接口使用它们。另外,组件需要经过注册(Registry),才能被其他软件发现和使用。注册后的组件向其他软件提供服务,因此组件将作为服务端(COM Server),其他想要使用服务的作为客户端(COM Client)。

在安装完成CANoe软件后,CANoe已经在Windows组件服务管理器中注册了CANoe COM Server,如果需要重新注册,可以在安装目录下(默认为C:\Program Files\Vector CANoe 14)的Exec64文件夹中找到RegisterComponents.exe,运行即手动注册。

Python pywin32 package,它提供了许多Python扩展以调用Windows API,其中就包括COM组件。由于Python脚本将使用CANoe COM提供的服务,因此Python脚本将作为COM Client,在pywin32包中就对应win32com.client模块,所以后续的Python脚本都要导入win32com.client模块。

了解以上的概念后,下面就看看本文的主要内容 

COM Object Hierarchy

在CANoe中,各个功能模块按照一定的层级组织在一起构成整个CANoe软件。与这些功能模块直接相关的COM组件同样也是按照相应的层级组织的,这就形成了COM Object Hierarchy:


如上图所示,图的最左侧是Application对象,是访问其他对象的入口;通过它可以访问Configuration对象,而通过Configuration对象才能访问CommunicationSetup对象;

要想设置CommunicationSetup,就需要按照Application->Configuration->CommunicationSetup从左向右的层级顺序,找到相应的属性或是方法,从而实现设置。

Type Library

了解COM Object Hierarchy能帮助快速找到所需功能,但是不能知道实现所需功能对象的继承关系,为此还需要了解CANoe Type Library。

在CANoe软件安装目录下(默认为C:\Program Files\Vector CANoe 14)的Exec32\COMdev目录中包含了注册COM所用的类型库,如下图所示CANoe.h头文件:
 

在CANoe.h头文件中包含所有CANoe COM对象的接口定义,比如ITestConfiguration接口: 
 

而如果想要设置TestConfigurationSettings对象,从COM Object Hierarchy得知需要从TestConfiguration对象访问: 


但是在Type Library中Configuration对象有多个ITestConfiguration接口,比如: 
 
 
可以看到,ITestConfiguration2继承自ITestConfiguration,在它的基础上又扩充了许多方法,比如获取TestConfigurationSettings对象的方法get_Settings就在其中。

也就是说,要通过实现了ITestConfiguration2接口的TestConfiguration对象的get_Settings方法,才能获得TestConfigurationSettings对象。

为此, 通过win32com.client模块中的CastTo方法 ,能将TestConfiguration转换成基于ITestConfiguration2接口的对象。 

COM Object

COM Object Hierarchy中有许多COM对象,短时间内掌握所有COM对象是不现实的, 下面仅针对常用的、与自动化测试紧密相关的COM对象做介绍。

Application

使用Python控制CANoe,首先要获取关联整个CANoe进程的COM对象,也就是Application对象。 通过Dispatch方法就可以获得关联到当前CANoe进程的COM对象 , 如果当前并没有CANoe进程 ,则会启动一个CANoe进程; 而如果想要另外获得一个CANoe进程,则可以使用DispatchEx方法 。

下面是获取Application对象的代码示例: 
 
 

来源:北汇信息

作者:北汇信息 邓淇夫

评论 0
同类信息