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 函数面板直接调用。理解资源字符串的构成,是排查“连不上仪表”问题的第一把钥匙。

上位机与 Anritsu 仪表的 VISA 连接架构 上位机应用层 Python + PyVISA LabVIEW + VISA 函数 VISA 抽象层 资源地址解析 viWrite / viRead / viQuery 物理接口 GPIB / LAN / USB Anritsu 仪表固件 一次身份查询的命令流(*IDN?) 脚本发送 *IDN?\n VISA 写入 viWrite 仪表响应 厂商/型号/序列号/版本 脚本读取 viRead

二、Python/PyVISA 环境搭建与第一个连接程序

Python 方案的优势在于脚本灵活、生态丰富,适合快速迭代测试逻辑。搭建步骤如下:

  1. 安装 Python 3.8 及以上版本,建议使用虚拟环境隔离依赖。
  2. 安装 PyVISA 与后端驱动:pip install pyvisa pyvisa-py。若使用 NI-VISA 或 Anritsu 提供的 VISA 运行时,则无需 pyvisa-py,PyVISA 会自动调用系统 VISA。
  3. 安装 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-COMC/C++、C#、LabVIEW标准化接口,支持属性式配置
LabVIEW Plug & PlayLabVIEW图形化 VI,开箱即用
Python 封装库Python社区或厂商提供,简化 SCPI 调用

集成驱动库时,需注意驱动版本与仪表固件版本的匹配。例如,某驱动库针对 MS269xA 固件 V1.02 编写,若仪表固件升级到 V2.00,部分 SCPI 命令可能变更,导致驱动调用失败。此时应查阅仪表最新的 SCPI 参考手册,确认命令兼容性。

不要在同一脚本中混用不同后端的 VISA。例如,同时安装 NI-VISA 与 pyvisa-py 时,PyVISA 默认优先使用系统 VISA。若需强制指定后端,可在 ResourceManager 中传入 @py 参数,如 pyvisa.ResourceManager("@py")。

五、连接程序的验证与常见问题定位

第一个连接程序的价值不仅在于“连上”,更在于建立一套可复用的验证方法。建议按以下顺序排查:

  1. 物理层:检查网线、GPIB 线或 USB 线连接;LAN 接口可用 ping 确认网络可达。
  2. 资源层:用 rm.list_resources() 或 NI-MAX 确认仪表资源字符串是否出现。
  3. 会话层:打开资源后先查询 *IDN?,若超时则检查终止符与超时设置。
  4. 命令层:查询 :SYST:ERR?,确认仪表端无命令语法错误。

当 *IDN? 返回正确身份信息,且错误队列为空时,即可认为开发环境与仪表驱动库集成成功。此时可以进一步封装一个 connect_instrument(addr) 函数,在后续测试脚本中重复调用,为自动化测试用例的开发奠定基础。