2. 测量仪器与自动化接口基础

在ADI实验室中,电源、万用表、示波器、信号源和电子负载是最常见的五类台式仪器。它们各自承担不同的测量角色,但自动化系统对它们的要求是一致的:上位机能够通过标准接口发送命令、读取数据,并把结果稳定地纳入测试流程。理解这些仪器的程控接口类型、SCPI命令结构、VISA层的作用以及通信协议的选择,是搭建自动化测量平台的第一步。

常见仪器的程控接口类型

ADI实验室仪器通常提供以下几种物理接口:

  • USB(USBTMC):现代台式仪器最普遍的接口,即插即用,支持高速数据传输。例如Keysight E36312A电源、Keysight 34461A万用表均标配USB-TMC接口。上位机通过USB连接后,仪器在系统中表现为一个USBTMC设备,VISA层可直接识别。
  • LAN(LXI):基于以太网的仪器扩展标准,支持VXI-11、HiSLIP或原始Socket通信。LAN接口适合多台仪器组网、远程访问和长时间无人值守测试。例如Keysight InfiniiVision 3000T示波器、Keithley 2281S电源均支持LXI。
  • GPIB(IEEE-488):传统但依然可靠的并行总线接口,在老旧仪器和需要高确定性的场景中仍在使用。GPIB需要专用控制器卡或USB-GPIB转换器,如National Instruments GPIB-USB-HS。
  • RS-232/串口:部分电子负载和信号源仍保留串口接口,适合低速、点对点控制。例如Chroma 63200A电子负载可选配RS-232。

选择接口时,优先考虑仪器实际配备的接口、测试对吞吐量的要求以及实验室现有基础设施。USB适合单台快速接入,LAN适合多设备并行和远程控制,GPIB适合兼容旧设备,串口则用于低速辅助设备。

SCPI命令:统一的仪器语言

SCPI(Standard Commands for Programmable Instruments)是建立在IEEE-488.2基础上的命令集标准,它用树状结构组织命令,使不同厂商、不同型号的仪器具有相似的编程方式。SCPI命令分为两类:设置命令(无问号)和查询命令(带问号)。

以Keysight 34461A万用表为例,典型命令如下:

CONF:VOLT:DC 10          // 配置直流电压测量,量程10V
SENS:VOLT:DC:NPLC 10     // 设置积分时间10个电源周期
TRIG:SOUR BUS            // 触发源设为总线触发
INIT                     // 启动测量
FETC?                    // 读取最近一次测量结果

再以Keysight E36312A电源为例:

VOLT 5.0                 // 设置输出电压5V
CURR 1.0                 // 设置限流1A
OUTP ON                  // 打开输出
MEAS:VOLT?               // 查询实际输出电压
MEAS:CURR?               // 查询实际输出电流

SCPI命令的树状结构意味着命令可以缩写,例如MEASure:VOLTage:DC?可缩写为MEAS:VOLT:DC?。但缩写必须遵循规则:大写字母为必需部分,小写字母可省略。实际编程中建议使用完整形式或厂商文档中明确给出的缩写,避免因缩写歧义导致命令无法识别。

VISA层:上位机与仪器的桥梁

VISA(Virtual Instrument Software Architecture)是上位机与仪器之间的软件中间层。它屏蔽了底层物理接口的差异,为USB、LAN、GPIB、串口提供统一的API。无论仪器通过哪种接口连接,上位机都可以用相似的函数打开资源、写入命令、读取响应。

VISA资源地址的格式决定了通信路径。常见格式如下:

  • USB:USB0::0x2A8D::0x1301::MY59001234::INSTR
  • LAN:TCPIP0::192.168.1.100::inst0::INSTR
  • GPIB:GPIB0::22::INSTR
  • 串口:ASRL3::INSTR

在Python中,常用PyVISA库操作VISA资源。以下示例展示如何连接万用表并读取一次直流电压:

import pyvisa

rm = pyvisa.ResourceManager()
dmm = rm.open_resource('USB0::0x2A8D::0x1301::MY59001234::INSTR')
dmm.timeout = 5000
dmm.write('CONF:VOLT:DC 10')
dmm.write('TRIG:SOUR BUS')
dmm.write('INIT')
dmm.write('*TRG')
print(dmm.query('FETC?'))
dmm.close()

这段代码中,write用于发送不返回数据的命令,query用于发送查询并读取响应。超时设置timeout非常关键,默认值可能过短,导致长积分时间测量时读取失败。

通信协议选择与信号链关系

从命令到物理传输,整个通信链路可以概括为:上位机程序 → VISA库 → 物理接口驱动 → 仪器通信端口 → SCPI解析器 → 仪器功能模块。每一层都有对应的配置参数和潜在故障点。

选择通信协议时,需要权衡以下因素:

  • 吞吐量:示波器波形数据量大,优先选LAN或USB;电源和万用表命令简单,USB或GPIB均可。
  • 延迟确定性:GPIB在触发同步场景中延迟更稳定;LAN受网络交换机影响,可能引入抖动。
  • 多设备扩展:LAN天然支持多设备并行,GPIB总线挂载设备数量有限(通常最多15台)。
  • 线缆长度:GPIB建议不超过20米,USB不超过5米,LAN可通过交换机扩展。

下图展示了ADI实验室中典型仪器的接口类型、SCPI命令流向以及VISA层在系统中的位置关系。

上位机应用层 Python / LabVIEW / MATLAB → PyVISA / NI-VISA API write("VOLT 5.0") · query("MEAS:VOLT?") · read() VISA 层(虚拟仪器软件架构) 统一资源地址 · 统一读写API · 超时管理 · 事件处理 USB (USBTMC) USB0::0x2A8D::0x1301::MY59001234::INSTR 即插即用 · 高速 · 单台直连 LAN (LXI / VXI-11) TCPIP0::192.168.1.100::inst0::INSTR 多设备组网 · 远程 · 高吞吐 GPIB / 串口 GPIB0::22::INSTR ASRL3::INSTR ADI 实验室常见仪器(SCPI 命令解析与执行) 直流电源 VOLT / CURR / OUTP 数字万用表 CONF / MEAS / FETC 示波器 ACQ / WAV / TRIG 信号源 FREQ / VOLT / OUTP 电子负载 MODE / CURR / INP SCPI 命令树:设置命令(无问号)写入参数 · 查询命令(带问号)返回测量值或状态 示例:CONF:VOLT:DC 10 → INIT → *TRG → FETC? 返回 "+5.00123E+00"

实际配置中的关键判断

在搭建自动化测试环境时,以下几个判断点直接影响系统稳定性:

超时设置:万用表在10 NPLC积分时间下,单次测量可能耗时200 ms以上。若VISA超时设为默认的2000 ms,通常足够;但若使用100 NPLC,则需将超时提高到5000 ms以上。示波器读取深存储波形时,数据传输可能持续数秒,超时需相应放大。

终止符与读取方式:SCPI响应通常以换行符\n结尾。使用query()时,PyVISA会自动处理终止符;若使用read_raw(),则需要手动解析。对于二进制波形数据,应使用query_binary_values()而非文本读取,否则会因编码问题导致数据损坏。

命令同步:部分仪器在执行INIT后立即返回,实际测量尚未完成。此时应使用*OPC?查询或*WAI等待,确保测量完成后再读取结果。例如:

dmm.write('INIT')
dmm.query('*OPC?')   # 阻塞直到操作完成
print(dmm.query('FETC?'))

接口选择与仪器匹配:并非所有仪器都支持全部接口。例如Keysight 34461A支持USB和LAN,但不支持GPIB;而较老的Agilent 34401A则主要依赖GPIB和RS-232。在编写自动化脚本前,应先确认仪器实际配备的接口,并选择对应的VISA资源地址。

在实际项目中,建议先用厂商提供的交互式工具(如Keysight Connection Expert或NI MAX)扫描并确认仪器资源地址,再将其填入代码。这样可以避免因地址格式错误或接口未识别导致的连接失败。

掌握以上接口类型、SCPI命令结构、VISA层作用和协议选择原则后,就可以开始为具体仪器编写可复用的控制函数。下一阶段的工作是将这些函数组织成测试序列,并加入数据记录与报告生成环节。