1. 使用PyVISA连接并识别仪器

使用PyVISA连接并识别仪器 学习卡片

任务说明

本案例目标是通过PyVISA库建立计算机与可编程仪器(如数字万用表、示波器、信号源等)之间的通信连接,并读取仪器的身份标识信息(IDN)。完成本案例后,你将能够:检测系统可用的VISA后端与资源、打开与仪器的会话、发送标准SCPI命令并正确解析返回结果。

实现方案

PyVISA是Python访问VISA(Virtual Instrument Software Architecture)的标准库。本案例采用最小可复现实现:使用pyvisa库列出所有可用资源,通过用户指定的资源地址(如USB0::0x1234::0x5678::INSTR或TCPIP0::192.168.1.100::INSTR)建立连接,发送*IDN?命令读取仪器返回的厂商、型号、序列号与固件版本信息。代码不依赖任何未展示的前置代码,所有依赖仅在下方说明。

代码实现

import pyvisa

def list_resources():
    """列出当前主机所有可用的VISA资源地址"""
    rm = pyvisa.ResourceManager()
    resources = rm.list_resources()
    return resources

def identify_instrument(resource_address):
    """
    连接指定地址的仪器并读取*IDN?响应
    
    参数:
        resource_address: str, VISA资源地址,例如 'USB0::0x1234::0x5678::INSTR'
    
    返回:
        (仪器IDN字符串, 连接是否成功)
    """
    rm = pyvisa.ResourceManager()
    try:
        # 打开与仪器的会话,超时设为5秒
        instr = rm.open_resource(resource_address)
        instr.timeout = 5000
        
        # 发送标准SCPI识别命令
        idn_response = instr.query("*IDN?")
        
        # 关闭会话释放资源
        instr.close()
        return idn_response.strip(), True
    except pyvisa.Error as e:
        return f"连接失败: {str(e)}", False

if __name__ == "__main__":
    # 第一步:查看可用资源
    available = list_resources()
    print("检测到的VISA资源:")
    for i, res in enumerate(available):
        print(f"  [{i}] {res}")
    
    if not available:
        print("未检测到任何VISA资源,请检查仪器连接与驱动安装。")
    else:
        # 第二步:默认使用第一个资源进行识别(可手动修改为实际仪器地址)
        target = available[0]
        print(f"\n正在连接: {target}")
        idn, ok = identify_instrument(target)
        
        if ok:
            print(f"仪器识别成功: {idn}")
        else:
            print(idn)

依赖与运行环境

  • Python 3.7+
  • 安装PyVISA:pip install pyvisa
  • 安装VISA后端(二选一):
    • NI-VISA(Windows/Linux/macOS,推荐)
    • pyvisa-py(纯Python后端):pip install pyvisa-py
  • 物理连接:仪器通过USB、GPIB、LAN或串口与计算机相连,并已安装对应驱动

运行与验证

python visa_identify.py

验证步骤与判定标准:

  1. 程序首先打印当前主机检测到的所有VISA资源列表。若列表为空,说明后端未正确安装或仪器驱动缺失,需检查NI-VISA或pyvisa-py安装状态。
  2. 程序自动选择第一个资源进行连接。若该资源确实是可寻址仪器,输出将包含仪器识别成功字样,后跟仪器返回的厂商、型号、序列号、固件版本(逗号分隔的四段字符串)。
  3. 若连接失败,程序会打印具体错误原因(如地址不可达、超时、权限不足)。
  4. 判定通过标准:成功打印出以仪器识别成功开头且包含四段信息的完整IDN字符串,且该字符串与仪器铭牌或厂商文档中的标识一致。
PyVISA仪器识别流程与数据交互 Python主机 ResourceManager open_resource() VISA后端 NI-VISA / pyvisa-py 协议转换 SCPI仪器 USB/GPIB/LAN *IDN? 命令解析 list_resources() SCPI over VISA 返回: 厂商,型号,序列号,固件版本 发送: *IDN?\n 标准SCPI查询命令 响应: KEYSIGHT,34465A,... 逗号分隔的四段IDN字符串

关键说明

  • 若系统安装了NI-VISA,pyvisa.ResourceManager()默认使用NI后端;若未安装,则需确保pyvisa-py已安装,代码会自动回退到纯Python后端。
  • 实际使用时,可将target = available[0]改为具体的仪器地址字符串,例如target = "TCPIP0::192.168.1.100::INSTR"。
  • 本案例仅实现仪器识别这一最小闭环。若需发送其他SCPI命令(如测量、配置),只需将query("*IDN?")替换为对应的命令字符串即可,但超出本案例目标范围。