一、Keysight N79xxA / N89xxA 双向直流电源 文件损坏判断完整 SCPI 流程
仪器无单一专用FILE:CHECK校验指令,依靠文件元数据查询 + 读取测试 + 系统错误队列校验三层判断 ELOG(序列事件历史)、DLOG(序列采样记录)文件是否损坏。
1. 第一步:读取文件基础状态元数据
1.1 查询文件大小、存在性、存储属性
scpi
! 查询文件是否存在+字节大小,替换"seq_run01.dlog"为你的日志文件名
MEMory:FILE:SIZE? "seq_run01.dlog"
返回正数:文件存在,返回值 = 字节数
返回0/ 仪器报错:文件丢失、空文件、文件头损坏
scpi
! 查询文件存储介质(INT内部/USB外部)
MEMory:FILE:MEDium? "seq_run01.elog"
异常场景:本该INT却返回空 / 报错,代表文件系统索引损坏。
1.2 读取文件格式标识(校验文件头有效性)
scpi
MEMory:FILE:FORMat? "seq_run01.dlog"
正常返回:BIN / ASC / CSV 报错 / 无返回:文件头部标识被破坏,判定损坏。
2. 第二步:尝试读取文件内容,捕获系统错误(核心判定手段)
读取损坏文件时仪器会立刻写入SCPI 系统错误队列,通过SYST:ERR?抓取损坏错误码。
标准检测指令序列
scpi
*CLS ! 清空历史错误缓存
MEMory:DATA? "seq_run01.dlog" ! 尝试加载日志文件
SYSTem:ERR? ! 读取本次操作错误代码+描述
关键错误码含义(文件损坏专属)
表格
3. 第三步:ELOG/DLOG 专属序列历史完整性校验
3.1 ELOG(序列启停、报错、触发事件历史)完整性检查
scpi
! 读取ELOG总记录条数
MEMory:ELOG:COUNt?
! 逐条读取事件记录,中途报错即代表日志断裂损坏
MEMory:ELOG:DATA? 0.100
正常:完整返回每条序列运行时间戳、触发条件、OVP/OCP 保护记录
中途中断 / 报错:ELOG 日志区块损坏
3.2 DLOG(ARB 输出序列波形采样历史)完整性检查
scpi
! 查询DLOG采样点数
MEMory:DLOG:POINts?
! 批量读取采样电压/电流时序数据
MEMory:DLOG:DATA?
若返回点数为 0 但实际运行过序列、或读取中途抛出-258.DLOG 采样记录文件损坏。
4. 第四步:校验和二次比对(高级完整性验证)
新固件(≥6.00)支持文件 CRC 校验和读取,用于传输 / 存储前后比对:
scpi
! 获取仪器内部计算的文件CRC32校验值
MEMory:FILE:CHECKSUM? "seq_run01.dlog"
操作逻辑:
仪器写入日志时记录CHECKSUM
复测读取校验值,数值不一致 = 文件被篡改 / 损坏
5. 完整自动化 Python 检测示例(VISA)
python
运行
import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::192.168.1.50::INSTR")
filename = "seq001.elog"
def check_file_corrupt(inst, fname):
inst.write("*CLS")
# 1. 查文件大小
size = inst.query(f'MEM:FILE:SIZE? "{fname}"').strip()
print(f"文件大小:{size} Bytes")
# 2. 尝试读取文件
inst.query(f'MEM:DATA? "{fname}"')
# 3. 抓取错误
err_code, err_msg = inst.query("SYST:ERR?").split(',')
err_code = int(err_code)
if err_code == 0:
print("✅ 文件完好无损坏")
# 读取校验和(新固件)
try:
crc = inst.query(f'MEM:FILE:CHECKSUM? "{fname}"').strip()
print(f"文件CRC校验值:{crc}")
except:
print("当前固件不支持CHECKSUM指令")
return False
else:
print(f"❌ 文件损坏 错误码:{err_code}, 详情:{err_msg}")
return True
# 执行检测
is_broken = check_file_corrupt(inst, filename)
inst.close()
二、型号兼容区分
N79xxA / N89xxA 大功率双向源:完整支持MEM:FILE:SIZE/FORMAT/MEDIA、SYST:ERR损坏报错、新版带CHECKSUM
BT 小型双向源(E36100 系列):无独立 DLOG/ELOG 分支,仅用MEM:DATA? + SYST:ERR?判断全局日志文件
老款 Agilent N6705B:指令子集一致,损坏错误码完全通用,无CHECKSUM校验
三、损坏文件修复 / 清理配套指令
scpi
! 删除损坏日志文件
MEMory:FILE:DELete "seq_run01.dlog"
! 清空全部ELOG序列历史
MEMory:ELOG:CLEar
! 清空全部DLOG采样记录
MEMory:DLOG:CLEar
! 格式化内部存储(谨慎操作,清空所有日志/序列)
MEMory:FORMat INT