4. 自动化测试脚本开发环境
要让自动化测试真正跑起来,第一步不是写复杂的测试用例,而是让上位机能够“找到并指挥”Anritsu 仪表。本节聚焦于开发环境的搭建与第一个连接程序的实现,核心是理解 VISA 抽象层、驱动库的调用方式,以及如何用 Python/PyVISA 或 LabVIEW 完成一次可靠的仪表连接与身份查询。
一、VISA 抽象层:上位机与仪表的“通用语言”
Anritsu 仪表(如 MS269xA 信号分析仪、MT8821C 无线通信测试仪、MG3710E 矢量信号发生器)通常支持 GPIB、LAN、USB 三种物理接口。如果针对每种接口单独写通信代码,脚本将难以复用。VISA(Virtual Instrument Software Architecture)正是为解决这一问题而生的中间层:它把物理接口差异封装起来,向上位机提供统一的资源地址格式和读写函数。
在 VISA 体系下,仪表被抽象为一个“资源字符串”,例如:
GPIB0::20::INSTR # GPIB 接口,主地址 20
TCPIP0::192.168.1.50::inst0::INSTR # LAN 接口,VXI-11 协议
USB0::0x0B5B::0x0110::12345678::INSTR # USB 接口,含 VID/PID/序列号
无论使用哪种接口,上位机调用的都是 viOpen、viWrite、viRead 这一组标准操作。Python 侧通过 PyVISA 封装这些操作,LabVIEW 侧则通过 VISA 函数面板直接调用。理解资源字符串的构成,是排查“连不上仪表”问题的第一把钥匙。
二、Python/PyVISA 环境搭建与第一个连接程序
Python 方案的优势在于脚本灵活、生态丰富,适合快速迭代测试逻辑。搭建步骤如下:
- 安装 Python 3.8 及以上版本,建议使用虚拟环境隔离依赖。
- 安装 PyVISA 与后端驱动:
pip install pyvisa pyvisa-py。若使用 NI-VISA 或 Anritsu 提供的 VISA 运行时,则无需 pyvisa-py,PyVISA 会自动调用系统 VISA。 - 安装 Anritsu 仪表对应的 VISA 驱动或确认系统已识别设备。LAN 接口需确保仪表 IP 与上位机在同一网段,且仪表已开启 VXI-11 或 HiSLIP 服务。
下面是一个最小可运行的连接程序,完成资源枚举、连接、身份查询与错误处理:
import pyvisa
rm = pyvisa.ResourceManager()
print("可用资源:", rm.list_resources())
# 替换为实际资源地址
addr = "TCPIP0::192.168.1.50::inst0::INSTR"
try:
inst = rm.open_resource(addr)
inst.timeout = 5000 # 超时 5 秒
inst.write_termination = "\n"
inst.read_termination = "\n"
idn = inst.query("*IDN?")
print("仪表身份:", idn.strip())
# 可选:查询错误队列
err = inst.query(":SYST:ERR?")
print("错误队列:", err.strip())
inst.close()
except pyvisa.errors.VisaIOError as e:
print("连接失败:", e)
运行后若输出类似 Anritsu,MS2692A,6200123456,V1.02 的字符串,说明连接成功。若抛出 VisaIOError,常见原因包括:资源地址拼写错误、仪表未上电、防火墙拦截 VXI-11 端口(通常为 111 和动态端口)、或 VISA 后端未正确安装。此时可先用 Anritsu 自带的 MX269900A 或 NI-MAX 扫描设备,确认仪表在系统中可见。
timeout 与终止符设置。Anritsu 仪表默认以 \n 作为命令终止符,若读取时未设置 read_termination,query 可能一直阻塞直到超时。三、LabVIEW 方案:图形化 VISA 调用
LabVIEW 适合与产线测试系统、数据采集硬件深度集成。其连接流程与 Python 类似,但以图形化节点呈现:
- 在程序框图中放置
VISA Open节点,输入资源字符串,输出 VISA 会话句柄。 - 连接
VISA Write节点,写入*IDN?\n。 - 连接
VISA Read节点,设置读取字节数(如 256),获取返回字符串。 - 最后用
VISA Close释放会话。
LabVIEW 的优势在于错误簇可以沿数据流自动传递,任一节点出错后续节点会跳过,便于构建健壮的测试序列。对于 Anritsu 仪表,还可安装厂商提供的 LabVIEW 驱动库(Plug & Play Driver),直接调用封装好的 VI,避免手写 SCPI 命令。
四、驱动库集成:从裸 SCPI 到封装 API
直接使用 SCPI 命令虽然灵活,但命令繁多、易拼错。Anritsu 为多款仪表提供了驱动库,常见形式包括:
| 驱动形式 | 适用环境 | 特点 |
|---|---|---|
| IVI-C / IVI-COM | C/C++、C#、LabVIEW | 标准化接口,支持属性式配置 |
| LabVIEW Plug & Play | LabVIEW | 图形化 VI,开箱即用 |
| Python 封装库 | Python | 社区或厂商提供,简化 SCPI 调用 |
集成驱动库时,需注意驱动版本与仪表固件版本的匹配。例如,某驱动库针对 MS269xA 固件 V1.02 编写,若仪表固件升级到 V2.00,部分 SCPI 命令可能变更,导致驱动调用失败。此时应查阅仪表最新的 SCPI 参考手册,确认命令兼容性。
ResourceManager 中传入 @py 参数,如 pyvisa.ResourceManager("@py")。五、连接程序的验证与常见问题定位
第一个连接程序的价值不仅在于“连上”,更在于建立一套可复用的验证方法。建议按以下顺序排查:
- 物理层:检查网线、GPIB 线或 USB 线连接;LAN 接口可用
ping确认网络可达。 - 资源层:用
rm.list_resources()或 NI-MAX 确认仪表资源字符串是否出现。 - 会话层:打开资源后先查询
*IDN?,若超时则检查终止符与超时设置。 - 命令层:查询
:SYST:ERR?,确认仪表端无命令语法错误。
当 *IDN? 返回正确身份信息,且错误队列为空时,即可认为开发环境与仪表驱动库集成成功。此时可以进一步封装一个 connect_instrument(addr) 函数,在后续测试脚本中重复调用,为自动化测试用例的开发奠定基础。