程序员社区

如何用python操作CANoe

python如何操作CANoe

按照我以前的想法,如果CANoe想让python调用,就需要基于python开发一个集成各个功能接口的模块,python通过安装导入这个模块以及调用里面的接口实现CANoe的功能

就像这样

后来发现还是我想的简单了,运行在windows系统中的CANoe和python,完全可以借助windows系统提供的COM组件来实现互通性

COM

Component Object Model,是微软公司为计算机系统的软件生产而开发的一种新的软件开发技术,在COM框架下,能实现软件之间的互操作性

windows系统上的软件,基于COM标准,开发各种组件Component,这些组件提供各种接口,其他组件通过接口使用它们,组件需要经过注册才能被发现和使用

注册后的组件作为服务端(COM Server),其他想要调用组件接口的组件作为客户端(COM Client)

CANoe在安装完成后已经windows系统中注册了COM组件,如果想手动注册,可以在安装路径的Exec64下执行RegisterComponents.exe

如何用python操作CANoe插图1

既然CANoe在系统中注册COM组件提供了接口,那么python就可以调用这些组件接口

通过python的pywin32包中的win32com.client模块

如何用python操作CANoe插图2

CANoe COM对象层级图

可以在CANoe的help文档内查看CANoe COM的结构

如何用python操作CANoe插图3

由于windows对COM组件的标准定义就是面向对象的,所以CANoe COM接口也是面向对象的,调用时也需要以面向对象的方法来调用

就是对类(接口)实例化对象,然后调用对象里的属性、方法

比如想调用Macro,就必须获取Macros对象,而想要获取Macros,就必须获取MacroSetup…

所以正确的思路是:

先获取Application对象,然后用Application对象调用某个方法获取Configuration,然后再获取GeneralSetup…

但是这个结构图和正确的类的继承关系还是有区别的,所以我们还必须知道如何查看类的继承关系

CANoe COM接口的继承关系

可以在安装路径的Exec32 -> COMdev的CANoe.h文件查看

如何用python操作CANoe插图4

不过里面的内容都是基于C或C++的,不容易看懂,所以还是要参考help文档里的COM结构图,当然也可以参考vector提供的demo

这里面提供一些基本的方法

启动CANoe进程,其实就是获得CANoe进程对象

app = Dispatch("CANoe.Application")  

如果想再启动一个CANoe进程

app = DispatchEx("CANoe.Application")  

还可以获取CANoe的版本信息

ver = app.Version
print(ver)  

输出:CANoe.LIN.FlexRay 10.0 SP7

还可以提取出版本号

print(ver.major)  
print(ver.minor)  
print(ver.Build)  

如何用python操作CANoe插图6

打开工程文件

app.Open(path) # 这里传入工程文件的绝对路径  

如何用python操作CANoe插图7

Configuration对象

config = app.Configuration  # 获取configuration对象

它的属性

可以在help文档的CANoe COM结构图中查看

print(config.FullName) # 获取工程文件的绝对路径名  
config.Modified = True # 关闭CANoe是是否要弹出“保存工程”的提示,参考以下示图  
print(config.Name) # 获取工程文件名,不带后缀.cfg  
print(config.Path) # 获取工程文件所在路径  
print(config.Saved) # 获取工程文件是否有改动,也就是打开工程文件后是否做了些设置,导致工程文件是否要保存  

config.Modified = True

还有其他的一些属性和对象,比如SimulationSetup、TestConfigurations、TestSetup等

像TestConfigurations对象可以添加TestConfiguration

testconfigs = config.TestConfiguations  
testconfigs.Add()  

如何用python操作CANoe插图9

既然能添加,也可以删除

testconfigs.Remove(1) # 传入index,从1开始  

也可以在TestConfiguration上添加Test Unit

testconfig = app.TestConfigurations.Item(1) # Item是一个方法,不是一个属性,和help里标准的不同,这是获取某个testconfiguration  
testunits = CastTo(testconfig.TestUnits, "ITestUnits2") # 但是TestUnits的Add()方法是在TestUnits2接口上,所以需要用方法CastTo转换  
testunits.Add(path) # 这里传入testunit文件路径名,也就是vTESTstudio编译后的.vtuexe文件  

如何用python操作CANoe插图10

既然能添加,也就能删除Test Unit

testunits.Remove(1) # 传入index,从1开始  

还可以根据下标获取某个Test Unit

testunit = testunits.Item(1) # 这里的Item是方法,所以用中括号  

执行勾选的Test Unit的Test Case,其实就是点击Run图标,相当于调用所在的Test Configuration的Start()方法

testconfig.Start()  

它的方法

Configuration的方法包括

最常用的就是Save和SaveAs

Measurement

如何用python操作CANoe插图12

Measurement的常用属性就是Running,用来判断CANoe工程是否在运行

常用方法包括Start/Stop等,用来启动和停止CANoe

还有一些回调函数,用来当CANoe启动或停止时,想要实现的功能

System

System提供了操作系统变量的接口

如何用python操作CANoe插图13

系统变量位于命名空间namespace内,所以如果想创建或获取系统变量,必须先创建或获取namespace

Namespace

创建一个namespace

namespace_tests_obj = app.System.Namespaces.Add("tests") # 创建一个名为tests的namespace,并赋给namespace_test_obj  

既然能添加,也就能删除

app.System.Namespaces.Remove("tests")  

还可以获取namespace对象

namespace_tests_obj = app.System.Namespaces.Item("Engine")  

System Variables

如果想创建或获取系统变量,需要先获取某个namespace的Variables接口对象,然后调用它的方法来创建或获取system variable

namespace_tests_obj = app.System.Namespaces.Add("tests") # 先获取某个namespace  
variables = namespace_tests_obj.Variables # 再调用Variables接口对象  
variables.Add("test1") # 创建一个系统变量  

可以发现这种方式创建的系统变量在System-Defined里

当然也可以删除或者获取系统变量,这里不再赘述

其他接口,请自行验证


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 如何用python操作CANoe

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区