SCPI 命令全集(查询循环次数、能量、电压、电流、时间)
能量计算公式(仪器内部 + 上位机计算双验证)
循环次数 - 能量关系图表(自动生成)
每一轮循环消耗 / 输出了多少 Wh 或 J
一、核心概念(必须先懂)
序列 LIST 循环:一轮 = 完整执行一遍电压 / 电流阶梯波形
能量:电源输出 / 回馈的电能,单位 焦耳 (J) 或 瓦时 (Wh)
SCPI 无法直接返回 “循环 - 能量” 对照表,必须:
读取 DLOG 历史记录(电压、电流、时间戳)
计算每轮能量
建立循环次数 ↔ 累计能量 / 单轮能量 对应关系
二、获取数据所需 SCPI 指令(直接复制)
1. 基础配置查询
scpi
*IDN? ! 识别仪器
DLOG:DEST? ! 必须是 FILE(文件记录)
DLOG:FILE:TIMESTAMP? ! 必须 =1(带时间戳才能算能量)
DLOG:FILE:CAT? ! 列出所有历史日志文件
2. 读取序列配置(计算循环)
scpi
SOUR:LIST:STEP? ! 序列步数
SOUR:LIST:DWEL? ! 每步时间(秒)
TRIG:COUN? ! 总循环次数
3. 读取日志文件(能量计算核心数据)
scpi
DLOG:FILE:INFO?"日志名.csv" ! 元数据:起止时间
DLOG:FILE:DATA?"日志名.csv" ! 完整历史:时间,电压,电流,功率
4. 仪器直接读取能量(可选,高级机型支持)
scpi
FETC:ENER? ! 读取当前累计输出能量 (J)
注意:仅 N6705B/C 新版固件支持直接读能量;老机型必须用 V×I× 时间 计算。
三、数据格式与计算公式
1. DLOG 数据格式(带时间戳)
plaintext
时间戳, 电压(V), 电流(A), 功率(W)
2026-06-11 10:00:00.100.12.000.2.500.30.000
2. 能量计算公式
plaintext
单采样点能量 ΔE = 功率(W) × 采样间隔时间(s)
总能量 E = Σ(ΔE)
1 Wh = 3600 J
3. 循环次数计算
plaintext
单轮总时长 = 所有步骤 DWEL 之和
循环次数 = int( 采样时间偏移 / 单轮时长 ) + 1
四、完整可运行 Python 代码
功能:
SCPI 自动连接电源
读取日志 + 序列配置
计算每轮能量、累计能量
绘制 循环次数 - 能量 关系图
python
运行
import visa
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
# ======================
# 1. 连接仪器
# ======================
rm = visa.ResourceManager()
inst = rm.open_resource("TCPIP0::192.168.1.10::inst0::INSTR") # 修改为你的地址
inst.timeout = 20000
print("仪器:", inst.query("*IDN?").strip())
# ======================
# 2. 读取日志文件
# ======================
files = inst.query("DLOG:FILE:CAT?").split(",")
filename = files[0].strip()
print("使用文件:", filename)
# ======================
# 3. 读取 LIST 序列参数
# ======================
dwel_list = list(map(float, inst.query("SOUR:LIST:DWEL?").split(",")))
t_per_round = sum(dwel_list)
total_loops = int(inst.query("TRIG:COUN?"))
print(f"单轮时长: {t_per_round:.2f}s 总循环: {total_loops}")
# ======================
# 4. 读取历史数据
# ======================
raw_data = inst.query(f'DLOG:FILE:DATA?"{filename}"')
lines = raw_data.strip().split("n")
# ======================
# 5. 解析 + 计算能量 & 循环
# ======================
ts_list = []
loop_list = []
energy_list = []
cum_energy = 0
t0 = None
dt_sample = 0.1 # 默认0.1s,可从 DLOG:PER? 读取
for line in lines:
if not line:
continue
parts = line.split(",")
ts_str = parts[0]
volt = float(parts[1])
curr = float(parts[2])
power = volt * curr
# 时间解析
ts = datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S.%f")
if t0 is None:
t0 = ts
dt = (ts - t0).total_seconds()
# 循环号
loop = int(dt / t_per_round) + 1
# 能量累加
delta_E = power * dt_sample
cum_energy += delta_E
ts_list.append(dt)
loop_list.append(loop)
energy_list.append(cum_energy / 3600) # 转为 Wh
# ======================
# 6. 绘图:循环次数 - 能量
# ======================
plt.figure(figsize=(12. 6))
plt.plot(loop_list, energy_list, linewidth=2. color="#E63946")
plt.title("循环次数 - 输出能量关系", fontsize=14)
plt.xlabel("循环次数", fontsize=12)
plt.ylabel("累计能量 (Wh)", fontsize=12)
plt.grid(True)
plt.show()
五、图表展示效果
你将得到一张阶梯上升曲线:
X 轴:循环次数
Y 轴:累计输出能量(Wh)
每完成一轮,能量阶梯式上升
可直观看到: ✅ 每轮输出能量是否稳定 ✅ 总能量消耗 ✅ 异常波动 / 停机
六、如果你只想用 SCPI 获取原始数据
直接执行这 4 条,复制到 Excel 即可自己算能量:
scpi
DLOG:FILE:TIMESTAMP 1
DLOG:FILE:DATA?"log.csv"
SOUR:LIST:DWEL?
TRIG:COUN?