1. 基于PyVISA的程控电源连接与识别

基于PyVISA的程控电源连接与识别 学习卡片

任务说明

本案例目标是通过PyVISA库自动发现并连接GPIB、USB或TCP/IP接口的仪器,读取仪器的*IDN?查询响应,并验证连接成功。你将学习如何列出系统可用资源、建立会话、发送SCPI命令并解析返回的仪器标识信息。

实现方案

使用pyvisa库的ResourceManager列出所有可用资源,然后对每个资源尝试建立连接并发送*IDN?命令。若返回非空字符串,则判定连接成功并输出仪器信息。代码支持GPIB(如GPIB0::1::INSTR)、USB(如USB0::0x1234::0x5678::INSTR)和TCP/IP(如TCPIP0::192.168.1.100::INSTR)接口。

代码实现

import pyvisa

def discover_and_identify():
    """自动发现并连接仪器,读取IDN字符串"""
    rm = pyvisa.ResourceManager()
    resources = rm.list_resources()
    
    if not resources:
        print("未发现任何VISA资源")
        return
    
    print(f"发现 {len(resources)} 个资源:")
    for res in resources:
        print(f"  - {res}")
    
    print("\n尝试连接并识别仪器...")
    for res in resources:
        try:
            # 建立会话,超时设为3秒
            instr = rm.open_resource(res)
            instr.timeout = 3000
            
            # 发送*IDN?查询并读取响应
            idn = instr.query("*IDN?").strip()
            
            if idn:
                print(f"\n[成功] {res}")
                print(f"  仪器标识: {idn}")
                # 验证响应格式(通常为 厂商,型号,序列号,固件版本)
                parts = idn.split(",")
                if len(parts) >= 2:
                    print(f"  厂商: {parts[0].strip()}")
                    print(f"  型号: {parts[1].strip()}")
            else:
                print(f"\n[跳过] {res} - 返回空响应")
            
            instr.close()
            
        except pyvisa.Error as e:
            print(f"\n[失败] {res} - {e}")
        except Exception as e:
            print(f"\n[失败] {res} - 未知错误: {e}")

if __name__ == "__main__":
    discover_and_identify()

依赖安装

pip install pyvisa pyvisa-py

若使用NI-VISA后端,需额外安装NI-VISA运行时;纯Python后端pyvisa-py可满足大多数USB和TCP/IP场景。

运行方式

python discover_instruments.py

验证方法与判定标准

运行脚本后,观察输出:

  1. 若系统连接了仪器,程序应列出所有VISA资源名称;
  2. 对每个可访问资源,程序尝试发送*IDN?并打印返回的标识字符串;
  3. 判定通过标准:至少一个资源返回非空IDN字符串,且输出格式包含厂商和型号信息(逗号分隔的前两段);
  4. 若资源被占用或不可达,程序打印失败原因但不中断整体执行。
PyVISA仪器发现与识别流程 ResourceManager list_resources() 资源列表 GPIB0::1::INSTR USB0::0x1234::0x5678::INSTR 遍历资源 for res in list open_resource(res) timeout = 3000ms query("*IDN?") 发送SCPI命令并读取响应 响应 非空? 是 输出 IDN 否 跳过/ 报错 判定标准:返回非空IDN字符串且包含厂商、型号信息(逗号分隔)即连接成功

预期输出示例

当系统连接一台Keysight示波器(TCP/IP接口)时,预期输出如下(实际输出取决于连接的仪器):

发现 1 个资源:
  - TCPIP0::192.168.1.100::INSTR

尝试连接并识别仪器...

[成功] TCPIP0::192.168.1.100::INSTR
  仪器标识: KEYSIGHT,DSO-X 2024A,MY12345678,02.35
  厂商: KEYSIGHT
  型号: DSO-X 2024A

若未连接任何仪器,程序输出未发现任何VISA资源,此时应检查仪器连接和VISA后端配置。