1. 课程导入与实验室测试自动化全景
在电子测量实验室里,工程师每天面对的工作往往不是"测一次",而是"反复测、批量测、按标准测、测完还要出报告"。一台示波器、一台频谱仪、一台信号源、一台电源,单机操作时都很直观;但当被测对象从一块板子变成几十块板子,从一次验证变成每天回归,从一个人记录变成团队共享结论时,手工点击、手工截图、手工填表的模式就会迅速成为瓶颈。本课程要解决的,正是这条从"仪器操作"到"自动化测试"再到"报告工程"的完整链路。
为什么实验室需要自动化
手工测试的痛点通常集中在四个方面。第一是重复性:同一组测试项在不同样机上重复执行,人工操作容易漏项、错序。第二是一致性:不同工程师设置仪器的方式不同,比如同样的电源上电斜率、同样的示波器时基和触发条件,稍有差异就会导致结果不可比。第三是可追溯性:手工记录的数据散落在截图、Excel 和笔记本里,几个月后很难还原当时的测试条件。第四是报告效率:测试本身可能只占 30% 时间,剩下 70% 花在整理数据、画图、写结论上。
自动化的价值不是"让机器替人按键",而是把测试条件、测量数据、判定规则、报告输出四件事固化成可重复执行的流程。Keysight 的测试自动化体系正是围绕这条主线构建的:底层是仪器控制与驱动,中层是测试序列与数据管理,上层是结果判定与报告生成。
典型场景与技术栈组成
在实验室中,最常见的自动化场景包括:电源时序与纹波测试、放大器增益与失真扫描、滤波器频率响应测试、数字接口眼图与抖动测试、以及多仪器协同的收发链路验证。这些场景的共同点是:需要多台仪器按顺序动作,需要采集多组数据,需要按标准判定合格与否。
Keysight 生态中,技术栈通常分为四层。最底层是仪器与接口,包括示波器、频谱仪、信号源、电源、万用表等,通过 LAN、USB 或 GPIB 接入。第二层是驱动与通信,常用的是 IVI 驱动、VISA 库以及 SCPI 命令集,Python 环境下常用 PyVISA 作为通信入口。第三层是测试执行框架,可以用 Python 脚本、Keysight Test Flow、或基于 pytest 的自定义框架来组织测试序列。第四层是数据与报告,把测量结果写入 CSV、SQLite 或数据库,再用 Python 的 pandas、matplotlib 或报告模板生成 HTML/PDF 报告。
从手动测试到自动化报告流水线
理解这条链路,最有效的方式是看一次完整的执行过程。假设我们要对一块 DC-DC 电源模块做上电时序与输出纹波测试。手动模式下,工程师会先设置电源输出 5V、限流 1A,用示波器探头接输出端,设置时基 10ms/div、垂直档位 500mV/div,然后按下面板上的 Run 键,观察波形并截图。这个过程重复 20 次,每次记录数据,最后整理成报告。
自动化模式下,同样的任务会被拆成可执行的代码逻辑。第一步是建立连接:通过 PyVISA 获取电源和示波器的 VISA 地址,例如 USB0::0x2A8D::0x1301::MY12345678::INSTR,并确认 *IDN? 返回正确的型号。第二步是配置仪器:用 SCPI 命令设置电源电压、限流,设置示波器时基、垂直档位、触发方式。第三步是执行测量:打开电源输出,等待稳定时间,触发示波器采集,读取纹波峰峰值。第四步是判定与记录:将测量值与规格上下限比较,写入结果文件。第五步是生成报告:把多次测量结果汇总,绘制趋势图,输出带判定结论的 HTML 报告。
这里有一个关键认知:自动化不是把手工步骤简单翻译成代码,而是要把测试意图抽象成可参数化的流程。比如"上电时序测试"可以抽象为:设置电源输出 → 等待 Tdelay → 采集波形 → 提取上升时间/过冲/纹波 → 与限值比较。其中 Tdelay、限值、采样率都是参数,换一个被测对象只需要改参数,不需要重写流程。
本课程的学习路径
接下来的章节会沿着这条技术栈逐层展开。我们会先建立仪器通信的基础,理解 VISA 地址、SCPI 命令和 PyVISA 的用法;然后进入测试序列的设计,学习如何组织多仪器协同、如何处理等待与同步;再深入到数据采集与判定,讨论如何设置合理的采样参数、如何做通过/失败判定;最后进入报告工程,把原始数据转化为可读、可追溯、可交付的报告。
*IDN? 查询开始,先打通一台仪器的通信,再逐步扩展到多台仪器协同。不要一开始就追求完整框架,先把"连接—配置—采集—判定"这条最小闭环跑通,后续的复杂度才有落脚点。
一个最小可运行示例
为了让你对自动化有一个具体的感知,下面给出一个最小示例:用 PyVISA 连接一台 Keysight 示波器,查询身份并读取当前时基设置。这段代码不涉及复杂逻辑,但包含了自动化测试最核心的三个动作:打开资源、发送命令、读取响应。
import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource("USB0::0x2A8D::0x1301::MY12345678::INSTR")
inst.timeout = 5000
print(inst.query("*IDN?")) # 查询仪器身份
print(inst.query(":TIMebase:SCALe?")) # 读取时基档位
inst.close()
运行后,如果返回类似 KEYSIGHT,TECHNOLOGIES,DSOX3024T,... 的信息,说明通信链路已经打通。接下来要做的,就是在这个基础上逐步加入配置、采集、判定和报告逻辑。这也是本课程后续章节要带你完成的事情。