第3章:Python脚本基础
各位工程师,欢迎来到Python脚本基础这一章。说实话,很多做dSPACE测试的同行一开始都问我:「我搞硬件出身,Python能学会吗?」我的回答是——能,而且必须会。因为现在的dSPACE自动化测试,Python已经成了标配语言。
3.1 Python在dSPACE中的角色
先说说Python在dSPACE里到底扮演什么角色。我个人习惯把dSPACE的测试环境比作一个乐队:ControlDesk是指挥,硬件是乐器,而Python就是乐谱。没有乐谱,乐队再牛也奏不出完整的曲子。
具体来说,Python在dSPACE中主要干三件事:
- 测试脚本编写:替代手动操作,实现一键跑完几百个测试用例
- 数据处理与分析:从测量文件中提取关键指标,生成报告
- 与第三方工具集成:比如调用MATLAB、Excel、数据库等
我在项目中遇到过最典型的场景:客户要求每天凌晨自动跑回归测试,早上9点前出报告。没有Python,这事根本干不了。你想想看,人工守着跑一夜?不现实。
核心观点:Python不是dSPACE的附属品,而是自动化测试的「发动机」。你掌握得越深,测试效率就越高。
3.2 Python语法速览
好,咱们快速过一遍Python语法。别担心,我不打算讲成大学计算机课。我只挑你在dSPACE脚本里最常用的部分讲。
3.2.1 变量与数据类型
Python的变量不需要声明类型,直接赋值就行。这一点跟C语言差别很大,我刚转过来时也适应了一阵子。
# 常见数据类型
test_name = "TC_Brake_001" # 字符串
test_id = 1001 # 整数
voltage = 12.5 # 浮点数
is_passed = True # 布尔值
measurement_list = [1.2, 3.4, 5.6] # 列表
嗯,这里要注意:列表的索引从0开始。我见过不少新手写measurement_list[1]想取第一个值,结果取到第二个,排查半天才发现问题。
3.2.2 条件判断与循环
这两个结构在测试脚本里几乎天天用。比如判断测试是否通过,或者循环处理多个测试用例。
# 条件判断
if voltage > 12.0:
print("电压正常")
elif voltage > 10.0:
print("电压偏低,需关注")
else:
print("电压异常,测试终止")
# for循环——处理列表中的每个元素
for value in measurement_list:
print(f"当前测量值: {value}")
# while循环——等待某个条件满足
while not is_signal_ready:
time.sleep(0.1) # 每100ms检查一次
我个人习惯在循环里加个time.sleep(),尤其是跟硬件交互时。为什么?因为硬件响应需要时间,不加sleep容易把dSPACE的CPU跑满,导致实时任务丢帧。我曾经吃过这个亏,调试了一整天才发现是循环太快了。
3.2.3 函数与模块
写测试脚本时,千万别把所有代码堆在一个文件里。我建议你把重复的逻辑封装成函数,把相关的函数放到一个模块里。
# 定义一个函数,用于执行某个测试步骤
def execute_test_step(step_name, duration):
print(f"执行步骤: {step_name}")
time.sleep(duration)
return True
# 调用函数
result = execute_test_step("加速测试", 2.0)
说白了,函数就是你的「乐高积木」。搭好了,以后写新脚本就是拼积木,省时省力。
小技巧:函数名最好用动词开头,比如check_voltage()、send_can_message()。这样别人看代码时,一眼就知道这个函数是干嘛的。
3.3 dSPACE Python API概览
这部分是重点中的重点。dSPACE提供了一套Python API,让你能直接操控硬件、读写信号、启动测量。我把它分成三大类来讲。
3.3.1 平台控制类API
这类API负责跟dSPACE硬件平台打交道,比如启动/停止实时模型、加载实验文件等。
| API名称 | 功能说明 | 使用频率 |
|---|---|---|
platform.start() |
启动实时模型 | 极高 |
platform.stop() |
停止实时模型 | 极高 |
platform.load_experiment() |
加载实验文件(.exp) | 高 |
platform.get_status() |
获取平台当前状态 | 中 |
我记得有一次,脚本跑着跑着突然报错,提示平台未就绪。排查后发现是platform.start()之后没有等待模型完全启动就开始操作信号了。解决方案很简单:加个状态检查循环。
# 等待平台就绪
platform.start()
while platform.get_status() != "RUNNING":
time.sleep(0.5)
print("等待平台启动...")
3.3.2 信号访问类API
这类API用来读写模型中的信号变量。说白了,就是让你能「摸到」硬件上的数据。
# 读取信号值
speed = signal.get_value("VehicleSpeed")
# 写入信号值(比如模拟油门输入)
signal.set_value("ThrottlePedal", 50.0)
# 订阅信号变化(实时监控)
signal.subscribe("EngineSpeed", callback=my_callback)
这里有个坑:信号名称一定要跟模型里定义的一模一样,大小写、下划线都不能错。我曾经因为把Vehicle_Speed写成了VehicleSpeed,排查了半小时才发现是名字对不上。
警告:写入信号值时,注意单位!dSPACE模型里通常使用物理单位(如m/s、N·m),但有些模型内部用的是百分比或原始值。写之前务必确认好单位换算关系。
3.3.3 测量与记录类API
这类API用于启动测量、记录数据、导出文件。自动化测试的核心——数据驱动——就靠它们了。
# 启动测量
measurement.start("TestRun_001")
# 记录一段数据
measurement.record(duration=5.0)
# 停止测量并保存
measurement.stop()
measurement.export("C:\\Data\\test_result.mat")
我个人习惯在每次测试开始前,先清空上一次的测量数据,避免新旧数据混在一起。代码很简单:
# 清空旧数据
measurement.clear()
print("旧数据已清除,开始新测试...")
3.4 一个完整的脚本示例
光讲理论不过瘾,咱们来个完整的例子。这个脚本模拟了一个简单的刹车测试:踩下刹车踏板,记录车速变化,判断是否在合理范围内。
import time
from dspace import platform, signal, measurement
def brake_test():
# 1. 准备阶段
print("=== 刹车测试开始 ===")
platform.load_experiment("BrakeTest.exp")
platform.start()
time.sleep(1) # 等待模型稳定
# 2. 执行测试
signal.set_value("BrakePedal", 100) # 踩死刹车
measurement.start("Brake_Test_001")
time.sleep(3) # 记录3秒数据
measurement.stop()
# 3. 读取结果
final_speed = signal.get_value("VehicleSpeed")
print(f"刹车后车速: {final_speed} km/h")
# 4. 判断结果
if final_speed < 1.0:
print("测试通过:车辆已停止")
return True
else:
print("测试失败:车辆未完全停止")
return False
# 5. 清理
platform.stop()
# 运行测试
result = brake_test()
这个脚本虽然简单,但包含了自动化测试的完整流程:准备→执行→采集→判断→清理。你可以在它的基础上不断扩展,比如加个循环跑多个测试用例,或者把结果写入Excel。
总结一下:Python在dSPACE里不是花架子,是实打实的生产力工具。语法不用学太深,够用就行。API也不用全记住,常用的就那么几个。关键是——多写、多跑、多调试。遇到问题别慌,先看报错信息,八成是信号名写错了或者平台没启动。
好,这一章就到这里。下一章咱们会深入讲自动化测试框架的设计,到时候我会分享一个我实际用过的框架模板,保证让你少走弯路。