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
既然CANoe在系统中注册COM组件提供了接口,那么python就可以调用这些组件接口
通过python的pywin32包中的win32com.client模块
CANoe COM对象层级图
可以在CANoe的help文档内查看CANoe COM的结构
由于windows对COM组件的标准定义就是面向对象的,所以CANoe COM接口也是面向对象的,调用时也需要以面向对象的方法来调用
就是对类(接口)实例化对象,然后调用对象里的属性、方法
比如想调用Macro,就必须获取Macros对象,而想要获取Macros,就必须获取MacroSetup…
所以正确的思路是:
先获取Application对象,然后用Application对象调用某个方法获取Configuration,然后再获取GeneralSetup…
但是这个结构图和正确的类的继承关系还是有区别的,所以我们还必须知道如何查看类的继承关系
CANoe COM接口的继承关系
可以在安装路径的Exec32 -> COMdev的CANoe.h文件查看
不过里面的内容都是基于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)
打开工程文件
app.Open(path) # 这里传入工程文件的绝对路径
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) # 获取工程文件是否有改动,也就是打开工程文件后是否做了些设置,导致工程文件是否要保存
还有其他的一些属性和对象,比如SimulationSetup、TestConfigurations、TestSetup等
像TestConfigurations对象可以添加TestConfiguration
testconfigs = config.TestConfiguations
testconfigs.Add()
既然能添加,也可以删除
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文件
既然能添加,也就能删除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的方法包括
Measurement
Measurement的常用属性就是Running,用来判断CANoe工程是否在运行
常用方法包括Start/Stop等,用来启动和停止CANoe
还有一些回调函数,用来当CANoe启动或停止时,想要实现的功能
System
System提供了操作系统变量的接口
系统变量位于命名空间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") # 创建一个系统变量
当然也可以删除或者获取系统变量,这里不再赘述
其他接口,请自行验证