一、核心概念(必须先懂)
1. 什么是 “负载”?
在双向直流电源里,负载 = 输出电流 / 输出功率 / 等效电阻,三者都能代表负载大小:
电流 (A):最常用、最直接的负载指标
功率 (W):放电 = 正,充电 = 负(回馈)
等效电阻 (Ω):R = V / I
2. 仪器没有直接返回 “循环 - 负载” 的 SCPI
必须:
用 SCPI 读取 DLOG 历史记录
按时间戳拆分每一轮循环
计算每一轮的平均 / 峰值负载
建立循环次数 ↔ 负载关系
二、获取数据必须用的 SCPI 指令(直接复制)
1. 基础日志校验
scpi
*IDN? ! 识别仪器
DLOG:DEST? ! 必须 = FILE
DLOG:FILE:TIMESTAMP? ! 必须 = 1(带时间戳才能拆分循环)
DLOG:FILE:CAT? ! 列出所有历史日志文件
2. 读取 LIST 序列参数(计算循环边界)
scpi
SOUR:LIST:STEP? ! 序列步数
SOUR:LIST:DWEL? ! 每步时间
TRIG:COUN? ! 总循环次数
TRIG:DEL? ! 轮间延时
单轮时长 = 所有 DWEL 之和 + TRIG:DEL
3. 读取历史数据(负载计算核心)
scpi
DLOG:FILE:DATA?"日志文件名.csv"
返回格式(固定):
plaintext
时间戳, 电压(V), 电流(A), 功率(W)
电流 (A) = 直接代表负载大小
三、循环次数 ↔ 负载 计算逻辑
从日志取第一条时间戳作为基准
每条数据计算时间偏移
循环号 = int (时间偏移 / 单轮时长) + 1
同一循环号下的电流平均值 / 峰值 = 本轮负载
四、完整可运行 Python 代码(自动查询 + 解析 + 绘图)
功能:
自动连接电源
读取历史日志
自动拆分每一轮循环
计算每轮平均负载、峰值负载
绘制 循环次数 - 负载关系图
python
运行
import pyvisa
import matplotlib.pyplot as plt
from datetime import datetime
from collections import defaultdict
# ======================
# 1. 连接仪器
# ======================
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP0::192.168.1.10::inst0::INSTR") # 修改你的IP
inst.timeout = 30000
print("仪器识别:", inst.query("*IDN?").strip())
# ======================
# 2. 获取序列参数(单轮时长)
# ======================
dwel_list = list(map(float, inst.query("SOUR:LIST:DWEL?").split(",")))
trig_delay = float(inst.query("TRIG:DEL?"))
t_per_round = sum(dwel_list) + trig_delay
total_loops = int(inst.query("TRIG:COUN?"))
print(f"单轮时长:{t_per_round:.2f}s")
print(f"总循环次数:{total_loops}")
# ======================
# 3. 读取日志数据
# ======================
file_list = inst.query("DLOG:FILE:CAT?").split(",")
filename = file_list[0].strip()
print("使用日志文件:", filename)
raw_data = inst.query(f'DLOG:FILE:DATA?"{filename}"')
lines = raw_data.strip().split("n")
# ======================
# 4. 解析:循环次数 + 负载(电流)
# ======================
loop_current = defaultdict(list)
t0 = None
for line in lines:
if not line:
continue
parts = line.split(",")
ts_str = parts[0]
volt = float(parts[1])
curr = float(parts[2]) # 电流 = 负载
# 时间解析
ts = datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S.%f")
if t0 is None:
t0 = ts
dt = (ts - t0).total_seconds()
# 计算循环号
loop_num = int(dt / t_per_round) + 1
loop_current[loop_num].append(curr)
# ======================
# 5. 计算每轮平均负载 & 峰值负载
# ======================
loops = []
avg_loads = []
peak_loads = []
for loop in sorted(loop_current.keys()):
currents = loop_current[loop]
avg_curr = sum(currents) / len(currents)
peak_curr = max(max(currents), abs(min(currents))) # 含放电+充电
loops.append(loop)
avg_loads.append(avg_curr)
peak_loads.append(peak_curr)
# ======================
# 6. 绘制 循环次数 - 负载 图
# ======================
plt.figure(figsize=(12. 6))
plt.plot(loops, avg_loads, 'o-', label='平均负载(A)', linewidth=2)
plt.plot(loops, peak_loads, 's-', label='峰值负载(A)', linewidth=2)
plt.title("循环次数 - 输出负载关系", fontsize=14)
plt.xlabel("循环次数", fontsize=12)
plt.ylabel("负载 (A)", fontsize=12)
plt.grid(True)
plt.legend()
plt.show()
五、你将得到的图表效果
X 轴:循环次数
Y 轴:负载电流 (A)
两条曲线:
平均负载
峰值负载
可直观看到: ✅ 每轮负载是否稳定 ✅ 负载是否随循环上升 / 下降 ✅ 异常过载点
六、如果你只想用 SCPI 获取原始数据
直接执行这 4 条,复制到 Excel 即可自动分析:
scpi
DLOG:FILE:TIMESTAMP 1
DLOG:FILE:DATA?"log.csv"
SOUR:LIST:DWEL?
TRIG:COUN?