3. 读取数字万用表测量值
任务说明
本案例使用PyVISA库通过USB或GPIB接口控制数字万用表(DMM),完成以下闭环:配置DC电压测量功能、触发单次测量、读取并解析返回的ASCII字符串、将带时间戳的测量值追加保存到CSV文件。代码以Keysight 34461A为例(兼容SCPI标准命令),若使用其他品牌DMM,仅需调整设备地址与量程命令。
实现代码
import pyvisa
import csv
import time
from datetime import datetime
# 1. 建立连接(根据实际设备修改地址)
rm = pyvisa.ResourceManager()
# 示例地址:USB0::0x2A8D::0x1301::MY57201234::0::INSTR
dmm = rm.open_resource('USB0::0x2A8D::0x1301::MY57201234::0::INSTR')
dmm.timeout = 5000 # 5秒超时
# 2. 配置DC电压测量(自动量程)
dmm.write('*RST') # 复位到默认状态
dmm.write('CONF:VOLT:DC') # 配置DC电压测量
dmm.write('VOLT:DC:NPLC 1') # 积分时间1个电源周期(减少噪声)
# 3. 读取并解析测量值
raw = dmm.query('READ?') # 触发测量并返回结果
# 典型返回格式: "+1.23456789E+00"
value = float(raw.strip()) # 转换为浮点数
# 4. 保存到CSV(追加模式)
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
with open('dmm_readings.csv', 'a', newline='') as f:
writer = csv.writer(f)
# 若文件为空则写入表头
if f.tell() == 0:
writer.writerow(['timestamp', 'voltage_dc'])
writer.writerow([timestamp, value])
# 5. 清理资源
dmm.close()
rm.close()
print(f'已保存: {timestamp}, {value:.6f} V')
关键说明
- 设备地址:运行前需用
rm.list_resources()查询实际地址并替换第7行字符串。 - SCPI命令:
CONF:VOLT:DC选择DC电压功能,READ?同时触发并返回读数,适用于大多数Keysight/Agilent/HP万用表。 - 解析逻辑:DMM返回的科学计数法字符串直接由
float()转换,无需额外正则处理。
验证方法
- 连接DMM至被测电压源(如电池或稳压源),确认设备地址正确。
- 运行脚本,观察终端输出包含时间戳和电压值。
- 检查当前目录下
dmm_readings.csv文件,内容应为两列:timestamp和voltage_dc,每行对应一次测量。 - 判定标准:CSV中数值与DMM前面板显示一致(误差在仪器精度范围内),且重复运行脚本时新数据追加在文件末尾而非覆盖。
判定标准
- 脚本无异常退出,终端打印的电压值与DMM面板读数一致。
- CSV文件每行包含正确的UTC+8时间戳和6位小数的电压值。
- 连续运行两次,CSV行数递增,证明追加模式生效。