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_multichannelundpm_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:
independentJede Kanalabfrage führt eine eigene Messung aus. Dies ist der Standard, wenn die Option fehlt.
synchronizedEin 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.