SiglentSDS1000XE#

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

Bases: ScopeDriverBase

SCPI driver for Siglent SDS1000X-E series oscilloscopes (SDS1104X-E and family).

Methods

check_errors

Poll CMR? then EXR? and raise on the first non-zero code (no error queue on Siglent).

close

Close the underlying transport.

digitize

Arm a single acquisition then poll INR? bit 0 (new signal acquired) until set or timeout.

fetch_waveform

Fetch the full waveform from channel over C{n}:WF? DAT2 (signed 8-bit codes).

force_trigger

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

get_acquisition_mode

Read back the current acquisition mode.

get_acquisition_state

Read back the acquisition run state (RUNNING / STOPPED).

get_average_count

Read back the waveforms-to-average count.

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

Read back the trigger status (ARMED / READY / 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 a panel setup from a USB file (RCPN) or push host bytes back (PNSU).

measure

Query a built-in parameter via C{n}:PAVA?; unavailable/sentinel results map to NaN.

open

Open the transport and disable comm headers so query replies are bare values.

run

Start continuous (free-running) acquisition.

save_screenshot

Transfer a screen dump (SCDP, a raw BMP) to the host and write it to filepath.

save_settings

Save the panel setup to a USB file (STPN) or transfer it to the host (PNSU?).

set_acquisition_mode

Set the acquisition mode.

set_average_count

Set the number of waveforms to average.

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

Set the trigger threshold to level (volts).

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

Arm a single-shot acquisition.

stop

Stop acquisition.

open() → None[source]#

Open the transport and disable comm headers so query replies are bare values.

close() → None[source]#

Close the underlying transport. Idempotent.

check_errors() → None[source]#

Poll CMR? then EXR? and raise on the first non-zero code (no error queue on Siglent).

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_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]#

Arm a single-shot acquisition.

Non-blocking — use get_acquisition_state to poll for STOPPED, or prefer digitize() which combines arming and waiting.

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

Arm a single acquisition then poll INR? bit 0 (new signal acquired) until set or timeout.

get_acquisition_state() → AcquisitionState[source]#

Read back the acquisition run state (RUNNING / STOPPED).

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

Fetch the full waveform from channel over C{n}:WF? DAT2 (signed 8-bit codes).

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

Query a built-in parameter via C{n}:PAVA?; unavailable/sentinel results map 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]#

Set the trigger threshold to level (volts). Applies to the configured trigger source.

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]#

Read back the trigger status (ARMED / READY / TRIGGERED / …).

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

Transfer a screen dump (SCDP, a raw BMP) to the host and write it to filepath.

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

Save the panel setup to a USB file (STPN) or transfer it to the host (PNSU?).

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

Recall a panel setup from a USB file (RCPN) or push host bytes back (PNSU).

The host-side PNSU write-back is known to wedge the USBTMC interface on some SDS1000X-E firmware; prefer from_instrument=True (USB stick) over USB connections.

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.