1. 基于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
验证方法与判定标准
运行脚本后,观察输出:
- 若系统连接了仪器,程序应列出所有VISA资源名称;
- 对每个可访问资源,程序尝试发送
*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后端配置。