2. SCPI命令控制数字万用表测量直流电压

任务说明

本案例要求编写一个Python模块,通过VISA库与支持SCPI协议的仪器建立通信,实现发送复位命令*RST、清除状态寄存器命令*CLS,并具备读取仪器响应(如*IDN?查询)的能力。最终交付一个可独立运行的函数集合,调用者只需提供VISA地址即可完成基本仪器控制。

实现方案

使用pyvisa库作为通信后端,封装三个核心函数:connect()建立会话、send_command()发送任意SCPI命令、query()发送查询并读取响应。同时提供reset_and_clear()组合函数,依次执行*RST和*CLS,满足案例目标。

scpi_controller.py connect(addr) → rm.open_resource() → timeout=5000 send_command(cmd) → inst.write(cmd) query(cmd) → inst.query(cmd) reset_and_clear() VISA 资源 TCPIP/USB/GPIB SCPI 解析器 命令队列 响应缓冲区 SCPI 仪器 *RST → 复位到默认状态 *CLS → 清除状态寄存器 *IDN? → 返回仪器标识 *OPC? → 操作完成查询

代码实现


# 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驱动。

运行步骤:

  1. 将代码保存为scpi_controller.py;
  2. 将ADDR变量替换为实际仪器VISA地址(可通过python -m pyvisa info查看可用资源);
  3. 执行python scpi_controller.py。

验证方法与判定标准

功能验证:

  • 程序能正常连接仪器,无VISA超时或连接异常;
  • 打印的仪器标识包含厂商、型号、序列号等真实信息;
  • 打印标准事件状态寄存器值为0,表示状态寄存器已成功清除;
  • 程序正常退出,无异常抛出。

判定标准:以上4项全部满足,且*RST后仪器面板显示复位状态(如回到默认测量模式),即可判定案例通过。

预期输出示例(实际值取决于仪器型号):


仪器标识: KEYSIGHT,DSOX1102G,MY12345678,02.41
已发送 *RST 和 *CLS,操作完成。
标准事件状态寄存器: 0