1. 项目执行前提

  1. 操作系统必须问 Windows,且已安装 CANoe。
  2. 项目目录下需要有 CANoe 封装类。核心封装文件是:class_canoe_com.py ,需将该文件放入你的项目目录中。
  3. CANoe 的 COM Server 需要已正确注册(可以打开 Vector Tool Manager 查看或配置)。正常安装 CANoe 后通常已经具备该能力。
  4. class_canoe_com.py 使用了 win32com.client,它来自第三方库 pywin32,需安装:
pip install pywin32
  1. 需要一个可打开的 CANoe cfg 工程文件。
  2. Cfg 工程中需配置 measurement start 之后自动 start test module: a. 在工具栏点击Test -> Test Setup打开“Test Setup for Test Modules”窗口 b. 选中某个test module,右击,选择“Configuration…” python-canoe-1 c. 在弹出的Configuration窗口中选择start immediately。如图所示还可以通过控制环境变量等方法来使test module运行,方法灵活可自行选择。 python-canoe-2

2. 最小可行性代码

/项目目录
  ├ class_canoe_com.py    # COM 接口调用封装
  ⎿ py_execution.py       # 执行业务逻辑
import time
from class_canoe_com import CANoe

cfg_path = r"C:\your\canoe\project\example.cfg"

app = CANoe()               # 创建实例
app.open_cfg(cfg_path)      # 打开你的cfg文件
time.sleep(5)               # 延迟时间可自行调整

app.start_Measurement()     # cfg 工程 start measurement,由于上文配置,test module 已自动执行

while app.application.Measurement.Running:
    status = app.get_SysVar("TestModule", "TestModuleStatus")    # 下方有详细说明
    # 如果 test module 运行完毕, stop measurement
    if status == 3 or status == 4:
        time.sleep(10)
        app.stop_Measurement()
        break

time.sleep(5)
app.close_cfg()

有关通过 TestModuleStatus 系统变量获得 test module 状态的详细方法说明:

  1. 新建一个系统变量
  2. 在 test module configuration 窗口中,“Test Module State:” 项中绑定刚才建的系统变量 python-canoe-3
  3. 绑定的变量用于反应test module的状态值,状态值共有5种,可在vector官网help(搜索Test Module Configuration Dialog)中找到具体定义: python-canoe-4
  4. python中,监控此状态变量并获得test module测试结束时间点,然后stop measurement:(注意前后的 time sleep,practice 过程中可能还需要调整延时时间长短,否则可能会出现get不到正确的状态值)

3. 核心原理

这个示例不是直接实现 CANoe 内部调用的逻辑,而是通过 Windows COM 自动化接口控制 CANoe 软件。

本项目中的封装类位于 class_canoe_com.py:

from win32com.client import *

self.application = DispatchEx("CANoe.Application")

DispatchEx("CANoe.Application") 会启动一个 CANoe 应用实例。后续 Python 代码通过这个实例调用 CANoe 暴露出来的 COM API,例如:

  • 打开 CANoe 工程:application.Open(cfgname)
  • 启动 Measurement:application.Measurement.Start()
  • 停止 Measurement:application.Measurement.Stop()
  • 读取 System Variable:application.System.Namespaces(...).Variables(...).Value
  • 关闭 CANoe:application.Quit()

也可不使用封装类文件,方法灵活可自行选择。