一、核心结论:无专用 SCPI 指令直接返回长度阈值
Keysight N79xxA/N89xxA/E36100 BT/N6705B 没有MEM:PATH:LIMit?这类专用查询路径长度上限的 SCPI 命令。 获取限制分两套方案:
试探写入 / 创建文件 + 捕获 SCPI 错误码(仪器原生判定,最准)
上位机字符串长度校验 + 官方固件固定阈值比对
仪器固件固定长度阈值(全系列双向源统一 FAT32 嵌入式规则)
完整绝对路径总字符上限:127 个 ASCII 字符 格式:介质:目录1目录2文件名.后缀 整体不能超 127
单级文件夹名最大:31 字符
文件名(含后缀)最大:31 字符(8.3 长文件名兼容模式)
介质前缀INT:/USB:固定占 4 字符,会挤占可用长度
示例预留计算: INT:LOG = 7 字符,剩余可用 = 127 - 7 = 120 字符给子目录 + 日志文件名
二、SCPI 试探法:验证当前路径 / 文件名是否超限(实操指令)
1)测试自定义日志子目录长度上限(DLOG/ELOG)
scpi
*CLS
! 写入超长子目录名称(比如35个字母)
MEMory:ELOG:DIRectory "A123456789A123456789A123456789A12345"
SYSTem:ERR?
报错判定:
-257 File format error / -258 File corrupted:名称长度超限
+0 No error:长度合法
2)测试保存 DLOG/ELOG 日志文件名长度上限
scpi
*CLS
! 强制保存一条测试ELOG并指定超长文件名
MEMory:ELOG:SAVE "TEST_LONG_NAME_123456789_123456789.elog"
SYSTem:ERR?
超长文件名直接返回文件格式 / 写入故障错误码。
3)读取已有文件完整路径,上位机统计字符长度
SCPI 取出介质、子目录、文件名
scpi
MEM:ELOG:MED?
MEM:ELOG:DIR?
MEM:CAT? "LOG"
拼接完整路径字符串,Python / 上位机计算len(完整路径),对比 127 上限
三、分步 SCPI 交互流程(手动排查单个序列日志文件)
scpi
*CLS
!1 获取存储介质
MEM:FILE:MED? "run001.dlog"
!2 获取ELOG/DLOG全局子目录
MEM:DLOG:DIR?
!3 拼接完整路径字符串(举例)
! MED=INT DIR=SEQ_TEST FILE=run001.dlog → INT:LOGSEQ_TESTrun001.dlog
!4 试探写入同名副本,看是否长度超限
MEM:FILE:COPY "run001.dlog","run001_copy.dlog"
SYST:ERR?
复制失败且错误码 - 257/-258 = 路径总长超标。
四、Python 自动化校验(路径长度统计 + 超限探测)
python
运行
import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::192.168.1.100::INSTR")
MAX_FULL_PATH = 127
MAX_NAME_SEG = 31
def check_path_length(inst, fname, log_type="DLOG"):
# 读取介质、子目录
if log_type == "DLOG":
media = inst.query("MEM:DLOG:MED?").strip()
subdir = inst.query("MEM:DLOG:DIR?").strip()
else:
media = inst.query("MEM:ELOG:MED?").strip()
# 拼接完整路径
path_parts = [f"{media}:\LOG\"]
if subdir:
path_parts.append(f"{subdir}\")
path_parts.append(fname)
full_path = "".join(path_parts)
total_len = len(full_path)
print(f"完整路径:{full_path}")
print(f"总字符长度:{total_len},全局上限{MAX_FULL_PATH}")
# 分段校验文件夹/文件名单段长度
dir_seg_len = len(subdir) if subdir else 0
file_seg_len = len(fname)
print(f"子目录名长度:{dir_seg_len},单段上限{MAX_NAME_SEG}")
print(f"文件名长度:{file_seg_len},单段上限{MAX_NAME_SEG}")
# SCPI试探复制验证是否仪器拒绝
inst.write("*CLS")
test_copy = "tmp_check.dlog"
inst.write(f'MEM:FILE:COPY "{fname}","{test_copy}"')
err_code, err_msg = inst.query("SYST:ERR?").split(',')
err_code = int(err_code)
if err_code != 0:
print(f"⚠️ 操作失败 错误{err_code}:{err_msg},大概率路径长度超限")
else:
print("✅ 路径长度合法,仪器可正常读写")
inst.write(f'MEM:FILE:DEL "{test_copy}"') # 删除临时副本
return total_len, full_path
# 批量校验LOG目录所有序列历史文件
file_list_raw = inst.query('MEM:CAT? "LOG"').strip()
files = [f.strip('"') for f in file_list_raw.split(',')]
for f in files:
check_path_length(inst, f, "DLOG")
inst.close()
五、各型号兼容差异
N79xxA / N89xxA(大功率双向源) 严格 127 总路径、31 单段名称限制,DLOG/ELOG/ARB 共用同一文件系统规则
E36100 BT 小型双向源 阈值完全一致,无独立 DLOG/ELOG 分支,统一MEM:LOG体系
N6705B/N6700B 模块化主机 同样 127 总路径上限,不支持多层深度子目录(最多 1 级自定义子文件夹)
六、超限故障典型错误码对照表
表格
七、工程避限最佳实践
日志文件名控制在 **≤20 字符 **(含.dlog/.elog 后缀)
自定义子目录名 **≤20 字符 **,只建 1 层子文件夹,不嵌套多层
自动命名只用字母、数字、下划线,不叠加长时间戳 / 长备注文本
保存前先用上位机预计算路径总长,提前截断超长名称