# Variablen

> Der Editor einer Variablen, Karte für Karte: Identität und Adresse, die Arten Ausdruck und Merker, die Ausgabetypen, die laufende Karte Wert, Wert setzen, Qualität und Remanenz, die Befehle und was der Editor ablehnt.

Eine Variable ist ein typisierter Wert, den die Station berechnet oder hält, unter `Variables` über ihren Ordnerpfad und ihren bereinigten Namen adressiert. Wählen Sie eine Zeile einer Variablen in der Spalte von Logic, oder drücken Sie **Öffnen** in ihrer Zeile in der Tabelle ihres Ordners oder der Wurzel ihres Abschnitts, um ihren Editor zu öffnen. Eine mit Neu… > Neue Variable oder mit Neue Variable an einem Ordner angelegte Variable wird nicht geöffnet: Ihre Zeile ist in dieser Tabelle markiert (siehe [Anlegen und Kopieren](logic#creating-and-copying)). Der Editor setzt **Logic anzeigen** zum Lesen voraus, **Logic konfigurieren**, um irgendein Feld zu ändern, und **Logic bedienen**, um einen Wert eines Merkers zu schreiben.

Die Kopfzeile des Bereichs zeigt die Marke der Zeile (die Marke eines Ausdrucks oder eines Merkers), den Namen und eine Zeile je Art: "Ein Wert, den diese Station aus einem Ausdruck über dem Adressraum berechnet, in jedem Zyklus neu." oder "Ein Wert, den diese Station hält: geschrieben von einem Skript, einem Dashboard oder Ihnen, und überall über seine Adresse lesbar." Die Spalte des Formulars enthält die Karte IDENTITÄT und dann den Editor AUSDRUCK oder die Karte MERKER; die Schiene rechts enthält WERT und, bei einem Ausdruck, GELESENE PUNKTE.

## Identität {#identity}

| Feld | Was es ist | Werte / Standard | Wirkung |
| --- | --- | --- | --- |
| Bezeichnung | Der angezeigte Name; sein bereinigtes Segment ist die letzte Ebene der Adresse. | Freier Text; eine neue Variable heißt `VariableN`. | Wird über das sichere Umbenennen übernommen (unten). Ein leerer Name wird abgelehnt ("Ein Name ist erforderlich."). |
| Zeile mit der Adresse | Die Adresse, auf die die Variable antwortet, unter dem Namen wiederholt: die Wurzel des Abschnitts, die Ordnerebenen, das Segment. | Wird nur gelesen. | Folgt dem Namen, während Sie tippen; der Teil des Ordners ändert sich nur über **Verschieben nach** im Baum. |
| Art | Wie der Wert entsteht. | Ausdruck (Standard) oder Merker. | Auf Merker zu wechseln setzt den Wert aus dem Anfangswert neu; auf Ausdruck zu wechseln leert ihn zu einer Lücke, bis der nächste Zyklus läuft. |
| Ausgabetyp | Die Kategorie, in die jedes Ergebnis und jeder Schreibvorgang gewandelt wird. | Wahrheitswert, Ganzzahl, Dezimalzahl (Standard), Text, Datum und Uhrzeit, Bild, Icon, Farbe. | Ihn zu ändern setzt eine Variable der Art Merker neu (und speichert den Anfangswert, wenn sie remanent ist) oder leert eine Variable der Art Ausdruck zu einer Lücke; die Vorschau löst unter dem neuen Typ neu auf. |
| Einheit (optional) | Die technische Einheit, neben dem Wert gezeichnet. | Freier Text, standardmäßig leer. | In der Karte WERT gezeigt und in Skripten als `.EngineeringUnit` lesbar. |
| Beschreibung (optional) | Freier Text. | Standardmäßig leer. | Keine bei der Auswertung. |

### Name und Adresse {#name-and-address}

Das Feld Name ist ein Umbenennungsfeld: Tippen bleibt örtlich, eine Zeile unter dem Feld zeigt nach einer kurzen Pause die Auswirkung ("Verweise werden geprüft…", dann "Beim Umbenennen werden die 3 Stellen aktualisiert, die diese Adresse lesen.", "Kein Verweis nutzt die aktuelle Adresse." oder "Die wirksame Adresse ändert sich nicht; es müssen keine Verweise aktualisiert werden.", wenn der neue Name auf dasselbe Segment führt), und die Eingabetaste oder das Verlassen des Feldes übernimmt. Die Übernahme benennt die Variable um, schreibt jeden Ausdruck, jedes Skript, jede Bedingung und jede Verknüpfung im Dashboard um, die die alte Adresse verwendet hat, behält den laufenden Wert und die Bindungen der Kanäle (ein Kanal bindet über den festen Schlüssel der Variablen, nie über ihren Namen) und meldet "Variable umbenannt und N Verweise aktualisiert." Ein Name, der auf seiner Ebene zusammenstößt, wird an Ort und Stelle abgelehnt: "'X' hört bereits auf 'Variables.X'. Bezeichnungen in einem Ordner müssen zu unterschiedlichen Segmenten führen." Die Regeln der Schreibweise und des Zusammenstoßens stehen auf [Der Adressraum](logic-address-space#how-an-address-is-spelled).

## Ausdruck {#expression}

Gezeigt, solange die Art Ausdruck ist: der Editor AUSDRUCK mit seiner Schaltfläche Durchsuchen… und dem Hinweis "Ein einzelner JavaScript-Ausdruck über dem Adressraum (z. B. Connector.Simulated.Pump.Flow.ValueToReal() * 0.1, Variables.Setpoint.Value). Für eine Ausgabe vom Typ Bild, Icon oder Farbe geben Sie eine Adresse aus Assets.Images, Assets.Icons oder Assets.Colors zurück (z. B. Variables.Level.Value > 50 ? Assets.Colors.Red : Assets.Colors.Green). Tippen Sie für die Vervollständigung, oder wählen Sie eine mit Durchsuchen…." Der Text speichert bei jedem Tastendruck automatisch und wird jede halbe Sekunde geprüft; ein Problem erscheint in der Karte WERT. Die Sprache, die Lesefläche und jede Regel stehen auf [Ausdrücke](logic-expressions). Der Text des Ausdrucks bleibt erhalten, wird aber übergangen, solange die Art Merker ist.

## Merker {#memory}

Gezeigt, solange die Art Merker ist.

| Feld | Was es ist | Werte / Standard | Wirkung |
| --- | --- | --- | --- |
| Anfangswert | Der Startwert, als Text. Darunter: "Wird beim Start gemäß dem Ausgabetyp gelesen. Für keinen Wert leer lassen." | Beliebiger Text, standardmäßig leer. | Wird nach dem Ausgabetyp gelesen, wenn die Variable angelegt wird, wenn die Art oder der Ausgabetyp wechselt und bei jedem Start einer nicht remanenten Variablen. Leer bedeutet keinen Wert: Die Variable beginnt als Lücke. Text, der sich nicht lesen lässt, wird in der Karte WERT gekennzeichnet ("Der Anfangswert konnte nicht als Dezimalzahl gelesen werden.") und setzt eine Lücke. |
| Remanent: Der zuletzt geschriebene Wert übersteht Neustarts | Ob Schreibvorgänge gespeichert werden. | Standardmäßig aus. | Eine remanente Variable wird etwa eine Sekunde nach dem Ende der Schreibvorgänge gespeichert und nie später als fünf Sekunden nach dem ersten noch nicht gespeicherten Schreibvorgang; die Runtime zu stoppen schreibt weg, was aussteht. Beim nächsten Start wird der gehaltene Text unter dem aktuellen Ausgabetyp gelesen; lässt er sich nicht mehr lesen, wird stattdessen der Anfangswert verwendet. Eine nicht remanente Variable geht beim Start auf den Anfangswert zurück. |

### Wert setzen {#set-value}

Das Feld **Wert setzen** und seine Schaltfläche **Schreiben** werden nur für eine Rolle mit **Logic bedienen** gezeichnet und sind mit "Runtime gestoppt" ausgegraut, solange die Station nur lesend ist; die Projektierungssperre rührt sie nicht an. Tippen Sie einen Wert und drücken Sie Schreiben: Der Text wird nach dem Ausgabetyp gelesen; Text, der sich nicht lesen lässt, wird abgelehnt ("'abc' konnte nicht als Ganzzahl gelesen werden."), und es wird nichts geschrieben; ein leeres Feld schreibt keinen Wert, was die Variable zurück auf eine Lücke setzt. Der Schreibvorgang läuft über den einen [Kanal](logic#writing-values): Er wird abgelehnt, solange ein laufendes Rezept oder eine Verriegelung die Variable hält ("'Variables.X' ist von '`<Halter>`' schreibgeschützt."), als alter auf neuen Wert unter der Quelle Bediener protokolliert, auf der Warteschlange der Logik angewendet und für die Remanenz vorgemerkt, wenn die Variable remanent ist. Eine Zeile unter dem Feld sagt "Wert geschrieben.", wenn der Wert angenommen wurde, oder nennt den Grund der Ablehnung (eine der obigen Ablehnungen), so wie das Schreiben eines Tags im Connector antwortet. Das Feld ist keine Anzeige; die Karte WERT ist es.

Eine Variable der Art Merker kann auch von außerhalb der Station geschrieben werden: Stellt eine Zeile der Tabelle des [Modbus-Servers](connector-modbus-server), die Schreiben erlaubt, sie bereit, nimmt sie die Schreibzugriffe eines Modbus-Clients über denselben Kanal an, im Journal unter der Quelle `Modbus client <address>:<port>` festgehalten. Eine Variable der Art Ausdruck kann ebenfalls bereitgestellt werden, nur lesend.

## Ausgabetypen {#output-types}

| Ausgabetyp | Trägt | Hinweise |
| --- | --- | --- |
| Wahrheitswert | wahr oder falsch | Über einen Kanal aufzeichenbar und darstellbar |
| Ganzzahl | eine 64-Bit-Ganzzahl | Aufzeichenbar und darstellbar |
| Dezimalzahl | eine reelle Zahl doppelter Genauigkeit | Aufzeichenbar und darstellbar; die Anzeige zeigt die Nachkommastellen der Station |
| Text | freier Text | |
| Datum und Uhrzeit | ein Zeitpunkt | Im Datums- und Zeitformat der Station gezeigt |
| Bild | die ID einer Ressource, als Text | Ausgabe zur Darstellung: Der Ausdruck gibt eine Adresse unter `Assets.Images.*` zurück |
| Icon | ein Zeichen oder SVG-Markup, als Text | Ausgabe zur Darstellung: geben Sie eine Adresse unter `Assets.Icons.*` zurück |
| Farbe | eine Hexfarbe, als Text | Ausgabe zur Darstellung: geben Sie eine Adresse unter `Assets.Colors.*` zurück |

Die Wandlung ist dieselbe großzügige Umrechnung, die auch der Rest der Anwendung verwendet: Text wird gelesen, Zahlen werden gerundet oder gewandelt, und was sich nicht wandeln lässt, wird zu keinem Wert. Eine Variable der Art Merker mit einem Typ zur Darstellung hält das Literal, das Sie schreiben (eine ID einer Ressource, ein Zeichen, einen Hexwert). Die drei Ausgaben zur Darstellung gibt es für Dashboards, wo die verknüpfte Komponente [Bild](component-image), [Icon](component-icon) oder [Symbol](component-symbol) zeichnet, worauf die Variable gerade auflöst; die Adressen, die sie zurückgeben, sind unter [Ressourcen](logic-assets#what-a-logic-address-can-name) aufgeführt.

## Die Karte Wert {#the-value-card}

Die Schiene WERT zeigt den aktuellen Wert, zweimal je Sekunde aufgefrischt: bei einem skalaren Typ die Anzeige mit der Einheit daneben, bei Bild das Bild, bei Icon das Zeichen in seiner Größe, bei Farbe das Farbfeld mit seinem Hexwert. Eine Lücke wird als Strich gezeichnet. Bei einer Variablen der Art Ausdruck zeigt die Karte den Entwurf, den Sie gerade tippen, mit den aktuellen Werten ausgewertet, bevor der Zyklus ihn aufnimmt; solange der Ausdruck ungültig ist, bleibt die Anzeige ein Strich, und die Prüfmeldung erscheint in der Karte (ein Namenskonflikt wird auch hier gemeldet, wobei ein schlechter Name die Vorschau nie anhält). Unter der Anzeige eines skalaren Werts sagt die Karte "Verknüpfen Sie unter Process > Definition > Kanäle einen Kanal mit dieser Variable, um sie aufzuzeichnen."; die Bindung entsteht auf dem Bild [Kanäle](process-channels) eines Modells von Process.

Bei einer Variablen der Art Ausdruck führt die Karte GELESENE PUNKTE jede Adresse auf, die der Ausdruck nennt, mit ihrem aktuellen Messwert, und "?", wenn die Adresse nicht mehr auflöst, eine schlechte Eingabe ist also auf einen Blick sichtbar.

## Qualität {#quality}

Der Wert einer Variablen ist entweder ein typisierter Wert oder überhaupt kein Wert (eine Lücke). Ein Punkt ist nur dann gut, wenn sein eigener Wert existiert: Eine Variable der Art Merker ist gut, sobald sie einen Wert hält, und ein leerer Startwert ist bis zum ersten echten Schreibvorgang eine Lücke; eine Variable der Art Ausdruck trägt die Qualität ihrer letzten Auswertung, fehlt also irgendein gelesener Punkt oder ist er schlecht oder ohne Wert, wird der Ausdruck nicht ausgewertet, und die Variable wird zu einer Lücke schlechter Qualität. Ein leerer Messwert wird nie stillschweigend zu null. Skripte lesen die Qualität als `.State()`; ein Kanal, der an die Variable gebunden ist, zeichnet die Lücke als Lücke auf.

## Verwendet von {#used-by}

Die Karte VERWENDET VON am Fuß der Formularspalte führt alles auf der Station auf, was die Variable liest oder schreibt, damit Sie sehen, was von ihr abhängt, bevor Sie sie umbenennen oder löschen. Sie wird gelesen, wenn Sie die Variable auswählen, und nach einer Umbenennung erneut.

| Art | Ort | Bezeichnung |
| --- | --- | --- |
| Modbus-Server | Leer | Die Zeile der Registertabelle des [Modbus-Servers](connector-modbus-server), die die Variable bereitstellt, mit Registerklasse und Adresse im Handbuch (`Holding-Register (4xxxx) 40101`) |
| OPC UA-Server | Leer | Was ein Client über die Zeile der [Bereitgestellten Knoten](connector-opcua-served-nodes) des OPC UA-Servers tun darf, die die Variable bereitstellt: Nur lesen oder Lesen und schreiben |
| MQTT-Veröffentlichung | Der Broker | Das Topic der Zeile der [Karte Veröffentlichen](driver-mqtt#the-publish-card) des Brokers, die die Variable veröffentlicht |
| Variable, Aktion, Alarm | Leer | Die Variable der Art Ausdruck, die Aktion oder der Alarm, deren Text die Adresse der Variablen schreibt, mit den Ordnern, in denen sie abgelegt sind |
| Dashboard | Das Dashboard | Die Komponente, deren Adresseigenschaft die Variable nennt |

Eine Zeile eines Servers hält die Variable über ihre feste Identität: Eine Umbenennung lässt sie dieselbe Variable bereitstellen, und nach dem Löschen bleibt die Zeile stehen und nennt, was ihr fehlt. Die Zeile eines Brokers tut dasselbe und behält ihr Topic. Solange die Suche läuft, steht auf der Karte "Verweise werden gelesen…"; verwendet nichts die Variable, "Nichts auf der Station verwendet diese Variable."; schlägt die Suche fehl, "Die Verweise konnten nicht gelesen werden" mit **Erneut versuchen**, nie eine leere Liste. Die Karte liest nur: Jede Rolle, die den Editor öffnet, sieht sie, auch während die Station gesperrt ist, und sie bietet keinen Befehl. Die [Kanäle](process-channels) eines Process-Modells, die an die Variable gebunden sind, führt sie nicht auf; sie binden über deren festen Schlüssel.

## Befehle {#commands}

| Befehl | Wirkung | Ausgegraut, wenn | Nicht gezeichnet, wenn |
| --- | --- | --- | --- |
| Kopieren | Verdoppelt die Variable an die Wurzel Variables unter einem freien Namen (`Name (2)`…) und markiert die Kopie in der Tabelle dieser Wurzel, statt sie zu öffnen ([Anlegen und Kopieren](logic#creating-and-copying)); die Kopie hat einen frischen Schlüssel, es ist also noch kein Kanal an sie gebunden. | Station gesperrt oder nur lesend. | Der Rolle fehlt Logic konfigurieren. |
| Variable löschen | Fragt "'X' löschen? Damit verschwindet die Variable. Verweise auf ihre Adresse werden unauflösbar. Das lässt sich nicht rückgängig machen." und löscht sie dann samt ihres remanent gehaltenen Werts. | Station gesperrt oder nur lesend. | Der Rolle fehlt Logic konfigurieren. |
| Verschieben nach (Rechtsklick) | Legt die Variable in einem anderen Ordner oder an der Wurzel ab; die Adresse und jeder Verweis folgen. | Station gesperrt oder nur lesend. | Der Rolle fehlt Logic konfigurieren. |

Eine Variable hat kein Aktivieren und kein Deaktivieren: Sie wird immer ausgewertet oder immer gehalten.

## Was der Editor ablehnt {#what-the-editor-refuses}

- Einen leeren Namen oder einen Namen, dessen Segment auf seiner Ebene schon vergeben ist.
- Einen Ausdruck, der nicht ein einzelner, nur lesender JavaScript-Ausdruck ist, der einen Punkt nennt, den es nicht gibt, oder eine andere Variable der Art Ausdruck, oder der bei einer Probeauswertung fehlschlägt (die genauen Meldungen stehen auf [Ausdrücke](logic-expressions#what-validation-refuses)).
- Einen Anfangswert oder einen Wert unter Wert setzen, der sich unter dem Ausgabetyp nicht lesen lässt, und jeden Wert, der NaN oder unendlich ist.
- Jede Änderung, solange die Station durch einen Lauf gesperrt oder gestoppt ist: Das Feld lädt auf das zurück, was die Station hält, und das Aktionsprotokoll sagt, warum.

## Was der Editor nicht tut {#what-the-editor-does-not-do}

Er stellt nichts dar und zeichnet nichts auf (das tut ein Kanal), schreibt keine Tags (ein Skript oder ein Bedienelement im Dashboard trägt einen Wert eines Merkers weiter), verweist nicht auf andere Variablen der Art Ausdruck, führt keine Historie der Werte und speichert einen nicht remanenten Wert nicht über einen Neustart hinweg.
