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
验证步骤:
- 确保万用表已开机,并通过USB或LAN连接至电脑;
- 在万用表输入端接入已知电压源(如1.5V电池或实验室电源);
- 运行上述脚本;
- 观察输出是否打印出接近输入电压的数值。
判定标准:程序无异常退出,打印的电压值与实际输入电压偏差在万用表精度范围内(通常±0.01V以内),且数值稳定不跳动,即判定通过。
通信时序与数据流
关键说明
- 代码中
find_dmm_address()通过*IDN?查询自动识别仪器,避免手动查找地址; - 若使用LAN接口,需将地址替换为
TCPIP0::192.168.1.100::inst0::INSTR格式; - 测量命令
READ?会触发一次自动测量并返回结果,适用于单次读取场景; - 返回字符串为科学计数法格式,通过
float()转换后可直接用于后续计算。