Keysight N79xxA / N89xxA SCPI 判断 LIST 列表输出执行结果
分四层校验:运行状态、完成标志、输出硬件状态、日志 / 缓存数据完整性、系统错误队列,层层确认列表是否完整成功跑完无异常。
一、1. 查询列表运行实时状态(最基础)
指令
scpi
SOURce:LIST:STATe?
返回数值定义:
0:IDLE 空闲,未运行 / 已停止
1:RUN 正在执行列表
2:PAUSE 暂停
使用逻辑 启动后轮询,直到返回0代表执行流程结束;搭配*WAI阻塞等待再查询结果。
scpi
SOUR:LIST:RUN
*WAI ! 仪器内部阻塞至列表结束
SOUR:LIST:STAT?
二、2. 校验硬件输出通道是否正常启闭
列表结束后可配置自动关输出 / 保持 / 置零,读取输出硬件状态:
scpi
OUTPut?
1:输出导通
0:输出关闭
配合结束模式配置反向验证:
scpi
! 提前设定列表跑完关闭输出
SOUR:LIST:END:OUT OFF
! 跑完查询
OUTP? → 预期0
可选结束模式:
OFF 断电关输出
HOLD 维持最后一步 V/I
ZERO 电压电流归零、输出不切断
三、3. 读取列表实际执行步数(判断有无中途中断)
设定总步数 vs 实际走完步数不一致 = 中途故障停止
scpi
! 查询编程设定总步数
SOUR:LIST:COUNt?
! 查询已经实际执行完成的步数
SOUR:LIST:EXEC:COUNt?
对比: EXEC:COUNt == LIST:COUNt → 完整跑完所有步骤 EXEC:COUNt < LIST:COUNt → 过流 / 过压 / 保护触发、手动 STOP、通信中断提前终止
示例校验:
scpi
SET_STEPS = `SOUR:LIST:COUN?`
ACT_STEPS = `SOUR:LIST:EXEC:COUN?`
if ACT_STEPS == SET_STEPS: 完整成功
else: 异常中断
四、4. 读取全局系统错误队列(是否运行时报保护 / 故障)
只要运行中出现 OVP/OCP/OTP/ 硬件错误,错误码会存入队列,成功无故障则只有+0
scpi
SYSTem:ERRor?
典型故障错误码(列表运行失败诱因)
-330:Self-test failed 自检故障
-222:Data out of range 列表电压 / 电流超限
-240:Hardware error 硬件故障
-250:File error 日志存储失败
+0."No error":无任何异常
批量清空旧错误再运行,避免历史干扰:
scpi
*CLS
SOUR:LIST:RUN;*WAI
SYST:ERR?
五、5. DLOG/ELOG 日志缓存校验(有采样记录 = 正常输出动作)
5.1 DLOG 电压电流采样点数校验
列表正常运行才会产生采样点数,点数 > 0 说明输出动作完整执行
scpi
! 查询LIST DLOG总采样点数
SOUR:LIST:DLOG:POINts?
返回0:列表未真正输出、DLOG 未采集到波形
大于 0:有完整 V/I 时序记录
5.2 ELOG 事件记录条数校验
ELOG 会记录列表启动、每一步切换、保护、结束事件
scpi
MEM:ELOG:COUNt?
条数 > 0 代表运行流程被仪器事件系统完整捕获。
5.3 时序抖动缓存存在性(开启 TIM 捕获时)
开启时序捕获后,正常运行必有抖动数据点
scpi
SOUR:LIST:TIM:POINts?
点数等于执行步数即时序采集完整。
六、6. 手动停止判断(主动终止场景)
如果中途下发停止指令
scpi
SOUR:LIST:STOP
可查询停止原因标识(新版固件)
scpi
SOUR:LIST:STOP:CAUSe?
返回值:
COMPLETE:正常全部执行完毕自动停止
USER:SCPI 手动 STOP 停止
PROT:保护 OVP/OCP/OTP 触发停机
七、完整一键校验 SCPI 脚本(跑完列表后直接下发)
scpi
*CLS
!1 运行状态
PRINT "列表运行状态:";SOUR:LIST:STAT?
!2 设定步数 vs 实际执行步数
PRINT "总设定步数:";SOUR:LIST:COUN?
PRINT "实际完成步数:";SOUR:LIST:EXEC:COUN?
!3 输出硬件状态
PRINT "通道输出状态:";OUTP?
!4 系统错误
PRINT "系统错误:";SYST:ERR?
!5 DLOG采样点数
PRINT "DLOG采样点数:";SOUR:LIST:DLOG:POIN?
!6 停止原因
PRINT "停止触发原因:";SOUR:LIST:STOP:CAUS?
八、判定成功的全部合格条件(全部满足才算 100% 成功)
SOUR:LIST:STAT? = 0 已停止空闲
SOUR:LIST:EXEC:COUN? == SOUR:LIST:COUN? 步数完全匹配
SYST:ERR? = +0."No error" 无故障保护报错
DLOG 点数 > 0 / ELOG 条数 > 0 有运行记录
停止原因COMPLETE
九、机型差异
N79xxA/N89xxA:全套EXEC:COUN、STOP:CAUS、TIM/DLOG/ELOG指令完整支持
E36100 BT:无EXEC:COUN/STOP:CAUS,依靠 STAT、SYST:ERR、DLOG 点数判断
N6705B:支持 STAT、步数、错误队列,时序抖动子系统精简
十、Python 自动化判断示例
python
运行
import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::IP::5025::INSTR")
def is_list_run_success(inst):
stat = int(inst.query("SOUR:LIST:STAT?"))
set_step = int(inst.query("SOUR:LIST:COUN?"))
act_step = int(inst.query("SOUR:LIST:EXEC:COUN?"))
err = inst.query("SYST:ERR?")
dlog_pts = int(inst.query("SOUR:LIST:DLOG:POIN?"))
stop_cause = inst.query("SOUR:LIST:STOP:CAUS?").strip()
print(f"状态:{stat},设定步数:{set_step},实际步数:{act_step}")
print(f"错误:{err},DLOG点数:{dlog_pts},停止原因:{stop_cause}")
# 全部合格条件
if stat == 0 and set_step == act_step and err.startswith('0') and dlog_pts>0 and stop_cause=="COMPLETE":
return True
return False
# 运行列表后调用
success = is_list_run_success(inst)
print("列表执行成功:", success)
inst.close()