一、核心前提限制(Keysight N6705B/C、N6700、8600/8612 双向直流电源)
DLOG 序列历史日志默认不采集风扇转速 DLOG 原生采样通道只有:电压、电流、功率,没有内置风扇转速采集点,历史文件里不会自带风扇转速数据;无法直接从已存 log.csv/bin 里读出转速。
风扇转速属于仪器硬件状态监测量,只能实时读取,分两套 SCPI 体系:实时单读转速、部分机型可扩展同步记录。
想要建立「循环次数 ↔ 风扇转速」对应关系,只有两种可行方案:
方案 A:运行 LIST 序列时,上位机高频轮询读取风扇转速 + 同步记录时间戳,事后按循环分组匹配;
方案 B(高固件 8600 系列):开启扩展监测采样,把风扇转速并入 DLOG 采样流一同存入文件。
二、实时读取风扇转速 SCPI 基础指令
1. N6705B/C/ N6700 小功率双向机型
scpi
SYST:FAN:SPEED?
返回数值:风扇转速 RPM(转 / 分钟);低负载低速、大功率高转速自动调速。
配套温度参考(风扇调速依据)
scpi
SYST:TEMP? ! 内部功率模块温度 ℃
2. 8600/8612 高功率回馈双向电源
指令兼容,额外支持多分区风扇读取:
scpi
SYST:FAN1:SPEED?
SYST:FAN2:SPEED?
多风扇机型分别读取主功率风扇、辅助机箱风扇转速。
3. 风扇工作状态查询
scpi
SYST:FAN:STAT?
1= 风扇正常运转;0= 停转 / 待机低速休眠。
三、方案 A:上位机同步采集(通用所有机型,无固件门槛)
整体流程
下发 LIST 序列启动INIT;*TRG;
上位机循环高频轮询:时间戳、循环完成数、风扇转速、功率;
测试结束后,用时间偏移划分每一轮循环,归集每一轮全程风扇转速(平均值、最大转速),形成循环次数 — 风扇转速映射。
配套时序 SCPI
scpi
!1 读取LIST循环时序参数,用于划分轮次
SOUR:LIST:DWEL?
TRIG:DEL?
STAT:TRIG:COUN? ! 已完成整轮循环数量
INIT:STAT? ! 序列是否运行中
!2 高频轮询读取
SYST:FAN:SPEED? ! 实时转速RPM
SYST:TEMP?
MEAS:POW? ! 实时功率(负载大小决定风扇快慢)
匹配逻辑
记录每一次轮询的系统时间 SYST:DATE?;SYST:TIME?;
计算相对启动时间偏移,匹配归属循环号;
对同一循环内所有转速采样,计算单轮平均转速、峰值最高转速。
四、方案 B:DLOG 嵌入风扇转速同步记录(仅 8600 高固件支持)
N6705 系列 DLOG 无扩展通道,只有 8600 平台支持添加系统监测量到 DLOG 采样:
开启 DLOG 扩展采样,挂载风扇转速通道
scpi
DLOG:CHAN:EXT FAN1
DLOG:CHAN:EXT:FAN1 ENABLE
启动记录后,日志文件新增一列风扇转速,格式变为: 时间戳,V,I,P,FanSpeed
后续读取DLOG:FILE:DATA?"xxx.csv",直接解析每一行转速,再按循环分组统计。
五、无法从旧历史 DLOG 文件提取风扇转速
重点误区:
之前跑完保存的旧 log 文件,当时没开 EXT 扩展通道,文件里永远没有转速字段,没有任何 SCPI 能逆向读出当时风扇数据;
N6705A/B/C 全系无 DLOG 扩展监测通道,只能用方案 A 上位机同步轮询;
ELOG 事件日志只记录过温、故障停机,不连续存储转速曲线。
六、完整标准化 SCPI 执行序列(方案 A 实时同步采集)
scpi
! 1. 初始化序列配置
SOUR:LIST:STEP?
SOUR:LIST:DWEL?
TRIG:COUN?
TRIG:DEL?
DLOG:DEST FILE
DLOG:FILE:TIMESTAMP 1
! 2. 启动LIST序列
INIT
*TRG
! 3. 运行中循环轮询(上位机循环下发)
SYST:DATE?
SYST:TIME?
STAT:TRIG:COUN?
SYST:FAN:SPEED?
SYST:TEMP?
MEAS:POW?
! 4. 停止后读取DLOG功率时序做对照
DLOG:FILE:CAT?
DLOG:FILE:DATA?"log.csv"
七、数据统计维度(循环 - 风扇转速关系)
每组循环可输出三个关键指标:
单轮峰值风扇转速(本轮最高 RPM)
单轮平均风扇转速
转速波动差值(最大 - 最小)
示例对照表
表格
八、Python 极简采集框架(同步抓循环、转速、时间)
python
运行
import pyvisa
from datetime import datetime
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::192.168.1.100::INSTR", timeout=20000)
# 获取单轮LIST总时长
dwel = list(map(float, inst.query("SOUR:LIST:DWEL?").split(",")))
delay = float(inst.query("TRIG:DEL?"))
t_round = sum(dwel) + delay
# 启动序列
inst.write("INIT;*TRG")
record = []
start_time = datetime.now()
# 持续采集直到序列结束
while int(inst.query("INIT:STAT?")) == 1:
now = datetime.now()
delta = (now - start_time).total_seconds()
loop = int(delta / t_round) + 1
fan_rpm = float(inst.query("SYST:FAN:SPEED?"))
temp = float(inst.query("SYST:TEMP?"))
power = float(inst.query("MEAS:POW?"))
record.append([loop, delta, fan_rpm, temp, power])
# 按循环分组求均值、峰值
from collections import defaultdict
loop_fan = defaultdict(list)
for row in record:
loop_fan[row[0]].append(row[2])
res = []
for loop, rpm_list in sorted(loop_fan.items()):
res.append({
"循环": loop,
"平均转速": sum(rpm_list)/len(rpm_list),
"峰值转速": max(rpm_list)
})
for item in res:
print(item)
九、补充故障相关
风扇超速 / 停转事件会写入 ELOG,可查询历史故障事件:
scpi
ELOG:DATA? N