# Bereitgestellte Knoten

> Die Liste dessen, was der eingebettete OPC UA-Server bereitstellt, und alles, was er bereitstellt: Tags, Logic-Variablen, Alarme und Gerätebefehle, jede Zeile schreibgeschützt, bis Sie das Schreiben erlauben, wo ein Client jedes davon findet und was eine aktualisierte Station braucht.

**Bereitgestellte Knoten** ist die vierte Karte im Bereich des OPC UA-Servers im Connector. Der Server stellt diese Liste bereit und sonst nichts: Ein Client, der sich verbindet, findet die hier aufgeführten Tags, Logic-Variablen, Alarme und Gerätebefehle und keine anderen. Die Karte sagt es unter ihrem Titel: "Der Server stellt diese Liste bereit und sonst nichts: Jede Zeile ist ein Tag, eine Logic-Variable, ein Alarm oder ein Gerätebefehl. Eine Zeile bleibt schreibgeschützt, bis Sie das Schreiben erlauben. Ein Schreibzugriff eines Clients nimmt dann denselben Weg wie jeder andere und wird mit der Sitzung des Clients im Journal festgehalten." Connector anzeigen liest die Karte; Connector konfigurieren ändert sie.

## Eine leere Liste {#an-empty-list}

Die Liste ist zu Beginn leer, auf einer neuen Station und auf einer Station, die von einer Version aktualisiert wurde, die jedes Gerät vollständig bereitstellte. Solange sie leer ist, sagt ein Warnhinweis auf der Karte: "Die Liste ist leer, also stellt der Server nichts von der Station bereit: Ein OPC UA-Client findet kein Tag, keine Variable, keinen Alarm und keinen Befehl, bis Sie Zeilen hinzufügen." Der Server lauscht weiter und nimmt weiter die Sitzungen an, die der [Clientzugriff](connector-opcua-client-access) erlaubt; sie durchsuchen einen Adressraum, in dem nichts von der Station steht. Ein Agent liest dasselbe in `server_status`, dessen `servesNothing` wahr ist, solange die Liste leer ist.

## Die Tabelle {#the-table}

| Spalte | Was sie zeigt |
| --- | --- |
| **Quelle** | Was die Zeile bereitstellt, so wie die Auswahl es benennt, oder "Noch keine Quelle", solange keine Quelle gewählt ist. |
| **Zugriff** | **Nur lesen** oder **Lesen und schreiben**, und **Aufrufbar** bei einem Gerätebefehl. |
| **Knoten** | Die Adresse, mit der ein Client eingerichtet wird, in der Form `nsu=<namespace>;s=<identifier>`; leer, solange die Zeile nichts bereitstellt. |

Die Zeilen stehen nach Art (Tags, Variablen, Alarme, Befehle) und dann nach Namen. Ohne Zeile sagt die Tabelle "Noch wird kein Knoten bereitgestellt. Fügen Sie einen mit Neue Zeile hinzu." Ein Klick auf eine Zeile wählt sie und öffnet ihre Felder unter der Tabelle; welche Zeile gewählt ist, gehört zu dem Fenster, in dem Sie sind.

| Befehl | Was er tut | Ausgegraut, wenn (Lage) | Nicht gezeichnet, wenn (Rolle) |
| --- | --- | --- | --- |
| **Neue Zeile** | Fügt eine schreibgeschützte Zeile hinzu, die noch nichts bereitstellt, und wählt sie, damit als Nächstes ihre Quelle gewählt wird. Das Aktionsprotokoll sagt "Zeile zur Liste des OPC UA-Servers hinzugefügt. Wählen Sie ihre Quelle." | Ein Lauf hält die Station, oder die Runtime ist gestoppt. | Ohne Connector konfigurieren. |
| **Zeile löschen** (Gefahrenfarbe) | Löscht die Zeile, die die Tabelle gewählt hat, sofort und ohne Rückfrage; sein Tooltip nennt die Quelle, die die Zeile bereitstellt, und das Aktionsprotokoll bestätigt es. Die Quelle wird nicht berührt: Ein Client findet ihren Knoten nicht mehr. | Keine Zeile ist gewählt ("Wählen Sie eine Zeile der Liste, um sie zu löschen."), ein Lauf hält die Station, oder die Runtime ist gestoppt. | Ohne Connector konfigurieren. |

## Die Felder einer Zeile {#a-rows-fields}

Jedes Feld wird gespeichert, sobald es sich ändert, und der Server stellt die neue Zeile einen Augenblick später bereit, ohne eine Sitzung zu trennen: Er liest seine Liste zehnmal in der Sekunde.

| Feld | Was es tut | Werte und Vorgabe |
| --- | --- | --- |
| **Quelle** | Was die Zeile bereitstellt. Die Liste beginnt mit "(keine)", dann jedes aktivierte Tag eines aktivierten Geräts, benannt nach seinem Treiber, seinem Gerät und sich selbst ("Tag · Simulated · Oven · Temperature"), dann jede Logic-Variable, die einen Wert hält, mit ihren Ordnern und ihrem Namen ("Variable · Oven / Setpoint"), dann jeder Alarm, auf dieselbe Weise benannt ("Alarm · Oven / High temperature"), und zuletzt jeder Befehl eines aktivierten Geräts: die auf der Geräteseite angelegten Befehle und die, die ein Protokoll festlegt, etwa die einer Ladestation ("Befehl · OCPP · Charger · Reset"). Eine Quelle steht nur einmal in der Liste. Die Zeile hält ihre Quelle über deren Identität, deshalb bleibt die Zeile nach einer Umbenennung auf derselben Quelle, die der Server dann unter ihrem neuen Namen bereitstellt. Eine Quelle, die die Liste nicht mehr anbietet, bleibt gewählt und benannt, ein deaktiviertes Tag oder ein deaktivierter Befehl mit dem, was ihn ausschließt, und nur eine Quelle, die es nicht mehr gibt, erscheint als fehlend, mit ihrer Identität. Die Karte [Verwendet von](connector-tags#the-used-by-card) eines Tags führt die Zeilen auf, die es bereitstellen. | "(keine)" bei einer neuen Zeile. |
| **Zugriff** | Ob ein Client die Zeile schreiben darf. **Lesen und schreiben** bleibt aufgeführt und ausgegraut, wo die Quelle keinen Schreibzugriff annimmt, und sein Tooltip sagt "Diese Quelle nimmt keinen Schreibzugriff an: Das tun nur ein Tag mit Schreibzugriff oder eine Merker-Variable." Wird ein Alarm gewählt, wird die Zeile wieder schreibgeschützt. Bei einem Befehl zeigt das Feld **Aufrufbar** als festen Wert, ohne Auswahl, denn ein Befehl wird aufgerufen, nie gelesen oder geschrieben. | **Nur lesen** oder **Lesen und schreiben**; **Aufrufbar**, fest, bei einem Befehl. Nur lesen bei einer neuen Zeile. |

Unter den Feldern sagt eine Zeile, was die Zeile der Liste für einen Client tut:

| Die Karte sagt | Wann |
| --- | --- |
| "Diese Zeile liefert noch nichts: Wählen Sie ihre Quelle." | Keine Quelle ist gewählt. |
| "Die Quelle dieser Zeile gibt es nicht mehr, deshalb stellt der Server für sie nichts bereit." | Das Tag, die Variable, der Alarm oder der Befehl wurde gelöscht. |
| "Ein Client darf diesen Knoten lesen, aber nicht schreiben." | Ein Tag oder eine Variable, schreibgeschützt. |
| "Ein Client darf diesen Knoten lesen und schreiben: Jeder Schreibzugriff wird mit der Sitzung des Clients im Journal festgehalten." | Ein Tag oder eine Variable mit Lesen und schreiben. |
| "Ein Client liest Active, Acked, State, Priority und Message des Alarms und schreibt sie nie." | Ein Alarm. |
| "Ein Client ruft diesen Befehl als Methode seines Geräts auf, solange er in der Liste steht." | Ein Gerätebefehl. |

Unter dieser Zeile folgt auf **Ein Client findet ihn unter** der Knoten.

## Was eine Zeile ablehnt {#what-a-row-refuses}

Eine Änderung, die die Regeln der Liste ablehnen, wird nicht gespeichert: Der Grund steht rot über den Feldern der Zeile, die Änderung bleibt auf dem Bildschirm, damit Sie sie korrigieren, und die Zeile stellt weiter bereit, was sie bereitstellte.

| Die Karte sagt | Wann |
| --- | --- |
| "Diese Quelle steht bereits in der Liste: Ein Client findet sie an dem Knoten, den jene Zeile liefert." | Die Quelle steht schon in einer anderen Zeile. |
| "Die Quelle kann nicht geschrieben werden: Wählen Sie ein Tag mit Schreibzugriff oder eine Merker-Variable, oder lassen Sie die Zeile schreibgeschützt." | Lesen und schreiben auf einem schreibgeschützten Tag, einem Tag eines Treibers, der nie schreibt, einer Ausdrucksvariable, einem Alarm, einem Befehl oder einer Quelle, die es nicht mehr gibt. |
| "Eine Zeile, die Schreibzugriffe annimmt, braucht das Tag oder die Variable, an die sie gehen." | Lesen und schreiben auf einer Zeile ohne Quelle, was nur ein Agent verlangen kann. |
| "Diese Zeile der Liste gibt es nicht mehr. Laden Sie neu und versuchen Sie es erneut." | Die Zeile wurde anderswo gelöscht, in einem anderen Fenster oder von einem Agenten, während Sie sie bearbeitet haben. |

Solange ein Lauf die Station hält oder die Runtime gestoppt ist, wird eine Änderung abgelehnt wie jede Änderung der Seite, mit dem Grund im Aktionsprotokoll, und nichts wird gespeichert.

## Wo ein Client jede Quelle findet {#where-a-client-finds-each-source}

| Quelle | Wo sie steht | Was ein Client liest |
| --- | --- | --- |
| Tag | Wo es immer war: im Namensraum seines Geräts, `http://opcfoundation.org/UA/<driver>.<device>/`, unter dem eigenen Namen des Tags. Ein Client, der vor der Liste eingerichtet wurde, findet es unter derselben Adresse. Ein Client, der den Adressraum durchsucht, findet es im Ordner `Devices` unter Objects, im Objekt, das nach seinem Gerät benannt ist. | Den Wert, den das Gerät geantwortet hat, mit seiner Qualität und seinem Zeitstempel, so wie der Connector ihn liest. |
| Logic-Variable | Im Ordner `Logic` unter Objects, in den eigenen Ordnern der Logic, im Namensraum des Servers `http://opcfoundation.org/UA/EdgeTranslator/` unter ihrer Logic-Adresse (`Variables.Oven.Setpoint`). | Ihren Wert, typisiert durch die eine Umrechnung der Station: Boolean, Int64 für eine Ganzzahl, Double für eine Dezimalzahl, String für einen Text und DateTime für Datum und Uhrzeit. Eine Variable ohne gültigen Wert liest sich als BadDataUnavailable. |
| Alarm | Im Ordner `Alarms` unter Objects, in den eigenen Ordnern der Logic, als ein Objekt unter seiner Logic-Adresse (`Alarms.Oven.HighTemperature`). | Fünf schreibgeschützte Mitglieder: Active und Acked (Boolean), State (Int32: 0 Normalzustand, 1 aktiv und unquittiert, 2 aktiv und quittiert, 3 gegangen und unquittiert), Priority und Message (String). Solange der Alarm seinen Zustand bei schlechter Qualität hält, lesen sich Active, Acked und State als UncertainLastUsableValue. |
| Befehl | Eine Methode seines Geräts, neben den Tags des Geräts. | Mit den Werten aufgerufen, die der Befehl angibt, antwortet er mit dem, was die Anlage geantwortet hat. |

Jedes Gerät behält seinen Namensraum, was auch immer die Liste von ihm bereitstellt, deshalb verschiebt sich der Index, unter dem ein Client einen Namensraum findet, nicht, wenn die Tags eines anderen Geräts in die Liste kommen oder sie verlassen. Ein Gerät, von dem die Liste nichts nennt, hat keinen Knoten.

## Schreiben {#writing}

Ein Schreibzugriff eines Clients erreicht die Station nur auf einer Zeile mit Lesen und schreiben, und die Liste wird in dem Augenblick erneut gefragt, in dem der Schreibzugriff ankommt, deshalb wird eine Zeile, die gerade schreibgeschützt wurde, nie geschrieben. Der Schreibzugriff auf ein Tag geht wie jeder Schreibzugriff von außen in die Lieferwarteschlange seines Geräts, und die Antwort wartet auf die Anlage; der Schreibzugriff auf eine Merker-Variable geht durch den Schreibtrichter der Logic und wird in den Typ der Variable umgerechnet. Die Sperren der Quelle gelten: Eine Quelle, die ein laufender Process hält, wird abgelehnt. Jeder Schreibzugriff wird mit der Anwendung und der Sitzung des Clients im Journal festgehalten. Eine Ausdrucksvariable und ein Alarm nehmen nie einen Schreibzugriff an, und der Server antwortet BadNotWritable. Ein Befehl wird aufgerufen, nicht geschrieben, und ein Client ruft nur einen Befehl auf, der in der Liste steht.

## Eine aktualisierte Station {#an-updated-station}

Eine Station, die von einer Version ohne die Liste aktualisiert wurde, stellte jedes Tag jedes Geräts bereit. Ihre Liste ist zu Beginn leer, deshalb stellt ihr OPC UA-Server nach dem Update nichts bereit, bis die Liste zusammengestellt ist: Fügen Sie für jedes Tag, das ein Client liest, eine Zeile hinzu, stellen Sie die, die ein Client schreibt, auf Lesen und schreiben, und fügen Sie die Befehle hinzu, die ein Client aufruft. Ein Client, der vor dem Update eingerichtet wurde, findet jedes Tag unter der Adresse, die es hatte, und braucht deshalb keine eigene Änderung.

## Mit einem Agenten {#with-an-agent}

```text
server_list_upsert(source: "Connector.Simulated.Oven.Temperature")
server_list_upsert(source: "Variables.Oven.Setpoint", access: "ReadAndWrite")
server_list_upsert(source: "Alarms.Oven.HighTemperature")
server_status()
```

Eine Zeile, die ein Agent anlegt, ist schreibgeschützt, sofern `access` nichts anderes sagt, und `server_list_delete` löscht eine über ihre Kennung. Die Werkzeuge sind unter [Die Werkzeuge, Bereich für Bereich](agent-tools#connector--configure) beschrieben.

## Was die Liste nicht tut {#what-the-list-does-not-do}

Sie schaltet den Server nicht ein (das tut Aktivieren in der Befehlsleiste), sie entscheidet nicht, welcher Client sich verbinden darf (das tut der [Clientzugriff](connector-opcua-client-access)), und sie quittiert keinen Alarm von außen: Quittieren bleibt ein Befehl des Bedieners. Sie stellt die obigen Werte bereit und keine OPC UA-Ereignisse zu Alarmen und Bedingungen. Eine Variable, die ein Bild, ein Symbol oder eine Farbe hält, wird nicht angeboten, und eine Konstante der Beschreibung eines Geräts wird nicht bereitgestellt.
