资讯中心

联系我们

深圳市维立信电子科技有限公司
地址:深圳市福田区红荔路第一世界广场A座8D-E
咨询电话:0755-83766766
E-mail:info@welissom.com

如何通过SCPI指令查询双向直流电源序列历史记录的文件路径是否包含特殊字符?

2026-06-12 09:29:23  点击:

  核心前提

  Keysight N79xxA/N89xxA 双向直流电源没有内置一条 SCPI 指令直接返回 “是否含特殊字符”;流程分两步:

  SCPI 完整读出绝对路径字符串(介质 + 目录 + 文件名)

  上位机(Python/VISA)对返回字符串做非法特殊字符校验 仪器仅负责输出完整路径文本,字符判断逻辑由客户端实现。

  一、SCPI 完整读取序列历史文件绝对路径(DLOG/ELOG)

  1. 批量读取全部日志文件名

  scpi

  ! 列出LOG目录所有DLOG/ELOG序列历史文件

  MEMory:CATalog? "LOG"

  返回样例:"seq_01.dlog","run#2.elog","test>v1.dlog"

  2. 单文件读取介质、自定义子目录,拼接完整绝对路径

  scpi

  *CLS

  ! 1.查询文件所在存储介质 INT/USB

  MEM:FILE:MEDium? "run#2.elog"

  ! 2.查询ELOG/DLOG自定义子目录

  MEM:ELOG:DIRectory?

  MEM:DLOG:DIRectory?

  路径拼接规则

  无自定义子目录:介质:LOG文件名

  有自定义子目录:介质:LOG子目录名文件名 示例:INT:LOGSEQ_RUNrun#2.elog

  3. 全局日志默认路径读取

  scpi

  MEM:LOG:MEDium?

  MEM:LOG:DIRectory?

  二、仪器禁止 / 判定的非法特殊字符清单(仪器固件校验规则)

  仪器文件系统兼容规则(和 FAT32 / 嵌入式闪存一致),以下字符属于危险特殊字符,出现会造成读取异常、文件损坏、SCPI 报错-257/-258:

  系统禁止路径 / 名字符: / : * ? " < > |

  高风险干扰字符:# & @ $ % ^ ( ) [ ] { } ~ (空格、制表、中文全角符号)

  控制不可见 ASCII(0~31)

  安全仅允许:大小写字母、数字、下划线_、小数点.

  三、SCPI+Python 自动化校验完整流程

  步骤 1:SCPI 取回全部路径字符串

  步骤 2:正则匹配检测特殊字符

  步骤 3:尝试读取文件,捕获仪器报错二次验证(强校验)

  python

  运行

  import re

  import pyvisa

  # 仪器禁止的特殊字符正则模式

  INVALID_CHAR_PATTERN = r'[\/:*?"<>|#&@$%^()[]{}~ t一-鿿]'

  def check_path_special_char(inst, fname, log_type="ELOG"):

  # 1. SCPI读取介质与子目录

  if log_type == "ELOG":

  media = inst.query("MEM:ELOG:MED?").strip()

  subdir = inst.query("MEM:ELOG:DIR?").strip()

  else:

  media = inst.query("MEM:DLOG:MED?").strip()

  subdir = inst.query("MEM:DLOG:DIR?").strip()

  # 拼接完整绝对路径

  base = f"{media}:\LOG\"

  if subdir:

  base += subdir + "\"

  full_path = base + fname

  print(f"完整路径:{full_path}")

  # 2. 正则检测特殊字符

  bad_matches = re.findall(INVALID_CHAR_PATTERN, full_path)

  if bad_matches:

  print(f"❌ 路径包含特殊字符:{list(set(bad_matches))}")

  else:

  print("✅ 路径仅含安全字符")

  # 3. 仪器读写强校验(含特殊字符大概率读取出错)

  inst.write("*CLS")

  inst.query(f'MEM:DATA? "{fname}"')

  err_code, err_msg = inst.query("SYST:ERR?").split(',')

  if int(err_code) != 0:

  print(f"⚠️ 文件访问报错 {err_code}:{err_msg},极大概率特殊字符导致解析失败")

  return full_path, bad_matches

  # 连接仪器执行

  rm = pyvisa.ResourceManager()

  inst = rm.open_resource("TCPIP::192.168.1.100::INSTR")

  # 读取全部日志文件列表

  file_raw = inst.query('MEM:CAT? "LOG"').strip()

  file_list = [f.strip('"') for f in file_raw.split(',')]

  # 逐个校验每一个序列历史文件路径

  for log_file in file_list:

  check_path_special_char(inst, log_file, log_type="DLOG")

  inst.close()

  四、仪器侧辅助校验 SCPI 手段(无判断返回值,靠错误码)

  1. 试探性打开文件,非法字符直接抛错误码

  scpi

  *CLS

  MEMory:DATA? "run>v1.dlog"

  SYST:ERR?

  -257 File format error:路径含非法字符、名称解析失败

  -256 File missing:字符错乱导致仪器找不到文件

  +0:路径名称解析正常

  2. 批量重命名清理特殊字符(修复指令)

  scpi

  ! 将带#特殊字符的文件重命名为安全名称

  MEMory:FILE:REName "run#2.elog","run_2.elog"

  五、型号差异说明

  N79xxA / N89xxA:完整支持MEM:FILE:MED、MEM:DIR、MEM:CAT,错误码标准统一

  E36100 BT 小型双向源:无独立 DLOG/ELOG 分支,统一用MEM:LOG:MED?,校验逻辑完全一致

  老 N6705B:无自定义子目录DIRectory指令,仅根路径INT:LOG,字符限制相同

  六、最佳实践规避特殊字符

  自动生成序列日志文件名只用:字母 + 数字 + 下划线

  禁止脚本中带入空格、#、>、中文、括号

  保存序列 / 日志前先用上述脚本批量预检路径字符