精准的电源控制,是车载 ECU 测试稳定与高效的基石。
本文将探讨一种在车载测试中,通过 Python 与 CAPL 协同控制程控电源的解决方案。该方案旨在绕过传统 RS232 协议的某些限制,利用 TCP/IP 网络协议实现更灵活、高效的电源控制,特别适用于对时序有严格要求的测试场景。
整体架构
本次设计的核心是构建一个 'CAPL 调度 - Python 执行 - 状态回馈' 的闭环控制链。其工作流程清晰,职责分明:
- CAPL 发起控制:在 CANoe 测试用例中,CAPL 脚本整合控制参数(如 IP、通道、模式、电压值等),通过
sysExec函数调用打包好的 Python 程序。 - Python 执行与通信:Python 程序接收参数,通过 TCP 协议与 N39400 程控电源通信,发送指令并循环查询实际输出值,直至与设定值一致。
- 状态直接回馈:Python 通过 COM 接口直接操作 CANoe 实例,修改其内部系统变量,将执行结果(成功/失败)实时反馈。
- CAPL 确认结果:CAPL 脚本轮询该系统变量,确认电源控制命令已执行成功,从而决定测试流程的走向。
实现过程
1. Python 实现:核心控制引擎
Python 脚本的核心是 N39400PowerSupply 类,它封装了与电源的所有 TCP 通信细节。
关键设计思路
- 健壮的连接管理:在
__init__中建立 socket 连接并设置超时,确保网络异常能被及时捕获。 - 指令与验证循环:在
set_power_state和set_voltageANDcurrent方法中,发送控制指令后,会循环调用read_volatageANDcurrent方法进行验证(最多 200 次),确保电源输出稳定在目标值。 - 高效的 CANoe 状态反馈:通过
canoe_communicate类,利用win32com.client直接操作 CANoe 的 COM 接口。成功时,直接修改 CANoe 中的系统变量powerSupply::excute_status为 1,实现 '零延迟' 状态同步,摒弃了低效且不可靠的文件交互方式。
代码要点与参数解析
import socket
import sys
import argparse
import time
import math
from win32com.client import Dispatch
class canoe_communicate:
@staticmethod
def info_excute_status():
"""通过 COM 接口,直接设置 CANoe 系统变量"""
Capp = Dispatch("CANoe.Application")
try:
sys_namespace = Capp.System.Namespaces()
target_variable = sys_namespace.Variables()
target_variable.Value =
()
Exception e:
()
:
():
:
.socket.send(.encode())
time.sleep()
.socket.send(.encode())
attempt ():
time.sleep()
.read_volatageANDcurrent(channel, voltage, ):
canoe_communicate.info_excute_status()
Exception e:
():
parser = argparse.ArgumentParser(description=)
parser.add_argument(, =, required=, =)
parser.add_argument(, =, default=, =)
parser.add_argument(, =, default=, =)
parser.add_argument(, =, required=, =)
parser.add_argument(, =, required=, =)
parser.add_argument(, =, required=, =)
parser.parse_args()
__name__ == :
args = parse_args()
ps = N39400PowerSupply(args.ip, args.port)
ps.close()

