3. 测试仪表远程控制原理

在自动测试平台中,测试仪表远程控制是整条测试链路的起点。无论是综测仪、频谱仪还是信号源,PC 端要完成“发现仪表—建立连接—下发指令—读取结果”这一闭环,背后依赖三层机制:SCPI 指令负责“说什么”,VISA 接口负责“怎么送到仪表”,LAN/GPIB/USB 物理链路负责“走哪条路”。理解这三层分工,是后续编写自动化脚本、排查连接故障的基础。

一、SCPI:仪表能听懂的“普通话”

SCPI(Standard Commands for Programmable Instruments)是建立在 IEEE 488.2 之上的可编程仪表命令标准。它把命令组织成树状层级,用冒号分隔节点,例如 :SOURce:FREQuency:CW 1.8GHz 表示设置信号源频率。命令分为两类:以问号结尾的查询命令(如 :MEASure:POWer?)会返回数据,不带问号的设置命令只执行动作。SCPI 还支持大小写混写(大写为缩写形式)、单位后缀(GHz、MHz、dBm、ms)和逗号分隔的多参数,这让同一套脚本可以跨厂商复用。

实际使用中要注意三点:一是命令终止符,LAN 与 USB 通常用 \n,GPIB 常用 \n 或 EOI 信号;二是查询与读取必须配对,发了查询命令后必须读取返回,否则缓冲区会残留数据导致后续命令错位;三是状态寄存器,通过 *OPC? 或 *ESR? 判断操作是否完成,避免在仪表未就绪时读取结果。

二、VISA:统一的软件接口层

VISA(Virtual Instrument Software Architecture)是 PC 与仪表之间的软件中间层。它把 LAN、GPIB、USB、串口等不同物理接口抽象成统一的资源字符串和 API,例如 TCPIP0::192.168.1.100::inst0::INSTR、GPIB0::20::INSTR、USB0::0x0B3B::0x1234::SN123456::INSTR。上层脚本只需调用 viOpen、viWrite、viRead,无需关心底层是哪种总线。常见实现有 NI-VISA、Keysight IO Libraries 和 Anritsu 配套的 VISA 运行时,安装后会在系统中注册为服务,供 Python(PyVISA)、C#、LabVIEW 等调用。

三、三种物理链路的配置要点

LAN 连接是当前主流方式。仪表与 PC 需在同一网段,例如仪表设为 192.168.1.100/24,PC 设为 192.168.1.10/24。仪表侧需开启 SCPI Socket 服务(常见端口 5025)或 VXI-11 服务。用 PyVISA 连接时资源串写 TCPIP0::192.168.1.100::5025::SOCKET,并设置 read_termination='\n'。LAN 的优点是速率高、可多机并行,缺点是受网络配置和防火墙影响。

GPIB 连接是传统但稳定的方式。每台仪表需设置唯一的 GPIB 地址(0~30,通常 PC 卡为 0),多台仪表用菊花链或星形线缆连接,总长度不超过 20 m,链上设备不超过 15 台。资源串形如 GPIB0::20::INSTR。GPIB 抗干扰强、时序确定,适合对实时性要求高的场景,但布线成本高、速率较低。

USB 连接即插即用,仪表需支持 USBTMC 协议。资源串包含厂商 ID、产品 ID 和序列号,例如 USB0::0x0B3B::0x1234::SN123456::INSTR。USB 速率高、无需网络配置,但线缆长度受限(一般 5 m 以内),且多台同型号仪表需靠序列号区分。

四、仪表发现方法

仪表发现是自动化测试的第一步。常用手段有三种:VISA 资源枚举,调用 rm.list_resources() 列出当前系统所有可见资源;网络扫描,对目标网段做 ping 或 SCPI Socket 端口探测,快速定位在线仪表;厂商工具,如 Anritsu 的 Instrument Manager 或 NI-MAX,可图形化查看并测试连接。发现后建议先用 *IDN? 查询仪表身份,确认型号与序列号,再进入正式测试流程。

测试仪表远程控制三层架构与仪表发现流程 SCPI 指令层 “说什么” 命令语法与语义 :SOURce:FREQuency:CW 1.8GHz :MEASure:POWer? *IDN? / *OPC? 设置命令(无问号) 查询命令(有问号) 通用命令(IEEE 488.2) VISA 接口层 “怎么送” 统一资源与 API TCPIP0::192.168.1.100::inst0::INSTR GPIB0::20::INSTR USB0::0x0B3B::0x1234::SN123::INSTR viOpen / viWrite / viRead 物理链路层 “走哪条路” LAN / GPIB / USB LAN 端口 5025 / VXI-11 同网段、防火墙放行 GPIB 地址 0~30 唯一 ≤15 台、≤20 m USB USBTMC 协议 VID/PID/SN 区分 仪表发现: list_resources() 枚举 → 网段扫描 / 端口探测 → *IDN? 确认身份 → 建立会话

五、连接配置示例与结果判读

下面以 PyVISA 连接一台 LAN 接口的 Anritsu 综测仪为例,展示完整流程。假设仪表 IP 为 192.168.1.100,SCPI Socket 端口为 5025:

import pyvisa

rm = pyvisa.ResourceManager()
print(rm.list_resources())
# 输出示例:('TCPIP0::192.168.1.100::5025::SOCKET',)

inst = rm.open_resource('TCPIP0::192.168.1.100::5025::SOCKET')
inst.read_termination = '\n'
inst.write_termination = '\n'
inst.timeout = 5000  # 单位 ms

print(inst.query('*IDN?'))
# 输出示例:Anritsu,MT8000A,6200123456,1.00

inst.write(':SOURce:FREQuency:CW 1.8GHz')
inst.query('*OPC?')  # 返回 1 表示设置完成

判读要点:list_resources() 能列出资源串,说明 VISA 层已识别到仪表;*IDN? 返回型号与序列号,说明 SCPI 通道双向通畅;*OPC? 返回 1,说明设置命令已执行完毕。若 list_resources() 为空,应检查 VISA 运行时是否安装、仪表是否上电、网线是否连通;若 *IDN? 超时,应检查端口号、终止符和防火墙设置。

GPIB 与 USB 的脚本结构与 LAN 完全一致,只需替换资源串。例如 GPIB 用 GPIB0::20::INSTR,USB 用 USB0::0x0B3B::0x1234::SN123456::INSTR,其余 query、write 调用不变,这正是 VISA 抽象层的价值。
常见误区:一是查询后不读取,导致下次读取拿到旧数据;二是 LAN 连接时忘记设置 read_termination,程序一直阻塞;三是多台同型号 USB 仪表只按资源串顺序打开,未用序列号区分,导致控制错对象。建议在脚本中始终用 *IDN? 校验目标仪表身份。

六、三种链路对比与选型建议

对比项LANGPIBUSB
典型速率高(100M/1G)中(≤8 MB/s)高(USB 2.0/3.0)
布线距离受网络覆盖≤20 m≤5 m
多机扩展容易,IP 区分≤15 台,地址区分受 USB 拓扑限制
配置复杂度中(网段/端口)低(地址设置)低(即插即用)
适用场景远程、多机并行实时、抗干扰桌面、单机调试

选型时,若测试系统需要远程访问或多台仪表并行,优先 LAN;若对时序确定性要求高、环境干扰大,选 GPIB;若只是桌面快速搭建单机测试,USB 最省事。实际项目中也可混合使用,由 VISA 统一管理,脚本层无需区分。

掌握 SCPI、VISA 与物理链路三者的分工,再配合资源枚举与 *IDN? 校验,就能稳定地完成仪表发现与远程控制,为后续自动化测试用例的开发打下可靠基础。