Virtuelle Tags
Übersicht
Ein virtueller Tag ist kein Tag, der direkt von einem Sensor oder einer PLC gelesen wird. Es ist ein neuer Tag, der durch die Berechnung von Werten mehrerer anderer Tags erstellt wird. In Anlagen gibt es oft Werte, die «nicht gemessen, aber sichtbar sein sollen», wie etwa die Differenz zweier Drücke (Differenzdruck), die Summe der Anlagenleistung oder der Durchschnitt mehrerer Sensoren. Wenn diese als virtuelle Tags angelegt werden, werden die Werte wie bei normalen Tags gespeichert, in Ansichten dargestellt und es können Alarme dafür konfiguriert werden.
Ein virtueller Tag besteht aus zwei Teilen:
| Element | Wo | Funktion |
|---|---|---|
| Der Tag selbst | Verbindung bearbeiten → Liste verbundener Tags → [Virtueller Tag] | Registrierung von Tag-ID, Name und Datentyp |
| Formel | Tag-Konfigurationsformular → Tab Berechnung | EQL-Statement, das Quell-Tags liest und den Wert generiert |
Ohne eine Formel erhält ein virtueller Tag keinen Wert (ausgenommen sind virtuelle Datenpunkte, die manuell eingegeben werden).
Anwendungsbereiche
| Verwendungszweck | Beispiel | Kern der Formel |
|---|---|---|
| Differenz zweier Tags | Differenzdruck = Einlassdruck − Auslassdruck, Abweichung = Sollwert − Istwert | to_double(a.value) - to_double(b.value) |
| Summe | Gesamtleistung = Summe der Anlagenleistung | to_double(a.value) + to_double(b.value) + to_double(c.value) |
| Durchschnitt | Durchschnittstemperatur mehrerer Sensoren | (to_double(a.value) + to_double(b.value)) / 2 |
| Maximum · Minimum | Höchste Temperatur unter mehreren Sensoren | CASE WHEN to_double(a.value) >= to_double(b.value) THEN a.value ELSE b.value END |
| Verhältnis | Produktionsmenge im Verhältnis zur Rohstoffeinspeisung | to_double(a.value) / to_double(b.value) |
| Zeitdurchschnitt eines Tags | Durchschnitt der letzten 10 Sekunden | AVG(TO_DOUBLE(value)) und Zeitfenster — Beispiele in der Hilfe des Berechnungs-Tabs |
Spezialfunktionen zur Auswahl des Maximalwerts aus mehreren Tags (wie greatest) gibt es nicht in der EQL-Funktionsliste. Für Maxima und Minima wird wie oben CASE verwendet.
Funktionsweise
Das im Berechnungs-Tab eingegebene EQL wird im Moment der Speicherung als Statement an den CEP verteilt. Sobald ein neuer Wert in einem Quell-Tag eingeht, generiert das Statement eine Ergebniszeile. Diese Zeile wird zum Wert (Datenpunkt) des virtuellen Tags und fließt durch die gleiche Pipeline wie erfasste Werte. Daher werden Werte virtueller Tags identisch zu normalen Tags gespeichert, über Stream- und Trendansichten sowie APIs gelesen und können von Alarmen oder anderen Formeln verwendet werden.
| Punkt | Bei virtuellen Tags |
|---|---|
| Speicherung | Speicherung über denselben Pfad wie normale Tags. Einsehbar über Trend, Stream und API |
| Datentyp | Folgt dem bei der Registrierung gewählten Datentyp |
| Einheit | Im Registrierungsdialog gibt es kein Feld, daher bleibt es leer. Die Eingabe erfolgt im Tab Tag-Attribute des Konfigurationsformulars |
| Aktualisierungszeitpunkt | Sobald ein neuer Wert in der Quelle eingeht. Es handelt sich nicht um eine zyklische Berechnung |
| Aktualisierungsrate | Wird durch das Statement bestimmt. Mit OUTPUT LAST EVERY 1 SEC wird maximal ein Wert pro Sekunde ausgegeben |
| Qualität (quality) | Die Qualität der Quelle wird nicht automatisch übertragen. Es wird der Wert übernommen, der im Feld quality steht (im Beispiel 192 = GOOD) |
| Bei Verbindungsabbruch der Quelle | Es entstehen keine neuen Werte. Es wird nicht mit «0» aufgefüllt — es bleibt leer nach dem letzten Wert |
| Bei leerem Ergebniswert | Das Ergebnis wird verworfen und es wird kein Datenpunkt erstellt |
| Alarm | Kann genau wie normale Tags Ziel von Alarmbändern oder EQL-Alarmen sein |
a.quality und b.quality sind Integer-Felder und können im Statement direkt gelesen werden. Um quality je nach Quellqualität unterschiedlich zu setzen, muss diese Logik direkt in das Statement eingebaut werden — die Platform berechnet dies nicht automatisch.
Erstellung
1. Registrierung des virtuellen Tags
Ein virtueller Tag gehört zu einer Verbindung. Daher befindet sich die Registrierungsschaltfläche im Verbindungsbildschirm.
- Öffnen Sie in der Verwaltung der Verbindungen die Verbindung, der der virtuelle Tag zugeordnet sein soll, und rufen Sie den Bearbeitungsmodus auf. Es ist sinnvoll, ihn der Verbindung zuzuordnen, über die die Quell-Tags eingehen.
- Klicken Sie im Panel Liste verbundener Tags unten im Formular auf die Schaltfläche [Virtueller Tag] (Tooltip «Virtuellen Tag hinzufügen»).

| Nummer | Position | Funktion |
|---|---|---|
| ① | Panel-Kopf | Liste verbundener Tags — «Tags, die aktuell dieser Verbindung zugeordnet sind». Wird nur im Bearbeitungsmodus einer gespeicherten Verbindung gefüllt |
| ② | Rechts im Panel-Kopf | [Virtueller Tag] — Öffnet den untenstehenden Dialog Virtuellen Tag hinzufügen |
| ③ | Hauptbereich | Liste der Tags dieser Verbindung — Tag-ID, Tag-Name, Datentyp, Einheit, Beschreibung |
- Geben Sie im Dialog Virtuellen Tag hinzufügen die folgenden Informationen ein und klicken Sie auf Speichern.

| Nummer | Feld | Regel |
|---|---|---|
| ① | Hinweis | «Registrierung eines virtuellen Tags. Die Tag-ID muss zwingend mit TAG_ beginnen. Nach Auswahl des Datentyps wird die Eingabe bei virtuellen Datenpunkten in diesem Format validiert.» |
| ② | Tag-ID | Erforderlich. Beginn mit TAG_, nur Großbuchstaben, Ziffern und _, 5~30 Zeichen. Virtuelle Tags werden konventionell mit TAG_V_ benannt — ID-Regeln |
| ③ | Tag-Name | Erforderlich. Platzhalter: «Beschreibende Bezeichnung» |
| ④ | Datentyp | String · Short · Integer · Long · Float · Double · Boolean · Date. Standardwert: String |
| ⑤ | Beschreibung | Erforderlich. Platzhalter: «Verwendungszweck dieses Tags angeben» — wird bei Leeren nicht gespeichert |
| ⑥ | Unten rechts | [Speichern] |
StringDer Dialog öffnet sich mit der Auswahl String. Wenn der virtuelle Tag Zahlen berechnet, ändern Sie dies in Double. Da Alarmbänder nur für numerische und boolesche Tags konfiguriert werden können, wäre bei einer Einstellung auf String später keine Band-Alarmierung möglich.
Die Liste verbundener Tags wird nur im Bearbeitungsmodus einer bereits gespeicherten Verbindung angezeigt (Verbindungsmanagement). Da virtuelle Tags die ID der Verbindung mit speichern, wird die Registrierung bei noch nicht gespeicherten Verbindungen abgelehnt.
Wenn eine Verbindung gelöscht wird, werden alle zugehörigen Tags, einschließlich virtueller Tags, gelöscht. Zugehörige Alarmkonfigurationen und Formeln werden ebenfalls entfernt. Beachten Sie dies, falls Sie einen virtuellen Tag einer anderen Verbindung als der der Quell-Tags zugeordnet haben.
2. Eingabe der Formel
- Öffnen Sie im Tag-Bildschirm das Konfigurationsformular des soeben erstellten Tags.
- Geben Sie im Tab Berechnung im Feld EQL das Statement ein.
- Setzen Sie im Bereich Deployment desselben Tabs den Anwendungsstatus auf Aktiv.
- Klicken Sie auf Speichern für diesen Tab — Tabs werden separat gespeichert (Tag-Registrierungs-/Bearbeitungsformular).

| Nummer | Position | Funktion |
|---|---|---|
| ① | Hilfe zur EQL-Berechnung | «Erzeugt automatisch berechnete Datenpunkte für den Tag mittels EQL.» sowie Beispiel-Statements |
| ② | EQL | Formeleditor. Bei Ablehnung der Speicherung wird die Ursache im Kasten direkt unter diesem Feld angezeigt — siehe unten |
| ③ | Deployment → Anwendungsstatus | Muss auf Aktiv stehen, um verteilt zu werden |
| ④ | Unten rechts | [Speichern] — Speichert nur diesen Tab |
Die Formel muss folgenden Regeln entsprechen:
| Regel | Grund |
|---|---|
Das Ergebnis muss die vier Felder timestamp · value · quality · error_code liefern | Fehlt eines dieser Felder oder ist value leer, wird das Ergebnis verworfen |
Quellwerte müssen mittels to_double(…) umgewandelt werden | Tag-Werte (value) fließen als Strings. Sie dürfen nicht direkt addiert oder subtrahiert werden |
Jedem Quell-Tag muss in Point(tag_id = '…').win:length(1) ein Alias (a, b …) zugewiesen werden | So werden die jeweils aktuellsten Werte der Tags für die Berechnung gepaart |
Es muss ein vollständiges SELECT Statement verwendet werden, nicht nur eine Zeile | Der CEP kompiliert das Statement beim Speichervorgang |
Bei Ablehnung der Speicherung
Beim Speichern wird das Statement kompiliert. Bei Fehlern wird die Speicherung verweigert (HTTP 422). Die Ursache wird direkt auf dem Bildschirm angezeigt.
Unter dem Feld ② EQL erscheint ein roter Hinweiskasten «EQL cannot be read». Diese Ablehnung wird nicht als separater Toast angezeigt.
| Inhalt des Kastens | Beschreibung |
|---|---|
| Positions-Chip | «Zeile N, Spalte M». Der Cursor springt an diese Position; ein Klick auf den Chip führt erneut dorthin. Im Editor wird diese Stelle markiert |
| Text | Statement des Compilers (Ursache) und Korrekturhinweis |
| Original-Engine-Text anzeigen | Eingeklapptes Originalstatement der Engine |
Falls der Compiler keine Position nennt, erscheint nur der Text ohne Chip. Die Markierung verschwindet, sobald das Statement korrigiert wurde.
Die Speicherung wird ebenfalls verweigert, wenn der CEP nicht gestartet ist und somit keine Prüfung erfolgen kann — nicht geprüfte Statements werden nicht gespeichert. In diesem Fall liegt kein Fehler im Statement vor, im Editor wird nichts angezeigt, sondern es erscheint ein Toast: «Could not verify EQL because connection to CEP engine failed.» (HTTP 503). Versuchen Sie die Speicherung erneut, nachdem der CEP gestartet ist. Andere Bereiche, in denen EQL gespeichert oder geprüft wird (z. B. Statements, Alarmkonfigurationen, Abfrageausführungen), lehnen Eingaben in derselben Weise ab (Ursachentext sowie Zeile und Spalte) (Betrieb virtueller Tags).
Die allgemeine Syntax finden Sie unter EQL und CEP — EQL Language.
3. Prüfung der Werterfassung
Wählen Sie im Stream-Bildschirm den virtuellen Tag aus und prüfen Sie, ob Werte fließen. Damit der virtuelle Tag Werte generiert, müssen in den Quell-Tags aktuelle Daten eingehen.
Werte ohne Formel eingeben — virtuelle Datenpunkte
Die Schaltfläche [Virtueller Datenpunkt] im Stream-Bildschirm öffnet einen Dialog, mit dem Zeitstempel und Wert manuell für einen Tag eingegeben werden können. Die Zeit wird im ISO 8601-Format (2024-01-15T17:10:15.123Z) eingegeben. Dies dient zum Testen von Ansichten oder Alarmen, bevor eine Formel existiert.
Beispiel — Filterdifferenzdruck
Beispiel zur Erstellung eines Differenzdrucks aus zwei Druck-Tags vor und hinter einem Filter. Die Tag-IDs dienen nur zur Veranschaulichung.
| Tag | ID (Beispiel) | Bemerkung |
|---|---|---|
| Filter-Einlassdruck | TAG_PT_FILTER_IN | Quelle |
| Filter-Auslassdruck | TAG_PT_FILTER_OUT | Quelle |
| Filter-Differenzdruck | TAG_V_FILTER_DP | Virtueller Tag · Datentyp Double · Einheit bar |
EQL im Berechnungs-Tab:
SELECT current_timestamp() AS timestamp,
to_double(a.value) - to_double(b.value) AS value,
192 AS quality,
0 AS error_code
FROM Point(tag_id = 'TAG_PT_FILTER_IN').win:length(1) a,
Point(tag_id = 'TAG_PT_FILTER_OUT').win:length(1) b
OUTPUT LAST EVERY 1 SEC
| Teil | Bedeutung |
|---|---|
win:length(1) a, win:length(1) b | Paart den jeweils aktuellsten Einzelwert von Einlass und Auslass |
to_double(a.value) - to_double(b.value) | Differenzdruck = Einlass − Auslass |
192 AS quality | Deklariert die Ergebnisqualität als GOOD (Quellqualität wird nicht übernommen) |
OUTPUT LAST EVERY 1 SEC | Berechnet bei Eintreffen eines Wertes an einer der beiden Quellen neu, gibt jedoch maximal einmal pro Sekunde einen Wert aus |
Analog dazu führt die Änderung von - zu + zur Summe und / zum Verhältnis. Bei drei oder mehr Quellen werden c, d usw. in derselben Weise angehängt.
Alarme: «Eine Einstellung = Ein Tag»
Alarmkonfigurationen — ob Band-Alarme oder EQL-Alarme — werden immer auf einen einzelnen Tag angewendet.
| Alarm | Bindung an einen einzelnen Tag |
|---|---|
| Band-Alarm | Tab Alarmband im Tag-Konfigurationsformular — setzt Schwellenwerte für den Wert des Tags selbst. Ein Alarm pro Tag |
| EQL-Alarm | Der Ziel-Tag im Alarmkonfigurationsformular ist erforderlich — der Alarm wird als Alarm dieses Tags aufgezeichnet |
Um Alarme basierend auf Bedingungen aus mehreren Tags zu setzen, erstellen Sie zuerst einen virtuellen Tag für diese Kombination und konfigurieren den Alarm auf diesem virtuellen Tag. Berechnen Sie «Einlass − Auslass > 0,5» nicht innerhalb eines EQL-Alarms durch das Lesen zweier Tags, sondern erstellen Sie einen virtuellen Tag für den Differenzdruck und setzen Sie dort den Alarm «> 0,5». Dadurch wird der kombinierte Wert selbst gespeichert und im Trend sichtbar, und im Alarm wird genau festgehalten, aufgrund welches Wertes der Alarm ausgelöst wurde.
Die Speicherung eines EQL-Alarm-Statements wird abgelehnt, wenn das Statement Tags liest, die nicht der Ziel-Tag sind, mehrere Tags mischt oder keine Tag-Bedingung enthält (Fehlercode alarm.eql.one_tag, HTTP 422). Die Funktion [EQL ausführen] im Formular prüft nach denselben Regeln und lehnt die Eingabe sofort ab. Da es sich um eine Regelverletzung ohne spezifische Position handelt, erscheint im EQL-Editor ein orangefarbener Kasten mit folgendem Text:
EQL-Alarme lesen nur einen Tag — den Tag des Alarms. Mehrere Tags, fehlende Tag-Bedingungen oder Joins mit anderen Tags werden abgelehnt. Richten Sie pro Tag einen Alarm ein oder berechnen Sie Tag-Vergleiche (Differenzdruck, Abweichung) über einen virtuellen Tag und konfigurieren Sie den Alarm für diesen Tag.
Sollte ein bereits gespeicherter Alarm Zeilen anderer Tags generieren, werden Zeilen, die nicht dem Ziel-Tag entsprechen, bei der Beurteilung ignoriert und die Diagnose diagnostic.tag.alarm_foreign_tag_rows hinterlassen. Solche Alarme sollten auf virtuelle Tags übertragen werden.
Beispiel — Differenzdruck > 0,5 bar für 5 Minuten
Konfiguration eines EQL-Alarms für TAG_V_FILTER_DP.
Im Bildschirm Erweiterte Alarme unter Alarm-Einstellung hinzufügen → Ziel-Tag TAG_V_FILTER_DP, Condition (EQL) → EQL wie folgt:
SELECT timestamp, tag_id, tag_name, value, quality, error_code,
CASE WHEN to_double(value) > 0.5 THEN 'HIGH' ELSE 'NORMAL' END AS band
FROM Point(tag_id = 'TAG_V_FILTER_DP').win:length(1)
| Teil | Bedeutung |
|---|---|
CASE … END AS band | Liefert für jeden Wert ein Feld band. Bei 'HIGH' schaltet der Alarm ein, bei 'NORMAL' aus — ohne das Feld band und 'NORMAL' wird die Speicherung abgelehnt |
Point(tag_id = 'TAG_V_FILTER_DP') | Liest nur den einen Ziel-Tag. Die Kombination der beiden Drücke wurde bereits vom virtuellen Tag erledigt |
Die 5-minütige Dauer wird nicht im Statement, sondern im Formular unter Erfassungseinstellungen (ISA-18.2) → Einschaltverzögerung durch Eingabe von 300000 (ms) konfiguriert — Hilfe: «Der Alarm löst aus, wenn die Bedingung für diese Zeit (ms) anhält. 0 deaktiviert die Funktion, maximal 3.600.000 ms (1 Stunde).»
- Wiederholte Benachrichtigungen (Push) können über das Formular unter Unterdrückung redundanter Alarme → Unterdrückungszeit (Min.) reduziert werden.
- Prüfen Sie die Eingabe vor dem Speichern mit [EQL ausführen] im Formular. Die Prüfung erfolgt nach denselben Regeln (ein Tag, Feld
band, Kompilierung) — Alarm-Konfigurationsformular. - Für Fälle, in denen eine Meldung sofort nach Überschreitung ohne Zeitverzögerung erfolgen soll, ist kein EQL-Alarm erforderlich — hierfür können Schwellenwerte im Tab Alarmband des Differenzdruck-Tags eingetragen werden.
Grenzen und Hinweise
| Punkt | Inhalt |
|---|---|
| Anzahl Quell-Tags | Es gibt keine festgeschriebene Obergrenze im Produkt. Da jedoch für jede Quelle ein Zeitfenster erstellt wird, sollte dieses wie in win:length(1) klein gehalten werden — bei großen Zeitfenstern steigt die Anzahl der zu paarenden Kombinationen exponentiell an |
| Virtuelle Tags von virtuellen Tags | Möglich. Da Berechnungsergebnisse wie normale Tag-Werte zurückfließen, können sie als Quelle für andere Formeln dienen |
| Selbstbezogene Berechnungen | Werden beim Speichern nicht geprüft. Erstellen Sie keine Selbstbezüge oder Zyklen (z. B. A liest B, B liest A) |
| Länge der Formel | Bis zu 4.000 Zeichen bei Verwendung der V5 API |
| CEP Backend | Die obigen Beispiele beziehen sich auf das Standard-Backend (Aster CEP). Bei Installationen mit anderen Backends prüfen Sie bitte die Tabelle in CEP — Backends |
| Quellqualität | Wird nicht automatisch propagiert — siehe Funktionsweise |
API und MCP
| Pfad | Bei virtuellen Tags |
|---|---|
| V5 API — Registrierung | POST /api/v5/tag — Identisch zur Registrierung normaler Tags. opc_id ist erforderlich, tag_id wird mit TAG_V_… benannt |
| V5 API — Formel | PATCH /api/v5/tag/{tag_id}/calculation — calculation_eql und use_calculation (true/false). Nach dem Speichern wird die Formel erneut verteilt |
| V5 API — Lesen | GET /api/v5/tag/{tag_id}/config gibt calculation_eql · use_calculation zurück |
| MCP | Es gibt keine speziellen MCP-Tools für virtuelle Tags. Da MCP-Tools Werte über die Tag-ID lesen, werden virtuelle Tags analog zu normalen Tags via list_latest_tag_values · get_tag_history gelesen. Es gibt keine MCP-Tools zum Erstellen oder Ändern von Formeln |
SDK-Methoden finden Sie im Tag-Service.
Verwandte Dokumente
- Betrieb virtueller Tags — Für Administratoren: Deployment, Diagnose, Performance
- Anlagenmanagement — Tag-Bildschirm — Tag-Konfigurationsformular und Tabs
- Verbindungsmanagement — Ort der Registrierung virtueller Tags
- Alarme — Band-Alarme, EQL-Alarme
- EQL — Statement-Syntax
- ID-Regeln — Konvention für
TAG_V_