2. SCPI命令基础与仪器通信

任务说明

本案例目标:使用Python通过VISA库与支持SCPI命令的仪器建立通信,完成一条真实的SCPI查询与写入命令,并验证返回结果。你将使用NI-VISA或PyVISA-py作为后端,连接一台可用的测试仪器(或模拟器),实现*IDN?查询与SYSTem:ERRor?错误队列读取。

实现方案

采用pyvisa库作为VISA抽象层,自动探测可用后端。代码将完成以下闭环:

  1. 列出系统所有可用VISA资源;
  2. 打开第一个匹配的仪器资源(TCPIP或USB优先);
  3. 发送*IDN?查询并打印仪器标识;
  4. 发送SYSTem:ERRor?查询并打印错误队列内容;
  5. 关闭连接。

代码实现

import pyvisa

def find_and_connect():
    """自动发现并连接第一台可用仪器"""
    rm = pyvisa.ResourceManager()
    resources = rm.list_resources()
    if not resources:
        raise RuntimeError("未检测到任何VISA资源,请检查仪器连接或VISA后端")
    
    print("检测到以下VISA资源:")
    for res in resources:
        print(f"  {res}")
    
    # 优先选择TCPIP或USB接口的仪器
    preferred = [r for r in resources if r.startswith(('TCPIP', 'USB'))]
    target = preferred[0] if preferred else resources[0]
    print(f"\n连接仪器: {target}")
    
    instrument = rm.open_resource(target)
    instrument.timeout = 5000  # 5秒超时
    return rm, instrument

def scpi_roundtrip(instrument):
    """执行SCPI查询与写入的完整往返"""
    # 1. 查询仪器标识
    idn_response = instrument.query("*IDN?")
    print(f"[*IDN?] 返回: {idn_response.strip()}")
    
    # 2. 查询错误队列(若无错误返回 "0, No error")
    err_response = instrument.query("SYSTem:ERRor?")
    print(f"[SYSTem:ERRor?] 返回: {err_response.strip()}")
    
    # 3. 写入命令示例:清除错误队列(无返回)
    instrument.write("*CLS")
    print("[*CLS] 已发送(清除状态寄存器)")
    
    # 4. 再次查询错误队列验证清除效果
    err_after = instrument.query("SYSTem:ERRor?")
    print(f"[清除后 SYSTem:ERRor?] 返回: {err_after.strip()}")

if __name__ == "__main__":
    rm = None
    instr = None
    try:
        rm, instr = find_and_connect()
        scpi_roundtrip(instr)
        print("\nSCPI通信测试完成")
    except Exception as e:
        print(f"\n通信失败: {e}")
    finally:
        if instr:
            instr.close()
        if rm:
            rm.close()

依赖与运行

需要安装pyvisa及至少一个VISA后端:

pip install pyvisa pyvisa-py

运行方式:

python scpi_basic.py

验证方法与判定标准

将上述代码保存为scpi_basic.py,连接真实仪器(如Keysight、Rohde&Schwarz、Tektronix等支持SCPI的设备)后执行。判定通过条件:

  • 程序能列出至少一个VISA资源并成功连接;
  • *IDN?返回的字符串包含仪器厂商与型号信息(如Keysight Technologies,...);
  • SYSTem:ERRor?返回格式为<代码>,<描述>,例如0,"No error";
  • 程序正常结束且无异常抛出。

若没有物理仪器,可使用pyvisa-sim(PyVISA模拟器)创建虚拟仪器验证代码逻辑,但需注意模拟器返回的*IDN?内容取决于其配置文件。

SCPI通信时序

Python主机 SCPI仪器 VISA会话 ① *IDN? ② 厂商,型号,序列号 ③ SYSTem:ERRor? ④ 0,"No error" 查询命令 仪器响应

关键说明

  • 代码中的query()方法自动完成“写入命令+读取响应”的SCPI往返操作;
  • *IDN?是标准识别命令,所有符合SCPI规范的仪器必须支持;
  • SYSTem:ERRor?从仪器错误队列中读取最早一条错误,读取后该条错误被移除;
  • 若连接失败,请检查:仪器是否已开机并设置正确IP/USB地址、VISA后端是否安装、防火墙是否阻止TCPIP通信。