sn9000 support
This commit is contained in:
@@ -9,6 +9,7 @@ Available models:
|
||||
librevna
|
||||
librevna_multi
|
||||
compact_m_k209
|
||||
sn9000
|
||||
kamil_adc
|
||||
```
|
||||
|
||||
@@ -48,7 +49,8 @@ The GUI process supervisor starts the correct producer automatically:
|
||||
|
||||
- `librevna` -> `build/bin/sweep_orchestrator`
|
||||
- `compact_m_k209` -> `build/bin/sweep_orchestrator`
|
||||
- `librevna_multi` -> `python_app.scripts.multi_device_raw_producer`
|
||||
- `librevna_multi` -> `python_app.scripts.matrix_raw_producer`
|
||||
- `sn9000` -> `python_app.scripts.matrix_raw_producer`
|
||||
- `kamil_adc` -> `python_app.scripts.kamil_adc_raw_producer`
|
||||
|
||||
## Pure Simulator
|
||||
@@ -140,7 +142,7 @@ Notes:
|
||||
run:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m python_app.scripts.multi_device_raw_producer \
|
||||
.venv/bin/python -m python_app.scripts.matrix_raw_producer \
|
||||
--config run_config_librevna_multi.example.json
|
||||
```
|
||||
|
||||
|
||||
+18
-6
@@ -42,11 +42,11 @@ Fields:
|
||||
|
||||
| Field | Meaning |
|
||||
| --- | --- |
|
||||
| `model` | `librevna`, `librevna_multi`, `compact_m_k209`, or `kamil_adc`. |
|
||||
| `serial` | LibreVNA serial. Empty means first device for single LibreVNA. For `librevna_multi`, this is the master serial. |
|
||||
| `remote_host` | K209 remote server host. Used by `compact_m_k209`; ignored by LibreVNA modes. |
|
||||
| `remote_port` | K209 remote server TCP port. Default is `50209`. |
|
||||
| `driver_mode` | `native` for hardware, `mock` for supported synthetic LibreVNA modes. K209 and Kamil ADC require `native`. |
|
||||
| `model` | `librevna`, `librevna_multi`, `compact_m_k209`, `sn9000`, or `kamil_adc`. |
|
||||
| `serial` | LibreVNA serial. Empty means first device for single LibreVNA. For `librevna_multi`, this is the master serial. Unused by `compact_m_k209` and `sn9000`. |
|
||||
| `remote_host` | SCPI server host. For `compact_m_k209` it is the K209 relay server host; for `sn9000` it is the SNVNA HiSLIP host. Ignored by LibreVNA modes. |
|
||||
| `remote_port` | SCPI server TCP port. Default `50209` for `compact_m_k209` (relay), `4880` for `sn9000` (SNVNA HiSLIP). |
|
||||
| `driver_mode` | `native` for hardware, `mock` for supported synthetic LibreVNA modes. K209, SN9000, and Kamil ADC require `native`. |
|
||||
| `mock_signal_hz` | Existing LibreVNA mock signal parameter used by C++ mock acquisition. |
|
||||
| `multi_device` | Extra settings for `librevna_multi`. |
|
||||
| `kamil_adc` | External collector process and TTY settings for `kamil_adc`. |
|
||||
@@ -266,7 +266,8 @@ Fields:
|
||||
{"input": 2, "output": 1}
|
||||
```
|
||||
|
||||
For `librevna_multi`, the model constraints force the canonical virtual matrix:
|
||||
For `librevna_multi` and `sn9000`, the model constraints force the canonical
|
||||
virtual matrix:
|
||||
|
||||
```text
|
||||
input: 0..3
|
||||
@@ -410,6 +411,17 @@ Compact-M K209 via remote server:
|
||||
}
|
||||
```
|
||||
|
||||
SN9000 (PLANAR Иридиум) via SNVNA HiSLIP:
|
||||
|
||||
```json
|
||||
"radar": {
|
||||
"model": "sn9000",
|
||||
"remote_host": "192.168.1.10",
|
||||
"remote_port": 4880,
|
||||
"driver_mode": "native"
|
||||
}
|
||||
```
|
||||
|
||||
Kamil ADC:
|
||||
|
||||
```json
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
# SN9000 (PLANAR SNVNA / Иридиум) Setup
|
||||
|
||||
This project controls the PLANAR SN9000 multi-port VNA through the SNVNA
|
||||
companion application running on an external PC. The production path is:
|
||||
|
||||
```text
|
||||
SN9000 --USB 2.0--> SNVNA host PC --HiSLIP/VISA--> radar_system
|
||||
```
|
||||
|
||||
For complete run-mode instructions see
|
||||
[`docs/operation_modes.md`](operation_modes.md). For `run_config.json` field
|
||||
reference see [`docs/run_config.md`](run_config.md).
|
||||
|
||||
The SN9000 hardware has no built-in SCPI server; the SNVNA application on the
|
||||
companion PC exposes the SCPI HiSLIP server (default port `4880`). This
|
||||
project uses HiSLIP only, with the same `pyvisa` + IVI VISA stack already
|
||||
required by K209 — there is no additional dependency.
|
||||
|
||||
For maximum throughput the driver:
|
||||
|
||||
- Uses HiSLIP, not raw TCP Socket.
|
||||
- Keeps one persistent VISA session.
|
||||
- Sends `FORM:DATA REAL32` and `FORM:BORD SWAP` (little-endian) once.
|
||||
- Pre-configures 10 traces covering all S-parameters of the 2×4 matrix so
|
||||
one trigger drives both stimulus ports.
|
||||
- Sends the entire acquisition as one synchronized SCPI message:
|
||||
`TRIG:SING;*OPC?;:SENS:DATA:CORR? S11;:SENS:DATA:CORR? S31;…;:SENS:DATA:CORR? S62`.
|
||||
The K209 setup notes the same constraint: splitting `TRIG:SING` from the
|
||||
data queries can return `-211,"Trigger system is not in the trigger wait state"`.
|
||||
|
||||
Topology (manual p. 1457):
|
||||
|
||||
| Trace | Output position | Stimulus port | Input position | Receiver port |
|
||||
|-------|-----------------|---------------|----------------|----------------|
|
||||
| S11 | 0 | 1 | (reflection) | 1 |
|
||||
| S31 | 0 | 1 | 0 | 3 |
|
||||
| S41 | 0 | 1 | 1 | 4 |
|
||||
| S51 | 0 | 1 | 2 | 5 |
|
||||
| S61 | 0 | 1 | 3 | 6 |
|
||||
| S22 | 1 | 2 | (reflection) | 2 |
|
||||
| S32 | 1 | 2 | 0 | 3 |
|
||||
| S42 | 1 | 2 | 1 | 4 |
|
||||
| S52 | 1 | 2 | 2 | 5 |
|
||||
| S62 | 1 | 2 | 3 | 6 |
|
||||
|
||||
## Required Components
|
||||
|
||||
Install these on the machine that runs the SN9000 smoke test or acquisition
|
||||
process:
|
||||
|
||||
1. SNVNA companion application from Planar.
|
||||
- The SN9000 hardware is connected to this host over USB 2.0.
|
||||
|
||||
2. IVI VISA runtime and development files.
|
||||
- Must support TCPIP HiSLIP resources.
|
||||
- Suitable implementations include NI-VISA or Keysight IO Libraries Suite.
|
||||
- If K209 already works on this host, no additional install is needed.
|
||||
|
||||
3. Project Python environment.
|
||||
- Use the repository virtual environment, not system Python.
|
||||
- Install `requirements.txt` into `.venv`.
|
||||
|
||||
## SNVNA HiSLIP Server
|
||||
|
||||
Start SNVNA with the SN9000 connected over USB 2.0. Enable HiSLIP server on
|
||||
port `4880`. From the SNVNA UI:
|
||||
|
||||
```text
|
||||
System -> Settings -> Remote control network settings -> HiSLIP server -> On
|
||||
System -> Settings -> Remote control network settings -> HiSLIP port -> 4880
|
||||
```
|
||||
|
||||
Verify that the server is listening:
|
||||
|
||||
```bash
|
||||
ss -ltnp | grep 4880
|
||||
```
|
||||
|
||||
If SNVNA runs on a different machine from `radar_system`, set
|
||||
`radar.remote_host` to that machine's IP address.
|
||||
|
||||
The VISA resource string the driver assembles is:
|
||||
|
||||
```text
|
||||
TCPIP0::<radar.remote_host>::hislip0,<radar.remote_port>::INSTR
|
||||
```
|
||||
|
||||
## `run_config.json`
|
||||
|
||||
```json
|
||||
"radar": {
|
||||
"model": "sn9000",
|
||||
"remote_host": "127.0.0.1",
|
||||
"remote_port": 4880,
|
||||
"driver_mode": "native"
|
||||
}
|
||||
```
|
||||
|
||||
The 2×4 virtual switch matrix is enforced automatically; do not edit
|
||||
`switches.port1` / `switches.port2` or `run.combos` for SN9000 mode — the
|
||||
config codec rewrites them on load.
|
||||
|
||||
## Python Smoke Test
|
||||
|
||||
Use the project virtual environment:
|
||||
|
||||
```bash
|
||||
.venv/Scripts/python.exe -m python_app.scripts.sn9000_smoke_test ^
|
||||
--host 127.0.0.1 --port 4880 ^
|
||||
--start-hz 1000000 --stop-hz 3000000000 ^
|
||||
--points 201 --ifbw-hz 10000 --power-dbm -10 ^
|
||||
--no-preset
|
||||
```
|
||||
|
||||
Expected result:
|
||||
|
||||
```text
|
||||
SN9000 IDN: Planar, SN9000-N, ...
|
||||
SN9000 collection OK: traces=8, points=201, first_hz=..., last_hz=..., mean_abs_s21=...
|
||||
```
|
||||
|
||||
Use `--no-preset` for the first smoke test to avoid resetting the current
|
||||
SNVNA session. Remove it when testing the full driver setup path.
|
||||
|
||||
## SN9000 Limits
|
||||
|
||||
The SNVNA SCPI surface exposes service capability queries identical to K209:
|
||||
|
||||
```text
|
||||
SERV:SWE:FREQ:MAX? Upper frequency bound in Hz.
|
||||
SERV:SWE:FREQ:MIN? Lower frequency bound in Hz.
|
||||
SERV:SWE:POIN? Maximum sweep point count.
|
||||
SERV:SWE:POW:MAX? Upper power bound in dBm.
|
||||
SERV:SWE:POW:MIN? Lower power bound in dBm.
|
||||
```
|
||||
|
||||
The base SN9000 model covers `0.3 MHz .. 9 GHz`; power range is
|
||||
`-45 .. +10 dBm` up to 6 GHz, and `-45 .. +2 dBm` from 6 GHz to 9 GHz
|
||||
(manual p. 58). IF bandwidth selectable in the 1, 1.5, 2, 3, 5, 7 sequence
|
||||
across decades from `1 Hz` to `300 kHz` (manual p. 58, 1261).
|
||||
Reference in New Issue
Block a user