Keysight3000TX#

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

Bases: ScopeDriverBase

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

Methods

check_errors

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

close

Close the underlying transport.

digitize

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

fetch_waveform

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

force_trigger

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

get_acquisition_mode

Read back the current acquisition mode.

get_acquisition_state

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

get_average_count

Read back the waveforms-to-average count.

get_channel_display

get_coupling

Read back input coupling on channel.

get_horizontal_scale

Read back the timebase (seconds/div).

get_probe_attenuation

Read back channel's probe attenuation ratio.

get_sample_rate

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

get_trigger_status

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

get_vertical_offset

Read back channel's vertical offset (volts).

get_vertical_scale

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

load_settings

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

measure

Install then query a built-in measurement on channel.

open

Open the underlying transport.

run

Start continuous (free-running) acquisition.

save_screenshot

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

save_settings

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

set_acquisition_mode

Set the acquisition mode.

set_average_count

Set the number of waveforms to average.

set_channel_display

Turn channel on or off.

set_coupling

Set AC/DC input coupling on channel.

set_horizontal_scale

Set the timebase to seconds_per_div.

set_probe_attenuation

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

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

Set the trigger sweep mode (AUTO / NORMAL).

set_trigger_slope

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

set_trigger_source

Set the trigger source to analog channel.

set_trigger_type

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

set_vertical_offset

Set channel's vertical offset to offset (volts).

set_vertical_scale

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

setup_measurement

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

single

:SINGle.

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.