# Der Adressraum

> Die sieben reservierten Wurzeln, unter denen jeder Punkt lebt, wie eine Adresse geschrieben und bereinigt wird, wo ein Punkt endet und ein Element beginnt, was das Filterfeld einengt und die drei Wege, eine Adresse in einem Editor einzugeben.

Jeder Punkt, den ein Ausdruck, ein Skript, eine Verknüpfung im Dashboard oder ein Werkzeug eines Agenten nennen kann, lebt unter einer von sieben reservierten Wurzeln. Ihre eigenen Namen leben immer unter einer Wurzel, sie stoßen also nie mit den Wurzeln selbst zusammen. Die Spalte der Seite Logic zeichnet dieselben Wurzeln, aufgeteilt unter zwei Überschriften, und was der Baum zeigt, ist genau das, was Sie tippen: Die Adresse einer Zeile ist der Text, den ein Ausdruck verwendet.

## Die sieben Wurzeln {#the-seven-roots}

| Wurzel | Was sie hält | Überschrift in der Spalte | Bearbeitet |
| --- | --- | --- | --- |
| `System` | Vier Diagnosewerte, die die Anwendung über sich selbst veröffentlicht | Von anderen Seiten | Nirgends |
| `Server` | Vier Diagnosewerte des eingebetteten OPC UA-Servers | Von anderen Seiten | Im [Connector](connector-opcua-server) |
| `Connector` | Der laufende Baum aus Treibern, Ordnern, Geräten und Tags | Von anderen Seiten | Auf der Seite [Connector](connector) |
| `Variables` | Die Variablen, die Sie hier definieren, in ihren Ordnern | Hier definiert | Hier |
| `Alarms` | Der laufende Zustand der Alarme, die Sie hier definieren, in ihren Ordnern | Hier definiert | Hier (der Zustand selbst wird nur gelesen) |
| `Process` | Die Einheiten jedes Modells: Kanäle, Zustand des Laufs, Produktivität, Befehle, Vorbereitung | Von anderen Seiten | Auf der Seite [Process](process) |
| `Assets` | Die Bilder, Icons und Farben der Bibliothek, über ihren Namen adressierbar | Hier definiert, als Wurzel Assets | In den Bereichen von [Ressourcen](logic-assets) |

Actions und Triggers sind Abschnitte der Spalte, aber keine Wurzeln des Adressraums: Sie werden über ihre Identität angesprochen, nicht über eine Adresse, und tragen keinen laufenden Wert. Die Wurzel `Assets` gibt es für Ausdrücke und die Auswahl Durchsuchen…; in der Spalte nimmt die Wurzel Assets der Bibliothek ihren Platz ein, der Baum zeigt also nie zwei Wurzeln dieses Namens. Die festen Punkte von `System` und `Server` und die Gestalt der Zweige `Connector` und `Process` stehen auf [Von anderen Seiten](logic-from-other-pages).

## Wie eine Adresse geschrieben wird {#how-an-address-is-spelled}

Eine Adresse besteht aus durch Punkte getrennten Segmenten, verwurzelt an einer reservierten Wurzel: `Connector.Simulated.Air.CompressedAir.HeaderPressure`, `Variables.Forno.Setpoint`, `Alarms.HighLevel`, `System.Now`, `Assets.Colors.Red`. Angezeigte Namen bleiben freier Text; die Adresse verwendet das bereinigte Segment jedes Namens: Jedes Zeichen, das kein Buchstabe und keine Ziffer ist, wird zu `_`, und einem Namen, der mit einer Ziffer beginnt, wird ein `_` vorangestellt (`Forno de teste` antwortet auf `Forno_de_teste`, `3rd zone` auf `_3rd_zone`, ein leerer Name auf `_`). Segmente sind immer Bezeichner, die Punktform funktioniert also immer; ein Segment darf auch in Klammerform mit einer Zeichenkette geschrieben werden, `Variables["Setpoint"]`, und der Auswerter liest es als dieselbe Adresse.

Wo der Punkt endet und der Zugriff auf ein Element beginnt, hängt von der Wurzel ab. Adressen unter `Connector` tragen die Ordnerebenen des Geräts zwischen dem Treiber und dem Gerät (eine serielle Leitung oder ein MQTT-Broker fügt keine Ebene hinzu), und `Variables` und `Alarms` tragen bis zu drei Ordnerebenen vor dem Namen, unter diesen Wurzeln ist der Punkt also das längste Präfix, das auflöst, und was darauf folgt, ist ein Element (`.Value`, `.State()`). `Assets` liegt immer zwei Segmente unter der Wurzel; `Process` vier bei einem gewöhnlichen Punkt, sechs bei einem zusammenfassenden Punkt der Produktivität und sieben bei einem Ausgabepunkt der Produktivität oder einem Punkt eines Ablaufs. Eine Kette, die kürzer ist, als ihre Wurzel erlaubt, wird als unvollständige Adresse abgelehnt.

Adressen in Ausdrücken und Skripten müssen statisch sein: jedes Segment ein Bezeichner oder eine Zeichenkette, nie ein berechneter Wert. `Variables[someName]` wird bei der Prüfung abgelehnt, mit "Addresses must be static".

## Zusammenstoßende Adressen {#address-collisions}

Eine Ebene eines Abschnitts ist ein Namensraum aus Segmenten, den die Ordner und die Definitionen dort teilen. Zwei Variablen namens `Setpoint` in verschiedenen Ordnern sind in Ordnung; eine Variable und ein Ordner, die auf derselben Ebene beide auf `Forno` führen, sind es nicht, und `Pump 1` und `Pump_1` nebeneinander ebenso wenig. Die Editoren lehnen einen solchen Namen schon beim Tippen ab und nennen, was auf die Adresse bereits antwortet: "'Pump 1' hört bereits auf 'Variables.Pump_1'. Bezeichnungen in einem Ordner müssen zu unterschiedlichen Segmenten führen." Die Ressourcen folgen innerhalb jeder Kategorie derselben Regel: Zwei Ihrer Bilder, Icons oder Farben dürfen sich kein Segment teilen, und ein eigenes Icon oder eine eigene Farbe, deren Segment zu einem Eintrag des Systems passt, überschreibt ihn an der Adresse.

## Eine Adresse eingeben {#entering-an-address}

Drei Wege, eine Adresse in einem [Ausdruck](logic-expressions), einer Bedingung oder einem Skript einzugeben:

- **Sie tippen.** Der Editor vervollständigt die Zeichen einer Adresse: Wurzelnamen bei einem nackten Zeichen (`Con` bietet `Connector` an), dann die Kinder des bisher getippten Pfades, nach Präfix und ohne Rücksicht auf Groß- und Kleinschreibung getroffen, und die lesbaren Elemente eines Punkts, sobald das Zeichen einen Punkt nennt. Jeder Kandidat ersetzt das ganze Zeichen.
- **Durchsuchen…** öffnet eine Auswahl über dem Baum jeder Wurzel bis auf die Ebene der Elemente, die Wurzel `Assets` eingeschlossen. Wählen Sie eine Zeile und drücken Sie **Einfügen** oder klicken Sie doppelt darauf, um ihre Adresse an der Einfügemarke abzulegen. Der Fuß zeigt den Text, den die gewählte Zeile einfügt, oder "Doppelklicken (oder Einfügen), um es in den Editor zu übernehmen.", solange nichts gewählt ist.
- **Von einem Punkt kopieren.** Einen beliebigen Punkt in der Spalte zu wählen öffnet den [Bereich des Punkts](logic-from-other-pages#the-point-panel), dessen Feld Adresse Text ist, der nur gelesen wird und den Sie markieren und kopieren können, neben dem laufenden Wert, seiner Qualität und seinem Zeitstempel. Der Editor einer Variablen oder eines Alarms zeigt seine eigene Adresse unter dem Feld Name.

Unter einem Punkt führt die Auswahl seine lesbaren Elemente auf (`Value`, `ValueToReal()`, `State()` und so fort). Ein Element ist keine Adresse für sich: Es ist das, was Sie an die Adresse des Punkts anhängen. [Ausdrücke](logic-expressions#the-read-surface-of-a-point) führt dieselbe Fläche auf, mit dem, was jedes Element zurückgibt.

## Das Filterfeld {#the-filter-box}

Das Feld **Filtern…** über der Spalte engt den Baum auf die Zeilen ein, deren Name den getippten Text enthält, ohne Rücksicht auf Groß- und Kleinschreibung. Ein Punkt überlebt nur, wenn er passt; ein Ordner überlebt, wenn er passt oder irgendein Nachkomme passt, und klappt zu seinen Treffern auf. Die Abschnitte Actions und Triggers führen nur die Zeilen auf, deren Name passt (ihr eigener Name hält den Abschnitt aufgeführt, aber leer); die Wurzel Assets engt sich auf die Kategorien ein, deren Name passt (`Col` zu tippen lässt Colors stehen), und kommt ganz, wenn nur ihr eigener Name passt; eine Wurzel des Adressraums, deren eigener Name passt, bleibt aufgeführt und lädt ihren Zweig beim Aufklappen. Elemente sind nie Teil der gefilterten Ansicht, und der Filter gehört allein Ihrem Fenster: Ein anderer Browser an derselben Station behält seinen eigenen.

## Was der Adressraum nicht tut {#what-the-address-space-does-not-do}

Er veröffentlicht nichts für ein deaktiviertes Gerät, für ein Gerät, dessen Tags im Connector nicht aufgebaut sind, und für einen Kanal von Process ohne Bindung (ein solcher Kanal wird aufgeführt, bietet aber keine Elemente an). Namen werden nicht übersetzt: Die Adresse ist der bereinigte Anzeigename, eine Variable, einen Alarm, einen Ordner, ein Gerät, ein Tag oder ein Bild umzubenennen ist also eine Änderung der Adresse, die die Anwendung über das sichere Umbenennen in jedem Verweis umschreibt ([Variablen](logic-variables#name-and-address), [Geräteordner](connector-folders)).
