Mehrkanal-Gerätetreiber

Einige Geräte stellen mehrere Messkanäle über eine gemeinsame physische Kommunikationsverbindung bereit. mpylab repräsentiert jeden logischen Kanal als normalen Graphknoten. Ein gemeinsamer Controller verwaltet Verbindung und geräteweiten Zustand. Dieses Muster verwenden:

  • pm_gt_8542c_multichannel und pm_rs_nrp_multichannel;

  • pm_lumiloop_lspm_multichannel;

  • prb_lumiloop_lsprobe_multichannel.

Die allgemeine Verwaltung von Lebenszyklus und Kanalinstanzen liegt in mpylab.device.multichannel_common. Quantity-Konvertierung für Leistungsmesser implementiert mpylab.device.powermeter_multichannel_common, während LUMILOOP-Protokoll und Waveform-Helfer in mpylab.device.lumiloop_multichannel_common liegen.

Gemeinsamer Controller und Kanalinstanzen

Jede Treiberinstanz repräsentiert als Kanalinstanz einen Abschnitt [Channel_N]. Kanalinstanzen desselben Geräts teilen Kommunikationsverbindung und Lock, geräteweite Frequenz- und Moduseinstellungen sowie eine Messgeneration. Erst Quit() der letzten Kanalinstanz schließt die Verbindung. Gemeinsame Einstellungen müssen übereinstimmen; Widersprüche werden abgelehnt.

Akquisitionsmodi

acquisition unter [Init_Value] kennt zwei Werte:

independent

Jede Kanalabfrage führt eine eigene Messung aus. Dies ist der Standard, wenn die Option fehlt.

synchronized

Ein gemeinsamer Gerätezyklus erzeugt einen Snapshot. Die Kanalinstanzen lesen unabhängig von der Aufrufreihenfolge aus derselben Generation. Ein neuer Trigger() oder erneutes Lesen fordert eine neue Generation an.

Synchronisiert bedeutet einen gemeinsamen Gerätezyklus. Eine exakt gleichzeitige Abtastung ist nur garantiert, wenn Gerät und Sensoren dies unterstützen. Nicht unterstützte Modi führen zu ValueError. Der GT 8542C unterstützt nur independent; beim R&S NRP gruppiert INIT:ALL die Kanäle.

GetDataNB(retrigger=...) akzeptiert boolesche Werte sowie ON/OFF, TRUE/FALSE, YES/NO und 1/0. Bis zum Messende liefern nicht blockierende Treiber (-1, None).

Gemeinsame INI-Struktur

Das physische Gerät wird einmal unter [Init_Value] konfiguriert. Jeder logische Kanal besitzt einen eigenen Abschnitt und Graphknoten:

[Init_Value]
nr_of_channels: 2
acquisition: synchronized

[Channel_1]
name: Forward
unit: dBm

[Channel_2]
name: Reflected
unit: dBm

Einige Treiber verwenden channels als gerätenahe Anzahloption. Im realen Betrieb ist die Hardwareerkennung maßgeblich und Abweichungen werden gemeldet. Im virtuellen Betrieb muss die Anzahl explizit angegeben werden.

Giga-tronics- und R&S-Leistungsmesser

Der Giga-tronics 8542C ist stets ein zweikanaliges independent-Gerät. Der R&S NRP unterstützt einen oder zwei konfigurierte Sensoren, prüft deren Verfügbarkeit und ordnet Berechnungsblöcke explizit Sensoren zu, beispielsweise CALC2 zu SENS2.

[Init_Value]
gpib: 22
nr_of_channels: 2
acquisition: synchronized
measurement_timeout: 60
poll_interval: 0.01

[Channel_1]
name: Forward
unit: dBm
swr1: 1.1
swr2: 1.1

LUMILOOP LSPM

meter_serial_number wählt einen LSPM am TCP-Server. Ein optionaler Versionszusatz macht die Auswahl eindeutig. Ohne Angabe wird der aktuell ausgewählte Leistungsmesser verwendet. Kommandos adressieren diesen und nicht den SCPI-Scope 0 für alle aufgelisteten Messgeräte.

[Init_Value]
visa: TCPIP::127.0.0.1::10001::SOCKET
channels: 2
meter_serial_number: 12345:2.0
acquisition: synchronized
measurement_duration: 0.1
minimum_samples: 2
ready_timeout: 60
trigger_timeout: 30

LUMILOOP LSProbe

Die Reihenfolge der Serverauflistung ist keine stabile Sondenidentität. Logische Kanäle werden über Seriennummer und bei Bedarf Version gebunden:

[Init_Value]
visa: TCPIP::127.0.0.1::10000::SOCKET
channels: 2
acquisition: synchronized
measurement_duration: 0.1

[Channel_1]
name: Probe1
unit: Voverm
probe_serial_number: 101
probe_version: 2.0

Sobald ein Kanal probe_serial_number enthält, müssen alle konfigurierten Sondenkanäle eine Seriennummer besitzen. Ergebnisse werden über die Identität und nicht über die Antwortreihenfolge zugeordnet.

Feldsonden-Schnittstelle

Alle konkreten Feldsondentreiber liefern bei erfolgreichem GetData() (status, [probe_x, probe_y, probe_z]). Die drei Komponenten sind scuq.quantities.Quantity in V/m und stehen immer in dieser Reihenfolge im Koordinatensystem der Sonde. Abbildung und Rotation in das Zellkoordinatensystem erfolgen bewusst erst in der Messklasse; siehe Feldsondenorientierung.

Vor der realen Messwertabfrage muss mit SetFreq() eine endliche positive Korrekturfrequenz gesetzt werden. Trigger() liefert einheitlich (status, 0). GetDataNB(retrigger=...) behält dieselbe Ergebnisstruktur und liest zuerst den aktuellen Wert, bevor es optional neu triggert. Treiber ohne echte asynchrone Geräteschnittstelle verwenden dabei den blockierenden GetData()-Rückfall. GetBatteryState() liefert (status, wert) mit einem relativen numerischen Wert oder None, wenn kein Batteriestatus verfügbar ist.

Zeitbasierte LUMILOOP-Messung

Eine positive measurement_duration aktiviert die Mittelung einer getriggerten Waveform. Die Samplezahl beträgt max(minimum_samples, ceil(measurement_duration * sample_rate)). Die effektive Sample-Rate wird von der Hardware gelesen; virtual_sample_rate gilt nur im virtuellen Betrieb. ready_timeout begrenzt die Modusbereitschaft und trigger_timeout den Abschluss der Waveform.

LSPM-Samples werden vor Mittelwert und Typ-A-Unsicherheit von dBm nach Watt umgerechnet. LSProbe-Komponenten werden in V/m gemittelt; ihre Typ-A-Unsicherheit wird mit der nicht reduzierbaren Sondenspezifikation kombiniert.

Tests und Diagnose

Alle konkreten Module besitzen einen virtuellen Smoke-Test:

python -m mpylab.device.pm_gt_8542c_multichannel
python -m mpylab.device.pm_rs_nrp_multichannel
python -m mpylab.device.pm_lumiloop_lspm_multichannel
python -m mpylab.device.prb_lumiloop_lsprobe_multichannel

Leistungsmesser-INIs können außerdem mit python -m mpylab.device.powermeter_ui pfad/zum/powermeter.ini geöffnet werden. Vor dem Einsatz sind Kanalreihenfolge, nicht blockierendes Polling, Timeouts, Hardwareidentitäten, widersprüchliche Konfigurationen der Kanalinstanzen und das Schließen nach dem letzten Quit() zu testen.

Siehe Treiberentwicklung, kuratierte Treiber-API und vollständige API.