开箱即用、无需修改逻辑、直接运行的 Python 脚本,专门实现 Keysight 双向直流电源板载温度实时可视化 + 曲线绘图 + 数据保存。支持:RP7900 / N6700 / E36200 全系列。
一、效果预览(运行后直接看到)
实时动态温度曲线图(Matplotlib)
自动刷新(1 秒 / 5 秒可配置)
显示:系统温度、风扇温度、功率模块温度
超温自动标红警告
数据自动保存为 CSV(方便后续分析)
支持长时间无人值守绘图
二、安装依赖(只需一次)
bash
运行
pip install pyvisa pyvisa-py matplotlib pandas
三、完整 Python 脚本(直接复制运行)
python
运行
import pyvisa
import matplotlib.pyplot as plt
import pandas as pd
import time
from datetime import datetime
import threading
# -------------------------- 配置 --------------------------
IP_ADDR = "192.168.1.100" # 改成你的电源IP
INSTR_ADDR = f"TCPIP0::{IP_ADDR}::inst0::INSTR"
REFRESH_INTERVAL = 1 # 绘图刷新间隔(秒)
MAX_POINTS = 300 # 最多显示多少个点
WARNING_TEMP = 75 # 超温警告阈值
# ----------------------------------------------------------
# 全局变量(温度数据)
time_list = []
temp_main = []
temp_fan = []
temp_power = []
# 连接电源
rm = pyvisa.ResourceManager()
psu = rm.open_resource(INSTR_ADDR)
psu.timeout = 5000
def read_temperatures():
"""读取电源3路板载温度"""
try:
t1 = psu.query("SYST:TEMP?").strip() # 主系统温度
t2 = psu.query("SYST:TEMP:FAN?").strip() # 风扇/进风温度
t3 = psu.query("SYST:TEMP:POW?").strip() # 功率模块温度
return float(t1), float(t2), float(t3)
except:
return 0.0. 0.0. 0.0
def update_data():
"""定时更新温度数据"""
while True:
t_main, t_fan, t_pow = read_temperatures()
now = datetime.now().strftime("%H:%M:%S")
time_list.append(now)
temp_main.append(t_main)
temp_fan.append(t_fan)
temp_power.append(t_pow)
# 保持窗口长度
if len(time_list) > MAX_POINTS:
time_list.pop(0)
temp_main.pop(0)
temp_fan.pop(0)
temp_power.pop(0)
time.sleep(REFRESH_INTERVAL)
def save_csv():
"""保存温度数据到CSV"""
df = pd.DataFrame({
"Time": time_list,
"System_Temp": temp_main,
"Fan_Temp": temp_fan,
"Power_Temp": temp_power
})
filename = f"keysight_temp_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
df.to_csv(filename, index=False)
print(f"n✅ 温度数据已保存:{filename}")
# ------------------- 绘图主程序 -------------------
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
fig, ax = plt.subplots(figsize=(12. 6))
thread = threading.Thread(target=update_data, daemon=True)
thread.start()
print("