2. SCPI命令控制数字万用表测量直流电压
任务说明
本案例要求编写一个Python模块,通过VISA库与支持SCPI协议的仪器建立通信,实现发送复位命令*RST、清除状态寄存器命令*CLS,并具备读取仪器响应(如*IDN?查询)的能力。最终交付一个可独立运行的函数集合,调用者只需提供VISA地址即可完成基本仪器控制。
实现方案
使用pyvisa库作为通信后端,封装三个核心函数:connect()建立会话、send_command()发送任意SCPI命令、query()发送查询并读取响应。同时提供reset_and_clear()组合函数,依次执行*RST和*CLS,满足案例目标。
代码实现
# scpi_controller.py
"""SCPI仪器控制基础模块:支持复位、状态清除与查询操作。"""
import pyvisa
class SCPIController:
"""SCPI仪器控制器,封装VISA通信基础操作。"""
def __init__(self, resource_addr: str, timeout_ms: int = 5000):
"""
初始化并连接仪器。
Args:
resource_addr: VISA资源地址,如 'TCPIP0::192.168.1.100::inst0::INSTR'
timeout_ms: 通信超时时间(毫秒)
"""
self.rm = pyvisa.ResourceManager()
self.inst = self.rm.open_resource(resource_addr)
self.inst.timeout = timeout_ms
def send_command(self, command: str) -> None:
"""发送SCPI命令(无响应)。"""
self.inst.write(command)
def query(self, command: str) -> str:
"""发送SCPI查询命令并读取响应字符串。"""
return self.inst.query(command).strip()
def reset_and_clear(self) -> None:
"""执行仪器复位(*RST)和状态清除(*CLS)。"""
self.send_command("*RST")
self.send_command("*CLS")
# 等待操作完成
self.query("*OPC?")
def get_identification(self) -> str:
"""查询仪器IDN信息。"""
return self.query("*IDN?")
def close(self) -> None:
"""关闭VISA会话。"""
self.inst.close()
self.rm.close()
# 使用示例(直接运行本文件时执行)
if __name__ == "__main__":
# 请将下面的地址替换为实际仪器地址
ADDR = "TCPIP0::192.168.1.100::inst0::INSTR"
ctrl = SCPIController(ADDR)
try:
# 1. 查询仪器标识
idn = ctrl.get_identification()
print(f"仪器标识: {idn}")
# 2. 执行复位和状态清除
ctrl.reset_and_clear()
print("已发送 *RST 和 *CLS,操作完成。")
# 3. 验证状态寄存器已清除(查询标准事件状态寄存器)
esr = ctrl.query("*ESR?")
print(f"标准事件状态寄存器: {esr}")
finally:
ctrl.close()
依赖与运行方式
依赖安装:
pip install pyvisa pyvisa-py
若使用USB接口仪器,还需安装NI-VISA或pyvisa-py后端对应的USB驱动。
运行步骤:
- 将代码保存为
scpi_controller.py; - 将
ADDR变量替换为实际仪器VISA地址(可通过python -m pyvisa info查看可用资源); - 执行
python scpi_controller.py。
验证方法与判定标准
功能验证:
- 程序能正常连接仪器,无VISA超时或连接异常;
- 打印的
仪器标识包含厂商、型号、序列号等真实信息; - 打印
标准事件状态寄存器值为0,表示状态寄存器已成功清除; - 程序正常退出,无异常抛出。
判定标准:以上4项全部满足,且*RST后仪器面板显示复位状态(如回到默认测量模式),即可判定案例通过。
预期输出示例(实际值取决于仪器型号):
仪器标识: KEYSIGHT,DSOX1102G,MY12345678,02.41
已发送 *RST 和 *CLS,操作完成。
标准事件状态寄存器: 0