Keysight N6705B/C、N6700、8600 双向电源:循环次数 — 功率积分(能量)SCPI 全流程
功率积分本质就是电能能量,E=∫P⋅dt,单位焦耳 (J) / 瓦时 (Wh);无单条 SCPI 直接返回「循环号 - 积分值」,分两条实现路径:
仪器内置能量寄存器(实时运行快速读取总积分)
DLOG 历史日志逐点积分计算(回溯每轮独立积分值,精准拆分单循环能量)
一、核心 SCPI 基础指令
1. 读取 LIST 序列时序(划分循环边界必备)
scpi
SOUR:LIST:STEP? ! 单轮序列步数
SOUR:LIST:DWEL? ! 每一步保持时间(s)数组
TRIG:COUN? ! 预设总循环轮数
TRIG:DEL? ! 两轮之间等待延时(s)
单轮完整时长:数组
2. 仪器内置全局功率积分(全程总能量,实时)
scpi
FETC:ENER? ! 读取自清零后总积分能量,单位 J
FETC:CLEAR ! 清空积分寄存器,重新开始累计
STAT:TRIG:COUN? ! 已完整跑完的循环数量
适用场景:只需要全部循环总能量,无法拆分单轮;双向机型自动区分正负功率(放电正、充电回馈负积分)。
3. DLOG 日志前置校验(回溯单轮积分唯一方案)
scpi
DLOG:DEST? ! 必须返回FILE
DLOG:FILE:TIMESTAMP? ! 必须=1.带绝对时间戳精准积分
DLOG:PER? ! DLOG采样周期Δt(s)
DLOG:FILE:CAT? ! 获取日志文件名
DLOG:FILE:DATA?"xxx.csv" ! 导出全量时序:时间,V,I,P
日志行格式:YYYY-MM-DD HH:MM:SS.fff,Voltage,Current,Power(W)
二、积分数学原理
离散采样积分(DLOG 标准算法) 单点微能量:ΔEi=Pi×Δt 分段累加:同一循环内所有ΔEi求和 = 本轮功率积分值
单位换算:Wh=J÷3600
双向特性:放电 P>0.积分正向累加;回馈充电 P<0.积分负向叠加,可分开统计放电总积分、回馈总积分。
三、两套实操方案
方案 1:实时全局总积分(快速,不分单轮)
清空积分寄存器
scpi
FETC:CLEAR
启动 LIST 序列
scpi
INIT;*TRG
任意时刻读取全程总功率积分 + 已完成循环数
scpi
STAT:TRIG:COUN?
FETC:ENER?
缺陷:只能拿到整体总和,不能提取第 1 轮、第 2 轮各自积分。
方案 2:DLOG 历史日志拆分单循环积分(精准,可回溯旧文件)
完整 SCPI 下发序列
scpi
!1 校验日志环境
DLOG:DEST FILE
DLOG:FILE:TIMESTAMP 1
!2 获取循环时长
SOUR:LIST:DWEL?
TRIG:DEL?
!3 读取日志原始数据
DLOG:FILE:CAT?
DLOG:FILE:DATA?"record.csv"
上位机分步解析逻辑
提取第一条时间戳t0为基准;
每行解析时间、瞬时功率P;
计算相对时间偏移Δttotal=tsample−t0;
归属循环编号 Loop=⌊Δttotal/Tround⌋+1;
同 Loop 下所有Pi×DLOG_PER累加,得到本轮独立功率积分;
额外统计:本轮正向积分(放电)、负向积分(回馈)、净积分。
四、Python 可运行解析代码(输出循环 - 积分对照表)
python
运行
import pyvisa
from datetime import datetime
from collections import defaultdict
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::192.168.1.50::INSTR", timeout=30000)
# 1. 获取单轮时长
dwel = list(map(float, inst.query("SOUR:LIST:DWEL?").split(",")))
delay = float(inst.query("TRIG:DEL?"))
t_round = sum(dwel) + delay
sample_dt = float(inst.query("DLOG:PER?"))
# 2. 读取日志
fname = inst.query("DLOG:FILE:CAT?").split(",")[0].strip()
raw = inst.query(f'DLOG:FILE:DATA?"{fname}"')
lines = raw.strip().splitlines()
# 3. 按循环分组、积分计算
loop_energy = defaultdict(lambda: {"net":0.0. "pos":0.0. "neg":0.0})
t0 = None
for line in lines:
if not line:
continue
ts_str, v, i, p = line.split(",")
p_val = float(p)
dt = datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S.%f")
if t0 is None:
t0 = dt
delta_t = (dt - t0).total_seconds()
loop = int(delta_t / t_round) + 1
e_step = p_val * sample_dt
loop_energy[loop]["net"] += e_step
if p_val > 0:
loop_energy[loop]["pos"] += e_step
else:
loop_energy[loop]["neg"] += e_step
# 打印循环与功率积分(J)
print(f"{'循环次数':<6}{'净积分(J)':<12}{'放电积分(J)':<12}{'回馈积分(J)'}")
for loop in sorted(loop_energy.keys()):
data = loop_energy[loop]
print(f"{loop:<6}{data['net']:<12.2f}{data['pos']:<12.2f}{data['neg']:.2f}")
五、关键限制与误区
旧无时间戳日志(Timestamp=0)误差大 仅依靠理论 DLOG:PER 间隔积分,时钟漂移会造成循环分组错位,必须开启DLOG:FILE:TIMESTAMP 1;
N6705A 初代 Agilent 无FETC:ENER与完整 DLOG 文件接口,只能上位机外部采集积分;
FETC:ENER寄存器断电清零,仅单次运行有效,无法保存历史积分;
ELOG 事件日志无连续功率采样,不能用来积分计算;
积分采样精度由DLOG:PER决定,采样间隔越小,积分结果越精准。
六、拓展绘图:循环次数 — 净功率积分曲线
在代码末尾追加绘图段:
python
运行
import matplotlib.pyplot as plt
loops = sorted(loop_energy.keys())
net_e = [loop_energy[l]["net"]/3600 for l in loops] # 转为Wh
plt.figure(figsize=(10.5))
plt.plot(loops, net_e, marker='o', linewidth=2)
plt.xlabel("循环次数")
plt.ylabel("累计净能量(Wh)")
plt.title("循环次数-功率积分(能量)关系")
plt.grid(True)
plt.show()
七、快速 Excel 离线分析方案
导出DLOG:FILE:DATA?"xxx.csv"全部文本粘贴 Excel;
用时间列计算偏移→匹配循环号;
新增列:单点能量=功率*采样周期;
数据透视表:行 = 循环次数,值 = 单点能量求和,直接得到每轮积分总值。