2. SCPI命令基础与仪器通信
任务说明
本案例目标:使用Python通过VISA库与支持SCPI命令的仪器建立通信,完成一条真实的SCPI查询与写入命令,并验证返回结果。你将使用NI-VISA或PyVISA-py作为后端,连接一台可用的测试仪器(或模拟器),实现*IDN?查询与SYSTem:ERRor?错误队列读取。
实现方案
采用pyvisa库作为VISA抽象层,自动探测可用后端。代码将完成以下闭环:
- 列出系统所有可用VISA资源;
- 打开第一个匹配的仪器资源(TCPIP或USB优先);
- 发送
*IDN?查询并打印仪器标识; - 发送
SYSTem:ERRor?查询并打印错误队列内容; - 关闭连接。
代码实现
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通信时序
关键说明
- 代码中的
query()方法自动完成“写入命令+读取响应”的SCPI往返操作; *IDN?是标准识别命令,所有符合SCPI规范的仪器必须支持;SYSTem:ERRor?从仪器错误队列中读取最早一条错误,读取后该条错误被移除;- 若连接失败,请检查:仪器是否已开机并设置正确IP/USB地址、VISA后端是否安装、防火墙是否阻止TCPIP通信。