资讯中心

联系我们

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

如何通过第三方软件监控Keysight双向直流电源EEPROM的读操作?

2026-05-15 09:36:41  点击:

  Keysight 没有开放 “直接读取 EEPROM 读次数” 的硬件指令,所以只能用软件侧行为监控 + 关键读指令拦截 + 系统错误日志分析来实现。

  一、先明确:哪些操作会触发 EEPROM 读?

  Keysight 电源内部 EEPROM 存放:** 校准数据、用户配置、SAV/RCL 存储、系统参数、保护阈值。

  会触发 EEPROM 读的外部 SCPI 操作(全部可监控)

  *RCL n —— 从 EEPROM 读取配置

  *IDN? —— 读序列号 / 型号(部分型号读 EEPROM)

  CAL:DATA? / CAL:SAVE? —— 读取校准区

  SYST:SETUP:REC? —— 读取系统配置

  CONF? / VOLT:PROT? / CURR:PROT? —— 读保存过的保护参数

  SYST:ERR? —— 读错误日志(偶尔触发 EEPROM 读)

  开机自动加载配置(内部读,外部只能间接抓)

  结论:外部软件只能监控 “外部触发的读”,内部自动读无法直接计数,但可以通过上电事件 + 温度 + 运行时长做间接估算。

  二、监控原理(第三方软件 100% 可实现)

  SCPI 指令嗅探:所有发往仪器的指令先经过你的软件 → 判断是否为 “读 EEPROM 类指令” → 计数 + 1、记录日志。

  仪器返回特征分析:某些读指令返回固定长度 / 固定格式,可识别是否命中 EEPROM 区。

  系统错误轮询:EEPROM 读异常会报 SYST:ERR?(如校验错、读超时)。

  长期日志入库:SQLite 记录时间、温度、指令、返回值、错误码。

  可视化面板:读次数趋势、日 / 月统计、异常读告警。

  三、完整可运行代码(Python + PyVISA + 读监控 + 日志)

  1. 安装依赖

  bash

  运行

  pip install pyvisa sqlite3 pandas streamlit matplotlib

  2. EEPROM 读操作监控核心(eeprom_monitor.py)

  python

  运行

  import pyvisa

  import sqlite3

  import datetime

  import time

  # ========== 配置 ==========

  VISA_ADDR = "USB0::0x0957::0x1707::MY49001234::INSTR"

  SERIAL = "MY49001234"

  # 触发EEPROM读的关键字(可按手册扩展)

  READ_KEYWORDS = ["*RCL", "CAL:DATA?", "SYST:SETUP:REC?", "CONF?", "PROT?", "*IDN?"]

  # =========================

  # 数据库

  conn = sqlite3.connect("eeprom_read_log.db")

  c = conn.cursor()

  c.execute('''CREATE TABLE IF NOT EXISTS read_log

  (ts TEXT, serial TEXT, temp REAL, cmd TEXT, resp TEXT, err TEXT)''')

  conn.commit()

  # 仪器连接

  rm = pyvisa.ResourceManager()

  psu = rm.open_resource(VISA_ADDR)

  psu.timeout = 5000

  def get_temp():

  try:

  return float(psu.query("MEAS:TEMP?"))

  except:

  return None

  def get_err():

  try:

  return psu.query("SYST:ERR?").strip()

  except:

  return ""

  # 判断是否为EEPROM读指令

  def is_eeprom_read(cmd):

  return any(k in cmd.upper() for k in READ_KEYWORDS)

  # 拦截+转发+记录

  def send_cmd(cmd):

  ts = datetime.datetime.now().isoformat()

  temp = get_temp()

  err = get_err()

  try:

  if cmd.strip().endswith("?"):

  resp = psu.query(cmd).strip()

  else:

  psu.write(cmd)

  resp = "WRITE_OK"

  except Exception as e:

  resp = str(e)

  if is_eeprom_read(cmd):

  c.execute('INSERT INTO read_log VALUES (?,?,?,?,?,?)',

  (ts, SERIAL, temp, cmd, resp, err))

  conn.commit()

  print(f"[EEPROM READ] {cmd} @ {ts}")

  return resp

  # 示例:监控 *RCL、CAL:DATA?

  if __name__ == "__main__":

  while True:

  send_cmd("*RCL 1")

  send_cmd("CAL:DATA?")

  time.sleep(60)

  四、读操作历史可视化(Streamlit 面板)

  创建 app_read.py

  python

  运行

  import streamlit as st

  import pandas as pd

  import sqlite3

  st.title("