Python调用CANape读取和写入XCP Device的变量实现自动化标定
1. 背景及概要
Vector现在对于Python的支持越来越丰富了,最近知道了Python 可基于 CANape 的 COM 接口调用 CANape,实现对 ECU 的测量标定等功能,这对于之前一直使用内置脚本的我来说简直是福音,下面就记录一下Python调用CANape实现自动化标定的相关操作。
注意:CANape 从 15SP3 及以后版本支持 64bit COM 接口,如使用 Python 64bit,请确认 CANape 版本,否则会提示”Class not registered”报错。
2. 准备工作:
- 在CANape中配置好XCP工程,如果不知道如何配置,可以参考我之前的文章CANape XCP on Eth工程创建或者CANape XCP on CAN工程创建;
- 根据工程配置,连接CANape和ECU;
- 手动调试XCP工程,打开就能自动online即可。
3. 接口介绍
根据Vector提供的接口,我进行了封装,根据以下接口来进行标定的读写。
-
CANape启动接口
# 启动CANape软件并打开要测试的工程 def boot_CANape_project(project_path): # 启动CANape软件 canape = win32com.client.Dispatch('CANape.Application') print('\n') print('CANape dispatched.') # 打开对应路径的工程项目 canape.Open1(project_path, 1, 50000, True) print('CANape initialized.') return canape
-
CANape和ECU建立XCP连接的接口
# 选择工程中已经创建好的xcp Device和a2l文件,从而创建device句柄,并自动连接到ECU def create_xcp_device_handle(handle, device_name, a2l_name): dev = handle.Devices.Add(device_name, a2l_name, "XCP", 1) print('Device \'' + device_name + '\' added.') return dev
-
创建变量对象的接口
# 通过已创建的device句柄添加标定变量,并创建变量对象 def add_calibration_object(dev, object_name): dev.CalibrationObjects.Add(object_name) calob = dev.CalibrationObjects.Item(object_name) print(object_name + ' added as calibration object.') return calob
-
标定变量读接口
# 标定标定变量 def calibration_read(xcp_dev, signal_name): # 通过已创建的device句柄添加标定变量,并创建变量对象 calbration_object = add_calibration_object(xcp_dev, signal_name) # 先读取一遍标定量的值以便于后面验证是否标定成功 calbration_object.Read() myValue = calbration_object.Value print('Value of before changed: %i.' % myValue) return myValue
-
标定变量写接口
def calibration_write(xcp_dev, signal_name, value): # 通过已创建的device句柄添加标定变量,并创建变量对象 calbration_object = add_calibration_object(xcp_dev, signal_name) # 先读取一遍标定量的值以便于后面验证是否标定成功 calbration_object.Read() myValue = calbration_object.Value print('Value of before changed: %i.' % myValue) # 改变标定量的值 calbration_object.value = value calbration_object.write() # 再次读取标定量的值,确认是否修改成功 calbration_object.Read() myValue = calbration_object.Value print('Value of after changed: %i.' % myValue)
-
开始监测接口(自带接口)
canape.Measurement.Start()
-
结束监测接口
def stop_measurement(app_handle): time.sleep(10) app_handle.Measurement.Stop() print('\nStop the measurement.....\n') print('\nExit CANape...Thank you for using!\n')
-
停止工程接口
def quit_CANape(app_handle): time.sleep(10) print("quit CANape...") app_handle.Quit()
4. 使用示例
- 官方示例
- 下载入口
- 文件结构如下:
- 我的示例(仅修改KBExample.py)
# ---------------KBExample.py--------------------- if __name__ == "__main__": # 启动CANape软件并打开要测试的工程 project_path = "../xcp_test" canape = boot_CANape_project(project_path) # 选择工程中已经创建好的xcp Device和a2l文件,从而创建device句柄,并自动连接到ECU device_name = "hmi" a2l_name = "xxx.a2l" xcp_dev = create_xcp_device_handle(canape, device_name, a2l_name) # 开始启动工程 print('Start the measurement.....') canape.Measurement.Start() # 循环自动标定变量 for i in range(10): signal_name = "a2l文件中的变量1xxxxxx" calibration_write(xcp_dev, signal_name, 3) time.sleep(0.5) calibration_write(xcp_dev, signal_name, 5) time.sleep(0.5) signal_name = "a2l文件中的变量2xxxxxx" result = calibration_read(xcp_dev, signal_name) print("fcw count is %d", result) # 停止工程 stop_measurement(canape) # 杀掉CANape运行进程 canape.Quit()