.. index:: Mehrkanaltreiber, Kanalinstanz, gemeinsamer Controller 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 :mod:`mpylab.device.multichannel_common`. Quantity-Konvertierung für Leistungsmesser implementiert :mod:`mpylab.device.powermeter_multichannel_common`, während LUMILOOP-Protokoll und Waveform-Helfer in :mod:`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. .. index:: Messmodus; independent, Messmodus; synchronized 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: .. code-block:: ini [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``. .. code-block:: ini [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. .. code-block:: ini [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: .. code-block:: ini [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 :class:`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 :ref:`de-dot-fieldprobe-orientation`. 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. .. index:: Messdauer, Waveform-Mittelung, Typ-A-Unsicherheit 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: .. code-block:: console 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 :doc:`Treiberentwicklung `, :doc:`kuratierte Treiber-API <../../api/drivers>` und :doc:`vollständige API <../../api/full-reference>`.