资讯中心

联系我们

深圳市维立信电子科技有限公司
地址:深圳市福田区红荔路第一世界广场A座8D-E
咨询电话:0755-83766766
E-mail:info@welissom.com

如何通过SCPI指令查询双向直流电源序列历史记录的循环次数与输出功率的积分值?

2026-06-10 10:13:07  点击:

  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;

  用时间列计算偏移→匹配循环号;

  新增列:单点能量=功率*采样周期;

  数据透视表:行 = 循环次数,值 = 单点能量求和,直接得到每轮积分总值。