3. 读取数字万用表测量值

读取数字万用表测量值 学习卡片

任务说明

本案例实现通过Python读取数字万用表(DMM)的实时测量值。以Keysight 34461A(支持SCPI协议)为对象,使用PyVISA库建立通信,发送测量查询命令并解析返回结果。最终目标是从仪器获取当前直流电压读数并打印为浮点数值。

实现方案

采用PyVISA库通过USB或LAN接口与万用表通信。核心流程为:建立资源连接 → 发送复位与配置命令 → 发送测量查询 → 读取并解析响应。代码中同时提供自动发现仪器地址的逻辑,便于在不同环境下快速部署。

代码实现


import pyvisa

def find_dmm_address():
    """自动查找连接的DMM仪器地址"""
    rm = pyvisa.ResourceManager()
    resources = rm.list_resources()
    for res in resources:
        try:
            inst = rm.open_resource(res)
            # 发送*IDN?查询,若返回包含万用表关键字则匹配
            idn = inst.query("*IDN?").strip()
            if "34461" in idn or "DMM" in idn.upper():
                inst.close()
                return res
            inst.close()
        except Exception:
            continue
    return None

def read_dmm_voltage(address=None):
    """读取DMM直流电压测量值"""
    rm = pyvisa.ResourceManager()
    if address is None:
        address = find_dmm_address()
        if address is None:
            raise RuntimeError("未找到DMM仪器,请检查连接或指定地址")
    
    dmm = rm.open_resource(address)
    dmm.timeout = 5000  # 5秒超时
    
    # 仪器初始化
    dmm.write("*RST")
    dmm.write("CONF:VOLT:DC")  # 配置直流电压测量
    
    # 读取测量值
    raw_value = dmm.query("READ?")
    voltage = float(raw_value.strip())
    
    dmm.close()
    rm.close()
    return voltage

if __name__ == "__main__":
    try:
        # 方式1:自动查找仪器
        voltage = read_dmm_voltage()
        print(f"直流电压: {voltage:.6f} V")
        
        # 方式2:指定地址(取消注释并填入实际地址)
        # voltage = read_dmm_voltage("USB0::0x2A8D::0x1301::MY57201234::INSTR")
        # print(f"直流电压: {voltage:.6f} V")
    except Exception as e:
        print(f"读取失败: {e}")

依赖安装


pip install pyvisa pyvisa-py

若使用USB连接,还需安装NI-VISA运行时或使用pyvisa-py作为后端(需安装pyvisa-py并设置环境变量PYVISA_PY_BACKEND=1)。

运行与验证

运行方式:将代码保存为read_dmm.py,在Python环境中执行:

python read_dmm.py

验证步骤:

  1. 确保万用表已开机,并通过USB或LAN连接至电脑;
  2. 在万用表输入端接入已知电压源(如1.5V电池或实验室电源);
  3. 运行上述脚本;
  4. 观察输出是否打印出接近输入电压的数值。

判定标准:程序无异常退出,打印的电压值与实际输入电压偏差在万用表精度范围内(通常±0.01V以内),且数值稳定不跳动,即判定通过。

通信时序与数据流

DMM读取时序与数据流 Python脚本 PyVISA层 DMM (34461A) list_resources() open_resource(address) 建立通信会话 返回*IDN?响应 解析仪器标识 write("*RST") write("CONF:VOLT:DC") 复位并配置DCV query("READ?") 发送查询并等待 执行测量并返回 返回ASCII字符串,如 "+1.23456789E+00"

关键说明

  • 代码中find_dmm_address()通过*IDN?查询自动识别仪器,避免手动查找地址;
  • 若使用LAN接口,需将地址替换为TCPIP0::192.168.1.100::inst0::INSTR格式;
  • 测量命令READ?会触发一次自动测量并返回结果,适用于单次读取场景;
  • 返回字符串为科学计数法格式,通过float()转换后可直接用于后续计算。