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("