> ## Documentation Index
> Fetch the complete documentation index at: https://docs.embedder.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SCPI oscilloscopes

> Capture analog waveforms over LAN from supported Rigol, Siglent, Tektronix, Keysight, Rohde & Schwarz, Teledyne LeCroy, and GW Instek bench scopes.

Embedder drives supported bench oscilloscopes over SCPI through one shared workflow. Captures appear in the Monitor's **Oscilloscope** tab, and hardware scripts use the `scope_*` helpers. For Siglent model details and SDS800X HD advanced triggers, see [Siglent oscilloscopes](/debug-mode/siglent).

## Check the model

Embedder identifies the exact model from the scope's `*IDN?` response. It rejects unknown models before writing any settings, even when the name looks similar to a supported one.

| Vendor | Families |
| - | - |
| Rigol | DS1000Z (including DS1202Z-E and Z Plus/Z-S Plus), DHO800, DHO900, DHO1000 |
| Siglent | SDS800X HD, SDS1000X-E, SDS2000X Plus, SDS1000X HD, SDS2000X HD |
| Tektronix | 2, 3, 4, 5, and 6 Series, MDO3000, MDO4000/B/C, TBS1000/B/EDU/C, TBS2000/B |
| Keysight / Agilent | InfiniiVision 1000X, 1200X, 2000X, 3000X A, 3000T X, 4000X A, HD3 |
| Rohde & Schwarz | MXO 4, MXO 5, RTB2000, RTM3000, RTO1000, RTO2000, RTO6, RTP |
| Teledyne LeCroy | WaveSurfer 3000z and 4000HD, WaveRunner 8000, 8000HD, and 9000 |
| GW Instek | MDO-2204EX |

Every listed family supports analog voltage channels, channel and timebase setup, edge triggers, single acquisitions, screenshots, and saved waveforms. Digital pods, segmented or sequence acquisition, built-in generators, and protocol decoding are not supported. Embedder rejects an acquisition layout it can't interpret as a voltage trace instead of publishing it.

Family support is verified against protocol simulators. Check a capture against a known signal the first time you use a particular model and firmware.

## Connect

Put the scope on a network reachable from the Embedder host. Embedder discovers LXI scopes over mDNS, and you can also enter an address directly. Check signal limits, grounding, and probe attenuation before connecting the inputs.

1. In the Monitor, select **+** and select the scope under **On the bench**.
2. If the scope isn't listed, type its address in the search field, such as `192.168.1.20` or `192.168.1.20:5025`, and select the **Connect to** result for that address. Without a port, Embedder tries port 5025, then 4000. On a Tektronix scope, turn on **Utility › I/O › Socket Server** with protocol **None**, or let discovery find the scope.
3. Select **Set up & connect** for a new scope. Selecting it approves setup. Embedder installs only the packages that model needs and shows progress in the device bar.

See [Connect a bench instrument](/debug-mode/overview#connect-a-bench-instrument) for device states and for renaming or forgetting a device.

## Capture in the Monitor

In the **Oscilloscope** tab, open the setup panel, shown as the settings summary beside the **Device** list. Set channels (V/div, offset, coupling, probe), the horizontal timebase, and the trigger. Setup reflects the scope's front panel. Then choose a capture mode:

* **Single:** arm once and capture the next trigger.
* **Run:** capture repeatedly until you select **Stop**.
* **Auto:** let the scope find the signal.

Setup is locked while capturing. Measurements below the chart show Vpp, Vmax, Vmin, mean, RMS, frequency, period, and rise time for each channel. Drag across the chart to zoom. Captures are saved to history and reopen without the instrument connected.

To capture with Embedder, name the channels, coupling, scale, timebase, trigger, and timeout:

```text theme={"system"}
Capture C1 at 500 mV/div with DC coupling and 1 ms/div. Trigger on C1 rising
through 100 mV, wait up to 10 seconds, and report Vpp and frequency.
```

Every family supports edge triggers. Embedder rejects other trigger types before writing them to the scope; only the SDS800X HD adds [advanced Siglent triggers](/debug-mode/siglent#choose-a-trigger).

Saved captures keep up to one million samples per channel. Larger acquisitions are decimated for display and storage, and the capture metadata keeps the full sample count and rate. For a front-panel image, ask for a screenshot.

## Connect from a hardware script

In a [hardware script](/debug-mode/hardware-scripts), `scope_connect()` with no arguments connects to the scope selected in the Monitor's **Oscilloscope** tab. Without a Monitor selection, pass a VISA resource or a literal host and port:

```python theme={"system"}
scope_connect(resource="TCPIP::192.168.1.20::inst0::INSTR")
# Alternatives:
# scope_connect()                                  # device selected in the Monitor
# scope_connect(host="192.168.1.20", port=5025)    # raw SCPI socket
# scope_connect(resource="VICP::192.168.1.20::INSTR")  # LeCroy VICP
scope_set_channel(1, scale=0.5, coupling="DC")
scope_set_timebase(scale=0.001)
scope_set_trigger(source="C1", level=0.1, edge="rising")
data = scope_capture_waveform(channels=[1], timeout_s=10)
scope_publish_capture(name="C1 capture")
scope_disconnect()
```

A `host` without a port selects VXI-11. An explicit port selects a raw SCPI socket. If discovery is blocked, set `EMBEDDER_SCOPE_HOST` (and `EMBEDDER_SCOPE_PORT` for a raw socket) before launching Embedder. USB VISA resources are accepted. They require platform drivers or device permissions and haven't been verified on physical hardware.

`scope_read_settings()` returns the scope's current channel, timebase, and trigger settings. `scope_apply_settings()` applies a subset of those settings and reports values the scope didn't accept. `scope_autoset()` runs the scope's autoset. For instrument functions outside the standard controls, use `scope_query()` and `scope_write()` and read back the result.

## Troubleshoot

* **No scope:** check the IP address and network, then select **Rescan** or type its address in the **Connect** tab. On a Tektronix scope, turn on the socket server.
* **Model rejected:** confirm the exact model against the table above.
* **Trigger rejected:** use an edge trigger on models other than the SDS800X HD.
* **Trigger timeout:** verify the enabled source, level, polarity, and expected event.
* **Clipped signal:** increase the voltage range or adjust the offset.
* **Read error:** Embedder closes the connection after an interrupted or malformed transfer. Reconnect before retrying.

See [Oscilloscope](/debug-mode/oscilloscope) to compare other scopes, or use a [spectrum analyzer](/debug-mode/spectrum-analyzer) for frequency-domain measurements.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.