# Keysight3000TX

## class Keysight3000TX( visa_resource: str | VisaConfig, )[source]

Bases: [`ScopeDriverBase`](https://dev.nominal.io/instro/ref/instruments/instro.scope.ScopeDriverBase.md#instro.scope.ScopeDriverBase "instro.scope.scope.ScopeDriverBase")

SCPI driver for Keysight InfiniiVision 3000T X-Series oscilloscopes (2- and 4-channel DSO/MSO).

Methods

| [`check_errors`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.check_errors "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.check_errors") | Drain `:SYSTem:ERRor?` until it reports `0` and raise listing every non-zero entry. |
| --- | --- |
| [`close`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.close "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.close") | Close the underlying transport. |
| [`digitize`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.digitize "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.digitize") | `:DIGitize` the cached trigger source, then `*OPC?` under a scoped VISA timeout. |
| [`fetch_waveform`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.fetch_waveform "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.fetch_waveform") | Fetch the waveform from `channel` over `WORD` (unsigned 16-bit, LSB-first), requesting 1000 points. |
| [`force_trigger`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.force_trigger "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.force_trigger") | Force a trigger event immediately, regardless of the configured conditions. |
| [`get_acquisition_mode`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_acquisition_mode "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_acquisition_mode") | Read back the current acquisition mode. |
| [`get_acquisition_state`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_acquisition_state "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_acquisition_state") | `:OPERegister:CONDition?` bit 3 (0x08) — set = RUNNING, clear = STOPPED. |
| [`get_average_count`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_average_count "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_average_count") | Read back the waveforms-to-average count. |
| [`get_channel_display`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_channel_display "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_channel_display") |  |
| [`get_coupling`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_coupling "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_coupling") | Read back input coupling on `channel`. |
| [`get_horizontal_scale`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_horizontal_scale "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_horizontal_scale") | Read back the timebase (seconds/div). |
| [`get_probe_attenuation`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_probe_attenuation "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_probe_attenuation") | Read back `channel`'s probe attenuation ratio. |
| [`get_sample_rate`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_sample_rate "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_sample_rate") | Read back the current sample rate (samples per second). |
| [`get_trigger_status`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_trigger_status "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_trigger_status") | `:OPERegister:CONDition?` bits: 0x20 = ARMED, 0x08 = AUTO (running); a stopped scope reports TRIGGERED. |
| [`get_vertical_offset`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_vertical_offset "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_vertical_offset") | Read back `channel`'s vertical offset (volts). |
| [`get_vertical_scale`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_vertical_scale "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.get_vertical_scale") | Read back `channel`'s vertical scale (V/div). |
| [`load_settings`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.load_settings "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.load_settings") | `:RECall:SETup` from scope memory, or send local bytes via `:SYSTem:SETup`. |
| [`measure`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.measure "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.measure") | Install then query a built-in measurement on `channel`. |
| [`open`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.open "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.open") | Open the underlying transport. |
| [`run`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.run "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.run") | Start continuous (free-running) acquisition. |
| [`save_screenshot`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.save_screenshot "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.save_screenshot") | `:SAVE:IMAGe` (as PNG) to the scope, or `:DISPlay:DATA? PNG,COLor` and write locally. |
| [`save_settings`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.save_settings "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.save_settings") | `:SAVE:SETup "<name>"` to the scope's file system (`.scp`), or `:SYSTem:SETup?` to the host. |
| [`set_acquisition_mode`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_acquisition_mode "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_acquisition_mode") | Set the acquisition mode. |
| [`set_average_count`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_average_count "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_average_count") | Set the number of waveforms to average. |
| [`set_channel_display`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_channel_display "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_channel_display") | Turn `channel` on or off. |
| [`set_coupling`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_coupling "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_coupling") | Set AC/DC input coupling on `channel`. |
| [`set_horizontal_scale`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_horizontal_scale "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_horizontal_scale") | Set the timebase to `seconds_per_div`. |
| [`set_probe_attenuation`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_probe_attenuation "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_probe_attenuation") | Set `channel`'s probe attenuation ratio (e.g. 1, 10, 100, 1000). |
| [`set_trigger_level`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_level "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_level") | `:TRIGger:EDGE:LEVel`; a `<source>` is only honored for the active trigger source, so the cached one is used. |
| [`set_trigger_mode`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_mode "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_mode") | Set the trigger sweep mode (AUTO / NORMAL). |
| [`set_trigger_slope`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_slope "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_slope") | Set the trigger edge slope (RISING / FALLING / EITHER). |
| [`set_trigger_source`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_source "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_source") | Set the trigger source to analog `channel`. |
| [`set_trigger_type`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_type "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_trigger_type") | Set the trigger type (EDGE, PULSE, …). |
| [`set_vertical_offset`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_vertical_offset "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_vertical_offset") | Set `channel`'s vertical offset to `offset` (volts). |
| [`set_vertical_scale`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_vertical_scale "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.set_vertical_scale") | Set `channel`'s vertical scale to `volts_per_div` (V/div). |
| [`setup_measurement`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.setup_measurement "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.setup_measurement") | Ensure a measurement slot exists for `measurement_type`/`channel` before the scope triggers. |
| [`single`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.single "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.single") | `:SINGle`. |
| [`stop`](https://dev.nominal.io/instro/ref/instruments/instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.md#instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.stop "instro.unstable.scope.drivers.keysight_3000tx.Keysight3000TX.stop") | Stop acquisition. |

### open() → None[source]

Open the underlying transport. Idempotent.

Concrete drivers also perform any one-shot instrument setup here
(e.g. `*CLS`, remote-mode handshake).

### close() → None[source]

Close the underlying transport. Idempotent.

### check_errors() → None[source]

Drain `:SYSTem:ERRor?` until it reports `0` and raise listing every non-zero entry.

### set_vertical_scale( volts_per_div: float, channel: int, ) → None[source]

Set `channel`’s vertical scale to `volts_per_div` (V/div).

Drivers may snap to the nearest hardware-supported step. Callers that
need the actual applied value should `get_vertical_scale()` afterward.

### get_vertical_scale(channel: int) → float[source]

Read back `channel`’s vertical scale (V/div).

### set_vertical_offset(offset: float, channel: int) → None[source]

Set `channel`’s vertical offset to `offset` (volts).

### get_vertical_offset(channel: int) → float[source]

Read back `channel`’s vertical offset (volts).

### set_coupling( coupling: Coupling, channel: int, ) → None[source]

Set AC/DC input coupling on `channel`.

### get_coupling( channel: int, ) → Coupling[source]

Read back input coupling on `channel`.

### set_probe_attenuation( factor: float, channel: int, ) → None[source]

Set `channel`’s probe attenuation ratio (e.g. 1, 10, 100, 1000).

### get_probe_attenuation(channel: int) → float[source]

Read back `channel`’s probe attenuation ratio.

### set_channel_display(enabled: bool, channel: int) → None[source]

Turn `channel` on or off. Waveform fetches and measurements need the channel displayed.

### get_channel_display(channel: int) → bool[source]

### set_horizontal_scale(seconds_per_div: float) → None[source]

Set the timebase to `seconds_per_div`. Applies globally to all channels.

### get_horizontal_scale() → float[source]

Read back the timebase (seconds/div).

### get_sample_rate() → float[source]

Read back the current sample rate (samples per second).

This is the effective hardware rate the scope is acquiring at; it
depends on the timebase, memory depth, and interpolation settings.

### set_acquisition_mode( mode: AcquisitionMode, ) → None[source]

Set the acquisition mode.

Drivers should raise `NotImplementedError` for `AcquisitionMode`
values their scope doesn’t support (e.g. Keysight 1200X has no
ENVELOPE mode).

### get_acquisition_mode() → AcquisitionMode[source]

Read back the current acquisition mode.

### set_average_count(count: int) → None[source]

Set the number of waveforms to average. Only takes effect in `AcquisitionMode.AVERAGE`.

### get_average_count() → int[source]

Read back the waveforms-to-average count.

### run() → None[source]

Start continuous (free-running) acquisition.

### stop() → None[source]

Stop acquisition. Leaves the captured data intact for `fetch_waveform` / `measure`.

### single() → None[source]

`:SINGle`. On the X-Series this also switches `:TRIGger:SWEep` to NORMal.

### digitize(timeout: float) → None[source]

`:DIGitize` the cached trigger source, then `*OPC?` under a scoped VISA timeout.

On any failure `clear()` aborts the pending op so the session stays usable;
only a VISA timeout is reported as `TimeoutError`, other errors propagate as-is.

### get_acquisition_state() → AcquisitionState[source]

`:OPERegister:CONDition?` bit 3 (0x08) — set = RUNNING, clear = STOPPED.

### fetch_waveform( channel: int, ) → WaveformData[source]

Fetch the waveform from `channel` over `WORD` (unsigned 16-bit, LSB-first), requesting 1000 points.

The scope returns as close to 1000 points as its settings allow (it may return
fewer, e.g. 992); the transfer is checked against the preamble’s point count.

### measure( measurement_type: ScopeMeasurementType, channel: int, ) → float[source]

Install then query a built-in measurement on `channel`.

The install form runs first as a guard — bad command syntax surfaces
via `check_errors()` before we’d block on the query. The vendor’s
invalid-measurement sentinel maps to `NaN`.

### set_trigger_source(channel: int) → None[source]

Set the trigger source to analog `channel`.

Drivers typically cache this value because the trigger-level SCPI on
some scopes requires the source channel in the same command.

### set_trigger_type( trigger_type: TriggerType, ) → None[source]

Set the trigger type (EDGE, PULSE, …).

### set_trigger_level(level: float) → None[source]

`:TRIGger:EDGE:LEVel`; a `<source>` is only honored for the active trigger source, so the cached one is used.

### set_trigger_slope( slope: TriggerSlope, ) → None[source]

Set the trigger edge slope (RISING / FALLING / EITHER).

### set_trigger_mode( mode: TriggerMode, ) → None[source]

Set the trigger sweep mode (AUTO / NORMAL).

AUTO forces an acquisition if no trigger fires within the timeout;
NORMAL waits indefinitely for a real trigger.

### force_trigger() → None[source]

Force a trigger event immediately, regardless of the configured conditions.

### get_trigger_status() → TriggerStatus[source]

`:OPERegister:CONDition?` bits: 0x20 = ARMED, 0x08 = AUTO (running); a stopped scope reports TRIGGERED.

### save_screenshot( filepath: str, to_instrument: bool = False, ) → bytes[source]

`:SAVE:IMAGe` (as PNG) to the scope, or `:DISPlay:DATA? PNG,COLor` and write locally.

### save_settings( name: str, to_instrument: bool = False, ) → bytes[source]

`:SAVE:SETup "<name>"` to the scope’s file system (`.scp`), or `:SYSTem:SETup?` to the host.

### load_settings( name: str, from_instrument: bool = False, ) → None[source]

`:RECall:SETup` from scope memory, or send local bytes via `:SYSTem:SETup`.

The recalled setup may select a different trigger source, so the cached
one is dropped; call `set_trigger_source` again before `set_trigger_level`.

### setup_measurement( measurement_type: ScopeMeasurementType, channel: int, ) → None

Ensure a measurement slot exists for `measurement_type`/`channel` before the scope triggers.

Required for instruments (e.g. Tektronix) that compute measurements
during acquisition — the slot must be present at trigger time or the
first `measure()` returns stale/invalid data. Default is a no-op for
instruments (e.g. Keysight 1200X) that compute on demand.
