资讯中心

联系我们

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

如何通过SCPI指令查询双向直流电源序列历史记录的循环次数与负载的关系?

2026-06-10 10:12:04  点击:

  一、核心概念(必须先懂)

  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?