# SCPI instruments

> Labormessgeräte, die SCPI sprechen, etwa Multimeter, Netzgeräte, elektronische Lasten und Datenerfassungsgeräte, über TCP, eine serielle Leitung oder USB und GPIB über VISA: wie jedes erreicht wird, die Karte Messgerät, Abfragen und Schreibbefehle, die Suche und zwei durchgerechnete Beispiele.

Der Treiber **SCPI instruments** liest und schreibt Labormessgeräte, die SCPI sprechen, die
Befehlssprache der Prüfgeräte nach IEEE 488.2: Multimeter, Netzgeräte, elektronische Lasten,
Datenerfassungsgeräte wie das Fluke 1586A Super-DAQ, Kalibratoren, von Keysight, Rigol, Tektronix,
Siglent, GW Instek, B&K Precision, Fluke und den anderen. Jedes Tag stellt dem Messgerät eine
Abfrage, etwa `MEAS:VOLT:DC?` oder `READ?`, und liest seine Antwort; ein Tag, das geschrieben wird,
sendet einen Befehl mit dem Wert darin, etwa `VOLT 5`. Es ist der Austausch, den ein
LabVIEW-Programm über VISA führt, auf einem Panel eingerichtet statt in einem Blockdiagramm
verdrahtet, und die Werte landen dort, wo die jedes anderen Tags landen: in der Logik, auf
Dashboards, in den Läufen eines Prüfstands im [Process](process).

Ein Messgerät wird auf einem von drei Wegen erreicht, der beim Anlegen seines Geräts gewählt wird:

| Übertragungsweg | Wie das Messgerät erreicht wird | Für |
| --- | --- | --- |
| **TCP (LXI-Socket)** | Der SCPI-Socket des Messgeräts an dessen Host und Port, 5025 bei den meisten LXI-Messgeräten. Auf diesem Rechner wird nichts installiert. | Ein Messgerät mit LAN-Anschluss. |
| **VISA (USB, GPIB, Netzwerk)** | Über das auf diesem Rechner installierte VISA, über den VISA-Ressourcennamen des Messgeräts. Das Produkt installiert kein VISA: Es verwendet NI-VISA oder die Keysight IO Libraries Suite, wo eines davon installiert ist. | Ein Messgerät an USB oder an einer GPIB-Schnittstelle, oder ein Netzwerkmessgerät, das VISA über seinen eigenen Namen erreicht. |
| Auf einer seriellen Leitung | Eine serielle Leitung dieses Treibers, geteilt mit den anderen Messgeräten darauf, eine Anfrage nach der anderen. | Ein Messgerät mit RS-232- oder RS-485-Anschluss. |

Ein Messgerät auf einer seriellen Leitung hängt unter seiner Leitung, dieser Teil des Baums liest
sich also **Treiber → Leitung → Gerät → Tag**, wie unter
[Generic serial and TCP](driver-generic-serial-tcp). Ein Messgerät, das über TCP oder VISA erreicht
wird, liegt unter dem Treiber und kann wie das Gerät jedes anderen Treibers in Ordnern abgelegt
werden, **Treiber → Ordner → Gerät → Tag**. Ein Gerät bleibt auf der Seite, auf der es angelegt
wurde: TCP und VISA lassen sich wechseln, aber ein Gerät wechselt nie zwischen einer Leitung und dem
Netzwerk.

## Die Seite des Treibers {#the-drivers-page}

Die Zeile unter der Kopfzeile lautet "Serielle Leitungen tragen die Messgeräte, die sich einen Bus teilen, und die Messgeräte, die über TCP oder VISA erreicht werden, liegen direkt unter dem Treiber. Legen Sie eine Leitung oder ein Gerät an und öffnen Sie es dann, um seine Abfragen anzugeben."
und die Seite trägt untereinander:

| Teil | Was er enthält |
| --- | --- |
| **Serielle Leitungen** | Die Leitungen des Treibers, die mit **Leitung hinzufügen** rechts neben ihrem Titel wachsen: **Leitung**, **Schnittstellenparameter** (Port · Baudrate · Format, ohne Zeitlimit, da eine Leitung dieses Treibers keines hat), **Geräte**, **Zustand** und die Aktionen Öffnen, Aktivieren, Deaktivieren und Löschen. Leer zeigt sie "Noch keine seriellen Leitungen." |
| **Suchbereich** | Die Adresse, die Geräte suchen neben den Messgeräten fragt, die VISA auflistet; siehe [Gerätesuche](#discovery). Nur mit Connector konfigurieren gezeichnet. |
| **Geräte** | Jedes Gerät des Treibers, die auf einer Leitung eingeschlossen, mit den Spalten der [Gerätetabelle](connector-drivers#the-device-table) jedes Treibers, die mit **Gerät hinzufügen** rechts neben ihrem Titel wächst, das ein TCP-Gerät anlegt. Leer zeigt sie "Noch keine Geräte." |

Die Kopfzeile zählt die Geräte in Klammern, und die Zeile des Treibers im Baum zählt beide Ebenen,
sobald eine Leitung existiert ("1 Leitung · 2 Geräte"). Die Leiste des Treibers trägt
**Geräte suchen**. Der Rechtsklick auf die Zeile des Treibers bietet **Gerät hinzufügen**, **Leitung hinzufügen**, **Neuer Ordner**, **Aktualisieren** und
**Geräte suchen**, dann, nach einem Trenner, **Treiber entfernen**; im Menü Neu… der Spalte bietet der Eintrag des Treibers **Neues Gerät**,
**Neue serielle Leitung** und **Neuer Ordner**, dann seine Leitungen, Ordner und Geräte. Einmal hinzugefügt, steht der
Treiber im Baum unter dem Ordner Treiber, mit oder ohne Leitung oder Gerät.

## Serielle Leitung {#serial-line}

Eine Leitung dieses Treibers ist die unter [Serielle Leitungen](connector-lines) beschriebene
Leitung, mit den Feldern einer Leitung des Treibers
[Generic serial and TCP](driver-generic-serial-tcp#serial-line). Ihre Seite sagt "Ein physischer serieller Bus: die Porteinstellungen, die seine Instrumente teilen, eine Anfrage nach der anderen."
und ihre Karte Physische Leitung enthält **Bezeichnung**, **Serieller Port** (mit **Aktualisieren**),
**Baudrate** und **Serielles Format**, alle zehn Formate angeboten, sechs mit 8 Bit und vier mit 7 Bit. Sie
hat keinen Übertragungsmodus, kein Zeitlimit für die Antwort, keinen Mindestabstand zwischen
Transaktionen und keine Karte Einheiten suchen: Jedes Messgerät sagt auf seiner eigenen Karte
Messgerät, was seine Nachrichten beendet und wie lange es auf eine Antwort wartet, und ein
Messgerät wird an dem unterschieden, was es gefragt wird, nicht an einer Adresse, deshalb hat die
Tabelle Geräte der Leitung keine Spalte Unit-ID.

Eine hier angelegte Leitung startet deaktiviert, damit die Porteinstellungen eingegeben werden,
bevor sich der Port öffnet; Port, Baudrate und Format ändern sich nur, solange die Leitung
deaktiviert ist. **Gerät hinzufügen** auf der Leitung oder in ihrem Kontextmenü legt ein Gerät
dieses Treibers auf dieser Leitung an. Eine Leitung gehört dauerhaft zu dem Treiber, unter dem sie
angelegt wurde: Kein Gerät eines anderen Treibers kommt auf sie, und ein Port gehört zu einer
Leitung, gleich welchem Treiber die Leitung gehört.

Der Treiber öffnet den Port einmal für alle Messgeräte der Leitung und sendet eine Anfrage nach der
anderen, wobei er auf ihre Antwort wartet, bevor er die nächste sendet. Er hält DTR eingeschaltet,
solange der Port offen ist, denn ein Messgerät, das seine Ausgabe über DTR und DSR taktet, etwa das
Keysight 34401A oder ein Netzgerät E36xx, sendet nichts, solange DTR aus ist. Ein Port, der ausfällt,
wird nach einer Pause wieder geöffnet, die sich von 1 Sekunde bis 1 Minute verdoppelt, solange er
weiter ausfällt, und jedes Messgerät darauf wird neu eingerichtet, seine Einrichtungsbefehle erneut
gesendet, wie bei seiner ersten Verbindung.

## Gerät {#device}

### Verbindung {#connection}

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Übertragungsweg** | Ein unter dem Treiber angelegtes Gerät: **TCP (LXI-Socket)**, "Die Station verbindet sich mit dem SCPI-Socket des Messgeräts an dessen Host und Port, 5025 bei den meisten LXI-Messgeräten.", oder **VISA (USB, GPIB, Netzwerk)**, "Die Station öffnet das Messgerät über seinen VISA-Ressourcennamen, mit dem auf diesem Rechner installierten VISA." Beide lassen sich wechseln; ein Gerät auf einer Leitung zeigt stattdessen seine Leitung. | **TCP (LXI-Socket)** |
| **Hostadresse** | TCP: der Hostname oder die IP-Adresse des Messgeräts. | leer |
| **Port** | TCP: der Port, auf dem das Messgerät SCPI beantwortet, 1 bis 65535. Ein leeres Feld zeigt 5025 in Grau, und das Messgerät wird darauf angewählt. | 5025 |
| **VISA-Ressource** | VISA, statt Hostadresse und Port: "Der Name des Messgeräts, wie VISA ihn auflistet, etwa USB0::0x0957::0x1A07::MY12345678::INSTR oder GPIB0::22::INSTR. Geräte suchen trägt ihn ein." Es ist der Name, den NI MAX und Keysight Connection Expert für das Messgerät zeigen. | leer |
| **Serielle Leitung · fest** | Ein Gerät auf einer Leitung: der Name der Leitung über ihrem Port, ihrer Baudrate und ihrem Format, nur lesbar. | die Leitung, unter der es hinzugefügt wird |

Ein neues Gerät ist ein TCP-Gerät: Es zeigt "Hostadresse noch nicht eingetragen" und wird nicht
verbunden, solange es keine Hostadresse hat. Ein VISA-Gerät wählt keinen Host an und wartet nie auf
einen. Der Wechsel zu VISA behält Hostadresse und Port für die Rückkehr zu TCP, und der Wechsel zu
TCP behält die Ressource. Ein Gerät, mit dem der Treiber nicht arbeiten kann, wird nicht
gespeichert, und das Aktionsprotokoll sagt, warum:

| Sie geben ein | Das Aktionsprotokoll sagt |
| --- | --- |
| Einen Port außerhalb von 1 bis 65535 | "Geben Sie einen Port von 1 bis 65535 ein, oder lassen Sie das Feld für 5025 leer." |
| VISA ohne Ressource | "Geben Sie die VISA-Ressource des Messgeräts ein, etwa USB0::0x0957::0x1A07::MY12345678::INSTR, oder starten Sie Geräte suchen." |
| Eine Ressource mit einem Leerzeichen oder einem Zeichen außerhalb von einfachem ASCII | "Die VISA-Ressource enthält ein Leerzeichen oder ein Zeichen außerhalb von einfachem ASCII. Geben Sie sie so ein, wie VISA sie auflistet." |

Die Base URI, die die Kopfzeile zeigt, ist die Laufzeitadresse: `scpi://tcp/<host>:<port>`,
`scpi://visa/<resource>` oder `scpi://serial/<line id>/<port>/<baud>/<format>`, gefolgt vom
Endezeichen (`term`), dem Zeitlimit für die Antwort (`timeout`), der Schreibbestätigung (`check`)
und den Einrichtungsbefehlen (`setup`, einer nach dem anderen, getrennt durch `%0A`). Eine Kopie
eines Geräts auf einer Leitung bleibt auf dieser Leitung; eine Kopie eines TCP- oder VISA-Geräts
landet auf der Ebene des Treibers selbst.

### Die Karte Messgerät {#the-instrument-card}

Unter der Karte Verbindung sagt die Karte **Messgerät**, was das Messgerät ist und wie die Station
mit ihm spricht.

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Identität (\*IDN?)** | Nur lesbar: "Was das Messgerät auf \*IDN? geantwortet hat, als die Station sich verband: Hersteller, Modell, Seriennummer und Firmware." Es zeigt "Noch nicht beantwortet", bis das Messgerät antwortet, und wieder, sobald das Gerät nicht mehr verbunden ist. Ein Messgerät, das `*IDN?` nicht beantwortet, wird trotzdem gelesen, ohne Identität. | |
| **Endezeichen** | **LF (Zeilenvorschub)**, **CR LF (Wagenrücklauf, Zeilenvorschub)** oder **CR (Wagenrücklauf)**: "Beendet jeden gesendeten Befehl und jede gelesene Antwort. LF passt zu fast jedem Messgerät; manche seriellen verwenden CR LF oder CR." | **LF (Zeilenvorschub)** |
| **Zeitlimit für die Antwort (ms)** | 100 bis 60000: "Wie lange eine Abfrage auf ihre Antwort wartet und ein Schreibvorgang auf die Fehlerwarteschlange des Messgeräts. Eine langsame Messung braucht mehr." | 2000 |
| **Schreibbestätigung** | "SCPI bestätigt keinen Befehl, deshalb wird ein Schreibvorgang bestätigt, indem das Messgerät danach gefragt wird." Was jede Wahl sendet, steht unter [Schreiben](#writing): **Fehlerwarteschlange (SYST:ERR?)**, **Keine: bestätigt, sobald gesendet**, oder die Fehlerwarteschlange, sobald der Befehl fertig ist, **Abschluss, dann Fehlerwarteschlange (\*OPC?, SYST:ERR?)**. | **Fehlerwarteschlange (SYST:ERR?)** |
| **Einrichtungsbefehle** | Ein Befehl pro Zeile, höchstens 32 mit je höchstens 512 Zeichen: "Werden bei jeder Verbindung der Station gesendet, der Reihe nach, einer pro Zeile, etwa \*RST oder CONF:VOLT:DC 10. Fehler, die sie auslösen, stehen im Journal." | leer |

Jedes Mal, wenn die Station sich mit dem Messgerät verbindet, und jedes Mal, wenn eine serielle
Leitung ihren Port wieder öffnet, sendet sie der Reihe nach: `*CLS`, wenn die Schreibbestätigung die
Fehlerwarteschlange liest, die Einrichtungsbefehle, liest dann die Fehlerwarteschlange ins Journal
(ein Fehler, den ein Einrichtungsbefehl ausgelöst hat, steht dort und hält das Gerät nicht an) und
fragt `*IDN?`, dessen Antwort das Feld Identität zeigt. Ein Wert, den die Karte nicht annehmen kann,
wird nicht gespeichert, und das Aktionsprotokoll sagt, warum: "Das Zeitlimit für die Antwort muss zwischen 100 und 60000 ms liegen.",
"Ein Einrichtungsbefehl enthält ein Zeichen außerhalb von einfachem ASCII, etwa ein typografisches Anführungszeichen, das kein Messgerät liest."
oder "Senden Sie höchstens 32 Einrichtungsbefehle mit je höchstens 512 Zeichen." SCPI ist einfaches
ASCII, deshalb wird ein Befehl, der mit einem typografischen Anführungszeichen oder einem
geschützten Leerzeichen aus einem Handbuch kopiert wurde, dort abgelehnt, wo er eingegeben wird,
statt an ein Messgerät gesendet zu werden, das ihn nicht lesen kann.

### VISA auf diesem Rechner {#visa-on-this-computer}

Das Produkt bringt kein VISA mit und installiert keines. Ein VISA-Gerät öffnet sein Messgerät über
die 64-Bit-VISA-Bibliothek (`visa64.dll`), die schon auf diesem Rechner ist und die NI-VISA, das
LabVIEW installiert, und die Keysight IO Libraries Suite beide dort ablegen. Nur VISA-Geräte brauchen
sie: Ein Messgerät über TCP oder an einer seriellen Leitung verbindet sich ohne sie. Die Station prüft
selbst, ob sich die Bibliothek laden lässt, ohne auf ein Gerät zu warten: beim ersten Mal, wenn die
Seite des Treibers, die Seite eines VISA-Geräts oder der Agent fragt, und danach alle 30 Sekunden,
solange sie fehlt. Bis der Connector gestartet ist, ist nicht bekannt, ob VISA da ist, und es wird
nichts dazu gesagt. Solange es fehlt:

| Wo | Was dort steht |
| --- | --- |
| Die Seite eines VISA-Geräts | Ein Warnhinweis, "VISA ist auf diesem Rechner nicht installiert", mit den Schritten unten. Seine zwei Links öffnen die Seiten von NI und Keysight im Browser des Rechners. |
| Die Seite des Treibers | Derselbe Hinweis, solange der Treiber mindestens ein VISA-Gerät hat, mit dem Satz "Bis zur Installation bleiben die VISA-Geräte dieses Treibers getrennt und behalten ihre Konfiguration; die Geräte über TCP oder an einer seriellen Leitung sind nicht betroffen." Ein Treiber nur mit TCP- und seriellen Geräten zeigt keinen. |
| Der letzte Fehler eines VISA-Geräts | Dieselben Schritte, auf Englisch, wie die eigenen Ursachen des Treibers geschrieben sind. Das Gerät bleibt offline und behält seine Konfiguration. |
| Die Liste Übertragungsweg | Bietet VISA weiter an, damit ein Gerät vorbereitet werden kann, bevor VISA installiert ist. |
| Geräte suchen | Fragt nur den Host, der in der Karte Suchbereich eingegeben ist, und sagt es mit den zwei Seiten: "VISA ist auf diesem Rechner nicht installiert, deshalb listet der Suchlauf darüber kein USB-, GPIB- oder Netzwerk-Messgerät auf und fragt nur einen eingegebenen Host. Um sie aufzulisten, installieren Sie ein 64-Bit-VISA als Administrator", gefolgt von den Adressen von NI-VISA und der Keysight IO Libraries Suite. Der Satz bleibt in der Zeile, die den Suchlauf abschließt. |
| Der Agent | `driver_capabilities` gibt die Schritte unter `prerequisite` des Scpi-Treibers, mit `installed` false und `neededBy`, das die VISA-Geräte nennt; `device_discover` sagt dasselbe in `cut`. |

So wird es installiert:

1. Laden Sie NI-VISA von der NI-Seite [NI-VISA Download](https://www.ni.com/en/support/downloads/drivers/download.ni-visa.html) herunter, oder die Keysight IO Libraries Suite von der Keysight-Seite [IO Libraries Suite Downloads](https://www.keysight.com/us/en/lib/software-detail/computer-software/io-libraries-suite-downloads-2175637.html).
2. Beide funktionieren, und ein Rechner mit LabVIEW hat NI-VISA bereits. Die NI-Seite verlangt vor dem Download, dass Sie sich mit einem NI-Konto anmelden; die Keysight-Seite verlinkt das Installationsprogramm direkt. Nehmen Sie das neueste Windows-Installationsprogramm: Unter 64-Bit-Windows installieren beide das 64-Bit-VISA, das einzige, das Ganter Lab sieht.
3. Führen Sie das Installationsprogramm als Administrator aus einem Ordner auf Laufwerk C: aus (das von Keysight installiert nicht von einem anderen Laufwerk) und starten Sie den Rechner neu, wenn es danach fragt.

Ein VISA, das nur seine 32-Bit-Bibliothek (`visa32.dll`) installiert hat, etwa eines für 32-Bit-Windows,
wird nicht gesehen: Ganter Lab liest nur die 64-Bit-Bibliothek `visa64.dll`.

Spätestens 30 Sekunden nach der Installation verschwindet der Hinweis, und die VISA-Geräte verbinden
sich mit ihrer bestehenden Konfiguration, ohne dass Ganter Lab neu gestartet wird. Ein Messgerät mit
Netzwerkanschluss lässt sich auch ohne VISA über TCP erreichen.

## Adressierung des Tags {#tag-addressing}

Ein Tag dieses Treibers stellt seinem Messgerät eine Abfrage. Seine Karte **Quelle** enthält:

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Abfrage** | Was das Tag fragt, so wie das Programmierhandbuch des Messgeräts es schreibt: `MEAS:VOLT:DC?`, `READ?`, `SOUR:VOLT?`, `OUTP?`. Einfaches ASCII, höchstens 512 Zeichen. Ein Tag Nur schreiben fragt nichts und braucht keine. | erforderlich |
| **Wert in der Antwort** | Tags, die gelesen werden. "Leer liest die ganze Antwort. Eine Zahl liest diesen Wert einer kommagetrennten Antwort, ab 1 gezählt, etwa 3 für den dritten Kanal von READ?." Das Feld zeigt "Ganze Antwort", solange es leer ist. 1 bis 1000. | leer |
| **Schreibbefehl** | Tags, die geschrieben werden: "Was ein Schreibvorgang sendet, mit {value} an der Stelle des Werts, etwa VOLT {value} oder CURR {value:0.000}. Ein Boolean wird als 1 oder 0 gesendet. Bei einem Boolean-Tag wird ein Befehl ohne {value}, etwa \*TRG, beim Schreiben von true gesendet." | erforderlich |

Ein Feld, das der Zugriff des Tags nicht nutzt, wird nicht gezeichnet und behält seinen Wert für den
Fall, dass er wieder genutzt wird. Die Datentypen sind Boolean, Int32, Int64, Float, Double und
String, standardmäßig Float. Ein Tag, dessen Felder nicht funktionieren können, wird nicht
gespeichert, und die Seite des Tags sagt, was fehlt:

| Sie geben ein | Die Seite des Tags sagt |
| --- | --- |
| Keine Abfrage bei einem Tag, das gelesen wird | "Geben Sie die Abfrage ein, die dem Messgerät gestellt wird, etwa MEAS:VOLT:DC?, oder machen Sie das Tag zu Nur schreiben." |
| Eine Abfrage mit einem typografischen Anführungszeichen oder einem anderen Zeichen außerhalb von einfachem ASCII | "Die Abfrage enthält ein Zeichen außerhalb von einfachem ASCII, etwa ein typografisches Anführungszeichen, oder ist länger als 512 Zeichen." |
| Einen Wert in der Antwort über 1000 | "Der Wert in der Antwort wird von 1 bis 1000 gezählt. Lassen Sie das Feld leer, um die ganze Antwort zu lesen." |
| Keinen Schreibbefehl bei einem Tag, das geschrieben wird | "Geben Sie den Befehl ein, den ein Schreibvorgang sendet, etwa VOLT {value}, oder machen Sie das Tag zu Nur lesen." |
| Eine Klammer, die nicht `{value}` oder `{value:FORMAT}` ist, oder den Wert zweimal | "Der Schreibbefehl enthält ein Zeichen außerhalb von einfachem ASCII, eine Klammer, die nicht {value} oder {value:FORMAT} ist, oder den Wert zweimal." |
| Einen Befehl ohne `{value}` bei einem Tag, das kein Boolean ist | "Setzen Sie {value} an die Stelle des Werts im Schreibbefehl. Nur ein Boolean-Tag sendet ohne ihn einen Befehl." |
| Ein Format, das keine Zahl formatiert, oder ein Format bei einem Boolean- oder String-Tag | "Das Format nach value: muss eine Zahl formatieren, etwa 0.000 oder F2, und nur ein numerisches Tag nimmt eines." |

Die nur lesbare Zeile **Quelladresse (Bus)** zeigt, was der Treiber erhält: `ask=READ?` für ein Tag,
das die ganze Antwort liest, `ask=READ?&field=3` für ihren dritten Wert,
`ask=VOLT?&write=VOLT {value}` für ein Tag, das gelesen und geschrieben wird, und `write=*TRG` für ein
Tag Nur schreiben.

## Lesen {#reading}

Im Abfrageintervall des Tags sendet die Station die Abfrage und liest eine Antwort, bis zum
Endezeichen, innerhalb des Zeitlimits für die Antwort. Der entnommene Text, die ganze Antwort oder
der Wert, den das Tag benennt, wird als Typ des Tags gelesen, bevor die eigenen Stufen des Tags ihn
umrechnen, wie bei jedem Treiber (siehe [Die Wertepipeline](connector-value-pipeline)):

| Die Antwort enthält | Gelesen als |
| --- | --- |
| `+1.23456789E+00`, `-0.5`, `12` | Float oder Double: die Zahl, mit einem Punkt als Dezimaltrennzeichen, gleich in welcher Sprache die Station arbeitet. |
| `9.91E37` | Das Nicht-eine-Zahl von SCPI, was ein Messgerät antwortet, wenn es keinen Messwert hat: NaN bei einem Float- oder Double-Tag, wofür seine Stufe [Ungültiger Messwert](connector-value-pipeline#the-device-answered-without-a-number) einsteht; bei einem Int32- oder Int64-Tag abgelehnt. `9.9E37`, die Übersteuerung, bleibt diese Zahl. |
| `+1.20000000E+01` | Int32 oder Int64: 12. Ein Bruch wird abgelehnt. |
| `1`, `ON`, `0`, `OFF` | Boolean: wahr für 1 und ON, falsch für 0 und OFF; true, false, yes und no werden ebenfalls gelesen. |
| `"Ready, armed"` | String: die Zeichen ohne ihre Anführungszeichen, ein verdoppeltes Anführungszeichen einfach. Ein Komma innerhalb der Anführungszeichen trennt keine Werte. |

| Situation | Was das Lesen tut |
| --- | --- |
| Tags eines Geräts, die dieselbe Abfrage stellen | Sie teilen sich eine Antwort für die Hälfte des kürzesten Abfrageintervalls unter ihnen, sodass die Tags, die jeden Kanal eines mehrkanaligen `READ?` lesen, eine Messung kosten. Ein Schreibvorgang vergisst jede gehaltene Antwort. |
| Keine Antwort innerhalb des Zeitlimits für die Antwort | Ein fehlgeschlagener Lesevorgang. Wenn das Gerät die Fehlerwarteschlange liest, fragt die Station dann `SYST:ERR?`, sodass eine falsch geschriebene Abfrage mit dem eigenen Eintrag des Messgeräts scheitert, etwa `-113,"Undefined header"`, in ihrem Grund. Die Richtlinie des Tags für [ein Gerät, das nicht geantwortet hat](connector-value-pipeline#the-device-did-not-answer), entscheidet, was es zeigt. |
| Eine Antwort mit weniger Werten als die Nummer des Tags | Ein fehlgeschlagener Lesevorgang, der sagt, wie viele Werte die Antwort hat. |
| Ein Text, den der Typ des Tags nicht fassen kann | Ein fehlgeschlagener Lesevorgang, der den Text nennt. |

## Schreiben {#writing}

Ein Schreibvorgang läuft durch denselben Trichter wie der jedes anderen Treibers: Das Schreibfeld
nimmt den technischen Wert, und die Umrechnungsstufen werden umgekehrt, bevor der Rohwert gesendet
wird (siehe [Connector](connector)). Der Befehl ist der Schreibbefehl mit dem Wert an der Stelle von
`{value}`: eine Zahl in invarianter Kultur, der kürzeste Text, der als dieselbe Zahl zurückgelesen
wird, oder formatiert durch `{value:FORMAT}` mit einem .NET-Zahlenformat (`CURR {value:0.000}` sendet
1,5 als `CURR 1.500`); ein Boolean als `1` oder `0`, was jeder Boolean-Parameter von SCPI annimmt; ein
Text, wie er ist, wobei der Befehl die Anführungszeichen trägt, die er braucht (`DISP:TEXT "{value}"`).
Nicht-eine-Zahl und Unendlich werden abgelehnt, bevor etwas gesendet wird. Bei einem Boolean-Tag
wird ein Befehl ohne `{value}`, etwa `*TRG`, beim Schreiben von true gesendet, und das Schreiben von
false wird abgelehnt.

| Schreibbestätigung | Was gesendet wird | Was der Schreibvorgang meldet |
| --- | --- | --- |
| **Fehlerwarteschlange (SYST:ERR?)** | `*CLS`, der Befehl, `SYST:ERR?` | Erledigt, wenn die Warteschlange keinen Fehler meldet (`0` oder `+0,"No error"`). Jeder andere Eintrag lehnt den Schreibvorgang mit den Worten des Messgeräts ab, etwa `-222,"Data out of range"`. Keine Antwort ist keine Rückmeldung: Ob das Messgerät den Wert angenommen hat, ist nicht bekannt. |
| **Abschluss, dann Fehlerwarteschlange (\*OPC?, SYST:ERR?)** | `*CLS`, der Befehl, `*OPC?`, `SYST:ERR?` | Dasselbe, sobald das Messgerät den Befehl ausgeführt hat: für einen Ausgang, der sich einschwingt, oder ein Relais, das schaltet. |
| **Keine: bestätigt, sobald gesendet** | Nur der Befehl | Erledigt, sobald gesendet, für ein Messgerät ohne Fehlerwarteschlange. Eine unbeantwortete Abfrage wird dann ohne den Fehler des Messgeräts gemeldet. |

Schreibvorgänge warten mit den Lesevorgängen in der Warteschlange des Geräts: Auf einer Leitung
teilen sie die eine Anfrage nach der anderen der Leitung, über TCP und VISA die eigene Verbindung
des Geräts.

## Gerätesuche {#discovery}

Die Seite des Treibers trägt eine Karte **Suchbereich** mit einem optionalen Feld, "Adresse eines Messgeräts für eine TCP-Abfrage, z. B. 192.168.0.20 oder 192.168.0.20:5025 (leer = die Messgeräte, die VISA auflistet)".
Geräte suchen stellt dann zwei Fragen, eine nach der anderen:

| Frage | Wann | Was sie anbietet |
| --- | --- | --- |
| Jede Messgeräteressource, die VISA auflistet, an USB, GPIB oder im Netzwerk, der Reihe nach geöffnet und mit `*IDN?` gefragt. Die Fortschrittszeile nennt jede: "USB0::0x0957::0x1A07::MY12345678::INSTR wird nach seiner Identität gefragt…". | Wenn VISA auf diesem Rechner installiert ist. Ohne VISA sagt der Suchlauf es, mit der Angabe, woher VISA kommt, und der Satz bleibt in der Zeile, die den Suchlauf abschließt ([VISA auf diesem Rechner](#visa-on-this-computer)). | Jedes Messgerät, das antwortet, als VISA-Gerät mit eingetragener Ressource. |
| `*IDN?` über TCP an den Host im Feld, auf seinem Port oder auf 5025: "192.168.0.20:5025 wird nach seiner Identität gefragt…". | Nur wenn das Feld eine Adresse enthält. | Das Messgerät, als TCP-Gerät an diesem Host und Port. |

Jedes Messgerät hat 1,5 Sekunden zum Antworten, und eines, das nicht antwortet, wird nicht
angeboten. Ein Kandidat wird nach dem Hersteller und dem Modell benannt, die er geantwortet hat
(`Keysight Technologies 34461A`), trägt jeden Standard der Karte Messgerät und keine Tags, denn ein
Messgerät veröffentlicht keine Liste seiner Abfragen: "Keine Tags gemeldet. Fügen Sie das Gerät hinzu, um die Tags in seinem Editor einzurichten."
Ein VISA-Kandidat, dessen Ressource ein Gerät des Treibers schon hat, wird als bereits eingerichtet
markiert und bietet Öffnen statt Hinzufügen; ein über TCP gefundenes Messgerät wird nie zugeordnet,
denn ein Host ist nur der Ort, an dem ein Messgerät erreicht wird. VISA listet jeden seriellen Port
des Rechners als Ressource auf (`ASRL3::INSTR`), ob etwas angeschlossen ist oder nicht, und eine
Frage würde an das schreiben, was dort hängt: Die Suche lässt sie aus, und ein serielles Messgerät
kommt auf eine serielle Leitung dieses Treibers. Eine serielle Ressource, die von Hand in einem
VISA-Gerät eingegeben ist, wird trotzdem geöffnet. Etwas im Feld, das kein Host ist, wird darunter
abgelehnt, und Geräte suchen wird grau: "Ein SCPI-Suchlauf bittet das hier eingetragene Messgerät über TCP, sich zu erkennen zu geben: seine IP-Adresse oder sein Name, auf Wunsch mit Port (zum Beispiel 192.168.0.20 oder 192.168.0.20:5025). Leer lassen, um nur die Messgeräte zu fragen, die VISA auflistet."
Das übrige Verhalten der Suche steht unter [Gerätesuche](connector-discovery).

## Beispiel: ein Multimeter über TCP {#example-a-multimeter-over-tcp}

Ein Keysight 34461A im Netzwerk beantwortet SCPI auf seinem LXI-Socket, Port 5025. Seine
Gleichspannung lesen:

1. Auf der Seite des Treibers **Gerät hinzufügen**; nennen Sie es `DMM`, behalten Sie
   **TCP (LXI-Socket)**, geben Sie als **Hostadresse** 192.168.0.20 ein und behalten Sie **Port** 5025.
2. Behalten Sie auf der Karte **Messgerät** **LF (Zeilenvorschub)**, ein
   **Zeitlimit für die Antwort (ms)** von 2000 und **Fehlerwarteschlange (SYST:ERR?)**, und geben Sie
   zwei **Einrichtungsbefehle** ein, `*RST` und dann `CONF:VOLT:DC 10`: Das Messgerät wird
   zurückgesetzt und bei jeder Verbindung der Station auf Gleichspannung im Bereich 10 V gestellt.
3. Sobald es verbunden ist, zeigt das Feld Identität, was das Messgerät geantwortet hat, etwa
   `Keysight Technologies,34461A,MY53212345,A.02.14-02.40-02.14-00.49-02-01`.
4. **Tag hinzufügen**; nennen Sie es `Voltage`, Double, Nur lesen, mit der **Abfrage** `READ?`, dem
   **Wert in der Antwort** leer und der **Einheit** V. `READ?` nimmt eine Messung in der eingestellten
   Funktion auf und antwortet mit ihr.

Die Base URI lautet
`scpi://tcp/192.168.0.20:5025?term=lf&timeout=2000&check=errorqueue&setup=*RST%0ACONF:VOLT:DC 10`.
Ein Agent tut dasselbe mit zwei Werkzeugaufrufen:

```
device_upsert driver=Scpi name=DMM transport=Tcp host=192.168.0.20 port=5025 setupCommands='*RST\nCONF:VOLT:DC 10'
tag_upsert device=DMM name=Voltage opcUaType=Double address='READ?' unit=V
```

## Beispiel: ein Netzgerät an RS-232 {#example-a-power-supply-on-rs-232}

Ein Keysight E3631A beantwortet SCPI an seinem RS-232-Anschluss, mit 9600 Baud, 8 Datenbits, ohne
Parität und mit 2 Stoppbits, und über RS-232 nimmt es Befehle erst an, wenn es in den
Fernsteuermodus versetzt ist. Seine Spannung einstellen, seinen Ausgang schalten und seinen Strom
lesen:

1. **Leitung hinzufügen** auf der Seite des Treibers; nennen Sie sie `PSU line`, wählen Sie `COM4`,
   stellen Sie **Baudrate** auf 9600 und **Serielles Format** auf `8N2`, dann **Aktivieren** Sie die
   Leitung.
2. **Gerät hinzufügen** auf der Leitung; nennen Sie es `PSU`. Stellen Sie auf der Karte **Messgerät**
   das **Zeitlimit für die Antwort (ms)** auf 3000, geben Sie `SYST:REM` als einzige Zeile der
   **Einrichtungsbefehle** ein und stellen Sie die **Schreibbestätigung** auf
   **Abschluss, dann Fehlerwarteschlange (\*OPC?, SYST:ERR?)**, damit ein Schreibvorgang erst erledigt
   ist, wenn der Ausgang ihm gefolgt ist.
3. **Tag hinzufügen** `Setpoint`, Double, Lesen und Schreiben, **Abfrage** `VOLT?`,
   **Schreibbefehl** `VOLT {value}`.
4. **Tag hinzufügen** `Output`, Boolean, Lesen und Schreiben, **Abfrage** `OUTP?`,
   **Schreibbefehl** `OUTP {value}`: Das Schreiben von true sendet `OUTP 1`, von false `OUTP 0`, und
   das Netzgerät beantwortet `OUTP?` mit 1 oder 0.
5. **Tag hinzufügen** `MeasuredCurrent`, Double, Nur lesen, **Abfrage** `MEAS:CURR?`, **Einheit** A.

Die Busadresse des Tags `Setpoint` ist `ask=VOLT?&write=VOLT {value}`. Ein Netzgerät mit mehreren
Ausgängen, wie dieses, wirkt auf den Ausgang, den es ausgewählt hat; ein zweiter Einrichtungsbefehl
wie `INST:SEL P6V` wählt ihn. Dasselbe mit den Werkzeugen des Agenten:

```
serial_line_upsert driver=Scpi name='PSU line' serialPort=COM4 baudRate=9600 serialFormat=8N2
device_upsert driver=Scpi name=PSU transport=SerialLine serialLineId=<id> responseTimeoutMs=3000 setupCommands='SYST:REM' writeCheck=CompletionAndErrorQueue
tag_upsert device=PSU name=Setpoint opcUaType=Double accessType=ReadAndWrite address='VOLT?' writeTemplate='VOLT {value}'
tag_upsert device=PSU name=Output opcUaType=Boolean accessType=ReadAndWrite address='OUTP?' writeTemplate='OUTP {value}'
tag_upsert device=PSU name=MeasuredCurrent opcUaType=Double address='MEAS:CURR?' unit=A
```

## Agent-Werkzeuge {#agent-tools}

`driver_capabilities` beschreibt diesen Treiber unter `scpi`: seine drei Übertragungswege, ob dieser
Rechner VISA hat (unter `prerequisite`, mit jedem Schritt, es zu installieren), die Endezeichen, das Zeitlimit für die Antwort, die
Schreibbestätigungen, die Einrichtungsbefehle, wie eine Abfrage und ein Schreibbefehl geschrieben
werden, wie Antworten gelesen werden, die Suche und die beiden Beispiele oben.
`device_upsert driver=Scpi` nimmt `transport` (`Tcp`, der Standard, `Visa` oder `SerialLine`, das
`serialLineId` mit sich bringt), `host` und `port` über TCP, `visaResource` über VISA, `serialLineId`
für eine Leitung dieses Treibers, `terminator` (`Lf`, `CrLf` oder `Cr`; `\n`, `\r\n` und `\r` werden
ebenfalls gelesen), `responseTimeoutMs` (100 bis 60000), `writeCheck` (`ErrorQueue`,
`CompletionAndErrorQueue` oder `None`) und `setupCommands` (einer pro Zeile oder getrennt durch `\n`;
`''` leert sie). `tag_upsert` nimmt die Abfrage als `address`, `valueField` (1 bis 1000; 0 oder
weggelassen liest die ganze Antwort) und `writeTemplate` (`''` leert ihn).
`serial_line_upsert driver=Scpi` legt eine Leitung dieses Treibers an, nur mit `serialPort`,
`baudRate` und `serialFormat`. `device_discover driver=Scpi` startet die Suche, mit `target` für die
TCP-Abfrage. Ein Gerät, das die Werkzeuge zurückgeben, trägt `scpi`, mit der Identität des
Messgeräts, sobald es geantwortet hat, und ein Tag ebenso. Die übrigen Werkzeuge stehen unter
[Agent-Werkzeuge](agent-tools).

## Grenzen, die man kennen sollte {#limits-worth-knowing}

- Fluke NetDAQ 2640A, 2645A, 2680A und 2686A sprechen ein eigenes Protokoll von Fluke, das nicht
  SCPI ist: Dieser Treiber liest sie nicht. Fluke 1586A Super-DAQ und 2638A Hydra Series III
  sprechen SCPI, und er liest sie.
- Antworten, die als binärer Block nach IEEE 488.2 gesendet werden (ein `#`, eine Länge und rohe
  Bytes), etwa eine Kurvenform oder ein Bildschirmabbild, werden nicht gelesen: Ein Tag liest eine
  als Text geschriebene Antwort.
- Das Produkt installiert kein VISA. Ohne NI-VISA oder die Keysight IO Libraries Suite auf diesem
  Rechner werden USB- und GPIB-Messgeräte nicht erreicht; TCP- und serielle Messgeräte schon.
- Die Suche listet die seriellen Ressourcen von VISA nicht auf (`ASRL…::INSTR`): Ein serielles
  Messgerät kommt auf eine serielle Leitung dieses Treibers.
- Jeder Wert wird abgefragt: Der Treiber wartet nicht auf Bedienungsanforderungen (SRQ) oder auf das
  Statusbyte.
- Ein Gerät lässt sich nicht zwischen einer seriellen Leitung und dem Netzwerk verschieben, auch
  nicht auf eine andere Leitung: Legen Sie es dort an, wo es hingehört, und löschen Sie das alte.
