# keysight **Repository Path**: osr-tech/keysight ## Basic Information - **Project Name**: keysight - **Description**: Keysight MXR/EXR 系列示波器 Python 驱动 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-25 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # keysight 使用 pyvisa 对 Keysight Infiniium MXR/EXR 系列示波器进行控制的 Python 驱动,支持 Windows 和 Linux 平台。 ## 支持的示波器型号 驱动的 SCPI 命令基于 Keysight Infiniium MXR/EXR 系列编程手册(文档号 9018-18183)编写,并针对以下型号验证过: | 型号 | 说明 | |------|------| | MXR604B | 6 GHz 带宽,4 模拟通道,16 GSa/s | 其他 MXR/EXR 系列型号共享同一套命令集,理论上可直接使用,但未逐一实测。 **注意**:Keysight InfiniiVision 系列(如 DSO-X/MSO-X 2000/3000/4000 系列)使用不同的 SCPI 命令集(通道耦合/阻抗、触发电平命令、外部触发源关键字等均不同),**不兼容**本驱动,不要用于该系列示波器。 ## 安装 ```bash pip install -e . ``` ## 依赖 - pyvisa - numpy 还需要安装 VISA backend(如 NI-VISA 或 pyvisa-py): ```bash pip install pyvisa-py ``` ## 快速开始 ```python from keysight import ( KeySightScope, CHANNEL, COUPLING, IMPEDANCE, BANDWIDTH, TRIGGER_DIR, SAMPLE_RATE, HOR_SCALE, PRECISION, ) # 连接示波器 - 支持多种地址格式: # 1. IP地址(推荐) scope = KeySightScope("192.168.1.100") # 2. 完整VISA地址 # scope = KeySightScope("TCPIP0::192.168.1.100::inst0::INSTR") # 3. USB地址(可在 示波器菜单->实用程序->系统应用菜单->I/O 中查看) # scope = KeySightScope("USB0::0x2A8D::0x1234::MYxxxxxxxx::0::INSTR") # 重置示波器全部参数 scope.reset() # 配置通道 (2000mV/div, DC耦合, 1MΩ阻抗) scope.set_channel( channel=CHANNEL.C1, coupling=COUPLING.DC, impedance=IMPEDANCE.ONEM, vscale=2000.0, # 垂直scale,单位mV voffset=0, # 垂直偏移,单位mV bandwidth=BANDWIDTH.BW_OFF, view=True, ) # 配置触发(通道1,1000mV,上升沿) scope.set_trigger( source=CHANNEL.C1, threshold=1000.0, direction=TRIGGER_DIR.POSSITIVE, ) # 配置采集和水平参数 scope.set_acquire( SAMPLE_RATE.SR_200M, hscale=HOR_SCALE.HOR_500US, hoffset=0, sequence=1, # >1 时使用分段(segmented)采集 ) # 布防并采集 scope.arm() samples = scope.acquire_samples([CHANNEL.C1, CHANNEL.C2], precision=PRECISION.INT8) # 关闭连接 scope.close() ``` ## 参数配置 ### 通道 (CHANNEL) - `C1`, `C2`, `C3`, `C4`: 模拟通道 - `EXT`: 外部触发输入(对应示波器的 AUX 输入),只能作为 `set_trigger` 的 `source` ### 耦合 (COUPLING) / 阻抗 (IMPEDANCE) - `COUPLING`: `DC`, `AC` - `IMPEDANCE`: `ONEM`(1MΩ), `FIFT`(50Ω) `set_channel` 会把 `coupling` + `impedance` 组合映射为示波器的 `:CHANnel:INPut` 命令,支持的组合为: - DC + 1MΩ - DC + 50Ω - AC + 1MΩ **AC + 50Ω 在该系列示波器上不支持**,传入该组合会记录错误日志并跳过通道设置,不会发送非法命令。 ### 带宽限制 (BANDWIDTH) - `BW_OFF`: 不限制带宽 - `BW_20M`: 20MHz 低通滤波 - `BW_200M`: 200MHz 低通滤波 ### 触发方向 (TRIGGER_DIR) - `POSSITIVE`: 上升沿触发 - `NEGATIVE`: 下降沿触发 ### 采样率 (SAMPLE_RATE) 从 2 kSa/s 到 16 GSa/s,1-2-5 阶梯,共 22 个档位,例如 `SR_2K`、`SR_10M`、`SR_500M`、`SR_1G`、`SR_16G`。示波器的 `:ACQuire:SRATe` 命令本身接受任意实数并自动就近取整,此枚举只是常用挡位的便捷封装。 ### 水平时基 (HOR_SCALE) 从 1ns/div 到 50s/div,1-2-5 阶梯。 ### 数据精度 (PRECISION) - `INT8`(对应 `BYTE`):8-bit 有符号数据 - `INT16`(对应 `WORD`):16-bit 有符号数据 ## 序列(分段)采集模式 `set_acquire` 的 `sequence` 参数大于 1 时使用分段(segmented)采集,`acquire`/`acquire_samples` 会自动按段读取并拼接为二维数组: ```python scope.set_acquire(SAMPLE_RATE.SR_1G, HOR_SCALE.HOR_1US, sequence=100) scope.arm() samples = scope.acquire_samples([CHANNEL.C1]) # shape: [100, N] ``` ## 版权与许可声明 本项目仅用于学习科研使用,如果您需要将本项目代码用于商业产品,请联系我们获取商业许可证。