Skip to content

Ereigniscode ​

Ca. 20 Min. Lesezeit

Ereigniscode ist kurzer JavaScript-Code, der ausgeführt wird, wenn auf ein Widget geklickt wird oder sich sein Wert ändert. Der Code läuft nicht auf dem Server, sondern im Browser des Benutzers, der die Seite geöffnet hat. Er wird für Aufgaben wie das Schreiben in mehrere Tags mit einer Schaltfläche, Entscheidungen anhand eines Werts oder das Anwenden eines Rezepts verwendet. Um einen Wert in ein einzelnes Tag zu schreiben, ist kein Ereigniscode nötig; die Bindung Prozesswert des Widgets genügt.

In die Feldebene schreiben

Die Schreibfunktionen im Ereigniscode senden den Wert direkt an das Gerät in der Anlage. Schreibt der Code in das falsche Tag oder mit einem falschen Wert, kann die Maschine unerwartet anlaufen. Testen Sie den Code in einer sicheren Umgebung, bevor Sie ihn in der Anlage verwenden. Für Schreibvorgänge, die eine Bestätigung des Benutzers erfordern, rufen Sie die Funktion setTag mit this auf und aktivieren im Widget die Einstellung Bestätigung erforderlich. Ereigniscode wird nicht für Sicherheits- oder Verriegelungsfunktionen verwendet; diese Funktionen werden in der SPS und im Sicherheitskreis umgesetzt.

Ereigniscode läuft mit den Berechtigungen des Benutzers, der die Seite öffnet

Ereigniscode läuft mit der Sitzung und allen Berechtigungen des Benutzers, der die Seite geöffnet hat; es gelten die Berechtigungen der Person, die die Seite gerade verwendet, nicht die der Person, die den Code geschrieben hat. Öffnet ein Benutzer mit Administratorrechten die Seite, läuft der Code ebenfalls mit diesen Rechten. Ereigniscode wird mit der Seite gespeichert. Ab 2.11 können nur SystemAdmin-Konten Ereigniscode hinzufügen oder ändern; Benutzer mit der Rolle Editor sehen den Code und können ihn löschen (siehe Wer Ereigniscode hinzufügen darf).

Widgets mit Ereigniscode ​

WidgetEreignisse
Schaltfläche, Umschaltfläche, Schalter, Karte, BoxonClick, onMouseDown, onMouseUp
Schaltflächengruppe, Kontrollkästchen, OptionsgruppeonClick, onMouseDown, onMouseUp, onChange
DropdownonChange
EreignisWann es ausgeführt wird
onClickBei einem Klick auf das Widget.
onMouseDownBeim Drücken der Maustaste. Bei Schaltfläche, Umschaltfläche, Schalter und Schaltflächengruppe auch, wenn ein Finger auf dem Touchscreen aufsetzt (siehe Ereigniscode bei Touch-Bedienung).
onMouseUpBeim Loslassen der Maustaste. Bei Schaltfläche, Umschaltfläche, Schalter und Schaltflächengruppe auch, wenn der Finger vom Touchscreen abhebt oder das Drücken abgebrochen wird.
onChangeWenn sich der Wert des Widgets ändert. Der neue Wert wird mit event.value gelesen. Bei Kontrollkästchen und Dropdown kann der Code auch ohne Benutzeraktion ausgeführt werden, wenn sich der Wert des gebundenen Tags ändert; ab 2.11 können die Schreibfunktionen in einer solchen Ausführung nicht verwendet werden (siehe Code ohne Benutzeraktion).

Die Liste der Widgets und ihre Einstellungen finden Sie auf der Seite Widget-Referenz.

Mausereignisse laufen ab 2.10.1

Bei Kontrollkästchen, Schalter, Optionsgruppe und Schaltflächengruppe läuft onMouseDown- und onMouseUp-Code ab 2.10.1. onMouseDown- und onMouseUp-Code, der in einer früheren Version an diesen Widgets geschrieben wurde, läuft nach dem Upgrade bei jedem Drücken und Loslassen der Maustaste; schreibt solcher Code ein Tag, prüfen Sie ihn vor dem Upgrade.

Ereigniscode wird nur im Betriebsmodus ausgeführt: in der Seitenanzeige und im Editor bei ausgeschaltetem Bearbeitungsmodus. Im Bearbeitungsmodus führen Klicks den Code nicht aus. Bei Widgets zur Werteingabe wird der Ereigniscode auch dann nicht ausgeführt, wenn die Einstellung Schreibgeschützt aktiv ist.

Schaltfläche

Beim Widget Schaltfläche, das aus der Palette eingefügt wird, ist Schreibgeschützt standardmäßig aktiv. Damit der Ereigniscode ausgeführt wird, schalten Sie diese Einstellung aus. Schreibt der Aktionsmodus einen Wert und ist der Prozesswert an ein Tag gebunden, wird beim Klick zuerst dieser Wert geschrieben und danach der Code onClick ausgeführt.

Die Composite-Komponente selbst hat keinen Abschnitt Ereignisse. Der Ereigniscode der Widgets in ihr kann in jeder Kopie einzeln bearbeitet werden, wenn er in der Komponentenvorlage als Parameter vom Typ Code freigegeben ist. Siehe Komponentenvorlagen-Editor.

Wer Ereigniscode hinzufügen darf ​

Ereigniscode läuft im Browser jedes Benutzers, der die Seite öffnet, mit dessen Sitzung und Berechtigungen. Deshalb können ab 2.11 nur Konten der Gruppe SystemAdmin Ereigniscode hinzufügen oder ändern. Die Regel wird auf dem Server durchgesetzt und gilt überall, wo Ereigniscode gespeichert wird:

  • beim Speichern einer Seite und beim Erstellen einer neuen Seite,
  • beim Import eines Seitenpakets mit Seiten importieren (.zip),
  • beim Speichern einer Seitenvorlage oder Komponentenvorlage, bei Seite als Vorlage speichern und beim Import eines Vorlagenpakets,
  • bei der Wiederherstellung des Moduls Seiten oder Seitenvorlagen aus einer Konfigurationssicherung.

Parameter vom Typ Code in Composite-Komponenten sind ebenfalls Ereigniscode: der Standardwert in der Vorlage und der in Kopien eingegebene Wert.

Benutzer außer SystemAdmin (zum Beispiel Benutzer mit der Rolle Editor):

  • Sehen den vorhandenen Ereigniscode; der gespeicherte Code wird weiter ausgeführt.
  • Können jede Änderung vornehmen und speichern, die keinen Code ändert. Vorgänge, die den gesamten Seiteninhalt ändern, können auch Code ändern: Ein Suchen und Ersetzen, das einen Text im Ereigniscode (z. B. einen Tag-Namen) ändert, gilt als Codeänderung (siehe Suchen und Ersetzen).
  • Können Ereigniscode löschen sowie ein Widget mit Code innerhalb derselben Seite verschieben und kopieren. Der Code von Widgets, die aus einer anderen Seite eingefügt oder mit Aus JSON-Datei importieren übernommen werden, gilt als neuer Code, wenn derselbe Text nicht in der gespeicherten Fassung dieser Seite vorkommt.
  • Können keinen neuen Code hinzufügen und vorhandenen Code nicht ändern. Auch das Erstellen einer Seite aus einer Vorlage mit Ereigniscode oder das Einfügen einer solchen Vorlage in eine Seite erfordert SystemAdmin; verknüpfte Kopien von Composite-Komponenten sind davon ausgenommen, weil ihr Code aus der gespeicherten Vorlage stammt.

Für diese Benutzer werden der Abschnitt Ereignisse und das Fenster Ereigniscode bearbeiten schreibgeschützt angezeigt; darunter steht der Hinweis Nur SystemAdmin kann Ereigniscode hinzufügen oder ändern. Sie können ihn ansehen und entfernen. Auch die Code-Parameter einer Composite-Komponente und das Feld Standardwert eines Code-Parameters in der Komponentenvorlage sind schreibgeschützt; darunter steht der Hinweis Nur SystemAdmin kann Code-Parameter ändern.

Enthält der gespeicherte Inhalt neuen oder geänderten Ereigniscode, wird nichts gespeichert, und die Meldung Zum Hinzufügen oder Ändern von Ereigniscode sind SystemAdmin-Rechte erforderlich. Die Änderung wurde nicht gespeichert; vorhandenen Ereigniscode können Sie entfernen oder innerhalb derselben Seite verschieben und kopieren. wird angezeigt. Der Server vergleicht den neuen Inhalt mit dem gespeicherten Inhalt: Ist der Text des Codes bereits in der gespeicherten Seite oder in der Vorlage einer verknüpften Composite-Komponente auf der Seite vorhanden, gilt er nicht als Änderung. Ein Paketimport oder eine Wiederherstellung wird vollständig abgewiesen, auch wenn nur eine Seite oder Vorlage gegen diese Regel verstößt.

Seitenänderungen mit einem KI-Assistenten (MCP) unterliegen derselben Regel. Bevor der Assistent eine Änderung anwendet, die Ereigniscode hinzufügt, ändert oder löscht, muss er den vollständigen neuen Code zeigen und eine eigene Bestätigung einholen; bestätigen Sie nicht, ohne den Code gelesen zu haben.

Ereigniscode-Editor ​

Ereigniscode wird bei ausgewähltem Widget im rechten Bereich im Abschnitt Ereignisse geschrieben. Für jedes Ereignis, das das Widget unterstützt, gibt es ein eigenes Feld. In der Überschrift des Felds steht der Name des Ereignisses (z. B. onClick), rechts daneben befinden sich diese Schaltflächen:

SchaltflächeFunktion
Tag einfügen (Etikettsymbol)Öffnet die Tag-Auswahl; das gewählte Tag wird an der Cursorposition eingefügt.
Snapshot-Namensgenerator (Uhrsymbol)Erstellt den Namen eines Verbrauchs- oder Historien-Snapshots und fügt ihn an der Cursorposition ein.
In einem Dialog öffnen (Stiftsymbol)Öffnet den Code im größeren Fenster Ereigniscode bearbeiten.
LöschenLöscht den Code dieses Ereignisses.

Auch im Fenster Ereigniscode bearbeiten gibt es die Schaltfläche Tag einfügen und die Snapshot-Schaltfläche. Änderungen im Fenster werden mit OK in den Code übernommen und mit Abbrechen verworfen. Ereigniscode wird mit der Seite gespeichert; speichern Sie die Seite nach einer Änderung mit Speichern.

Automatische Vervollständigung ​

Der Editor schlägt während des Schreibens Funktionen der SCADA-Laufzeit vor:

  • Nach this. werden die verfügbaren Felder aufgelistet: srt (SCADA-Laufzeit), twCommon (das Widget selbst) und editorOptions (Editorzustand).
  • Nach this.srt. werden die Funktionen mit ihren Parametern aufgelistet. Neben dem gewählten Vorschlag erscheinen eine kurze Beschreibung und ein Verwendungsbeispiel.
  • Wenn Sie den Anfang eines Worts eingeben (z. B. setT), wird die vollständige Schreibweise der Funktion (this.srt.setTag(...)) vorgeschlagen. Die Vorschlagsliste öffnet sich auch mit Ctrl+Space.
  • Nach dem Einfügen einer Funktion sind die Parameterfelder ausgewählt; mit Tab wechseln Sie zwischen den Feldern.
  • Nach this.srt.tag("…"). oder wenn Sie nach einer Variablen, der das Ergebnis von this.srt.tag(...) zugewiesen wurde, einen Punkt setzen, werden die Felder des Tag-Objekts vorgeschlagen (siehe Tags lesen).
  • Nach this.twCommon.properties.value. werden die Eigenschaften des bearbeiteten Widgets aufgelistet.
  • In Zeichenketten (in Anführungszeichen) und Kommentaren werden keine Vorschläge angezeigt.

Tag-Auswahl ​

Die Tag-Auswahl wird mit der Schaltfläche Tag einfügen oder mit Alt+T geöffnet. Wird in der Vorschlagsliste eine Funktion gewählt, die einen Tag-Namen erwartet (z. B. tag, tagValue, setTag, addTag), öffnet sich die Tag-Auswahl automatisch. Der vollständige Name des gewählten Tags wird an der Cursorposition eingefügt. Steht der Cursor in Anführungszeichen, wird der Name unverändert eingefügt, andernfalls in Anführungszeichen.

Die System-Tags auf der Registerkarte System der Tag-Auswahl sind schreibgeschützt. Deshalb wird diese Registerkarte im Tag-Feld der Schreibfunktionen nicht angezeigt.

Hinweise zum Ereigniscode ​

Ab 2.11 listet der Editor riskante Aufrufe im Ereigniscode unter dem Code mit der Überschrift Hinweise zum Ereigniscode auf. Die Hinweise erscheinen im Abschnitt Ereignisse und im Fenster Ereigniscode bearbeiten; jeder Hinweis wird mit seiner Zeile und einem kurzen Vorschlag angezeigt. Hinweise gibt es in diesen Fällen:

FallVorschlag
Ein Aufruf, der ohne Bestätigung in die Anlage schreibt und die Widget-Einstellungen umgeht, auch setTag, dessen dritter Parameter nicht this ist.Verwenden Sie this.srt.setTag(tag, wert, this).
Im onChange-Code von Kontrollkästchen und Dropdown eine Funktion, die bei einer Ausführung ohne Benutzeraktion nicht verfügbar ist (z. B. setTag, Alarm- und Rezeptanwendungsfunktionen).Verschieben Sie beim Kontrollkästchen Schreibvorgänge nach onClick. Ein Dropdown hat kein onClick; prüfen Sie vor dem Schreiben, ob der Benutzer ausgewählt hat (siehe Schreiben aus einem Dropdown).
Zugriff auf die gesamte Seite, die Sitzungsdaten des Benutzers oder den Browserspeicher, eine Netzwerkanfrage außerhalb von this.srt, Ausführen von Code, der im Editor nicht sichtbar ist.Entfernen Sie ihn, wenn er nicht nötig ist; verwenden Sie im Ereigniscode die Funktionen von this.srt.

Hinweise verhindern das Speichern nicht und ändern den Code nicht; der Code läuft wie geschrieben. Gibt es beim Speichern der Seite Hinweise, fasst eine kurze Meldung ihre Anzahl und die betroffenen Widgets (mit ihren Namen auf der Registerkarte Elemente) zusammen. Namen in Kommentaren und Texten (Anführungszeichen) lösen keinen Hinweis aus. Fehlen Hinweise, heißt das nicht, dass der Code sicher ist; die Hinweise suchen nur nach bekannten Namen.

Schreibregeln ​

Ereigniscode wird als Rumpf einer Funktion ausgeführt:

  • Auf die Laufzeitfunktionen greifen Sie mit this.srt zu, auf das Widget selbst mit this.twCommon, auf den Editorzustand mit this.editorOptions. Die Angaben zum Ereignis stehen in der Variablen event; ihr Inhalt hängt vom Widget ab.
  • await kann verwendet werden. Der Code kann mit return vorzeitig beendet werden.
  • Vor der Ausführung werden die Zeilenumbrüche entfernt, und der gesamte Code wird zu einer Zeile. Deshalb:
    • beenden Sie jede Anweisung mit einem Semikolon (;);
    • schreiben Sie keine Zeilenkommentare mit //; der gesamte Code nach dem Kommentar würde ebenfalls als Kommentar gelten. Verwenden Sie für Kommentare /* … */.
js
/* Richtig: jede Anweisung endet mit ; und der Kommentar ist ein Blockkommentar */
const hiz = this.srt.tagValue("Hat1.Hiz");
if (hiz > 100) { this.srt.setTag("Hat1.Uyari", 1, this); }
  • Tritt ein Fehler auf, wird dem Benutzer eine kurze Warnung angezeigt: Beim Ausführen von benutzerdefiniertem Code ist ein Fehler aufgetreten und eine kurze Beschreibung des Fehlers. Die Einzelheiten des Fehlers werden in die Entwicklerkonsole des Browsers (F12) geschrieben.
  • Der Code wird beim ersten Ereignis des Widgets kompiliert. Wird der Ereigniscode im Editor geändert, wird beim nächsten Ereignis der neue Code kompiliert; die Seite muss nicht neu geöffnet werden, und der alte Code wird nicht mehr ausgeführt.

Funktionen der SCADA-Laufzeit ​

Die folgenden Funktionen werden mit this.srt. aufgerufen. Funktionen, die nicht in der Liste stehen, werden für die Verwendung im Ereigniscode nicht unterstützt.

Tags lesen ​

FunktionBeschreibung
tag(fullName)Gibt das Tag-Objekt zurück. Gibt es das Tag nicht, ist das Ergebnis undefined.
tagValue(fullName)Gibt den aktuellen Wert des Tags zurück.
isNumberOrDefaultZero(value)Wandelt den Wert in eine Zahl um; ist er keine Zahl, wird 0 zurückgegeben.

Felder des mit tag() abgerufenen Objekts: Value (Wert), PreviousValue (vorheriger Wert), Quality (Qualität), ChangedTime (Zeitpunkt der letzten Änderung), AlarmState (Alarmzustand), Unit (Einheit), Description (Beschreibung), Name (vollständiger Name), Id (Kennung).

js
const t = this.srt.tag("Hat1.Hiz");
if (t?.Value > 100) { this.srt.setTag("Hat1.Uyari", 1, this); }

Ein nicht gebundenes Tag ist beim ersten Lesen leer

Der Browser erhält nur die Werte der Tags, die die Seite liest. Die Werte der Tags, die in den Widget-Bindungen der Seite verwendet werden, kommen beim Öffnen der Seite an. Ab 2.10.1 wird ein Tag, das im Ereigniscode mit tag() oder tagValue() gelesen wird und an kein Widget der Seite gebunden ist, auch wenn sein Name durch Verkettung gebildet wird, beim ersten Lesen in die Tag-Liste der Seite aufgenommen: Das erste Lesen gibt einen leeren Wert zurück, der Wert kommt kurz darauf an, und spätere Lesevorgänge liefern den aktuellen Wert. Verwendet der Code den Wert schon bei seiner ersten Ausführung (z. B. Code, der beim Öffnen der Seite einmal läuft), binden Sie das Tag zusätzlich an ein Widget der Seite (bei Bedarf an eine ausgeblendete Wertanzeige). Dazu müssen Server und Weboberfläche beide mindestens 2.10.1 haben; ist einer von beiden älter, wird ein im Ereigniscode gelesenes Tag nicht in die Liste aufgenommen; sein Wert kommt nur an, wenn das Tag an ein Widget der Seite gebunden ist. Snapshot-Namen sind davon ausgenommen: Ein Snapshot-Name, der im Ereigniscode vollständig in Anführungszeichen steht (z. B. "Hat1.PLC.__hist.today.avg.Hiz"), wird beim Öffnen der Seite im Code gefunden und ohne Bindung gelesen; durch Verkettung gebildete Snapshot-Namen werden nicht gefunden. Die System-Tags, die der Browser selbst erzeugt (z. B. __activeAlarmCount, __currentUserRoles), können immer gelesen werden.

Tags schreiben ​

FunktionBeschreibung
setTag(fullName, value, this)Schreibt einen Wert in das Tag. Wird als dritter Parameter this übergeben, werden die Einstellungen des Widgets angewendet (Tabelle unten). Dies ist der empfohlene Weg zum Schreiben.
addTag({ Name: fullName, Value: value })Schreibt den Wert nur in die Tag-Liste dieses Browsers; er wird nicht an die Feldebene gesendet. Das Seitenpräfix wird nicht angewendet. Bricht die Live-Datenverbindung ab und wird wiederhergestellt, bleibt der Wert erhalten; bei der Abmeldung oder beim Neuladen der Browserseite (auch beim automatischen Neuladen eines Kiosk-Bildschirms) wird er entfernt. Verwenden Sie nicht den Namen eines Tags, das auf dem Server definiert ist.

Wird setTag mit this aufgerufen, werden diese Prüfungen ausgeführt:

Widget-EinstellungWirkung
Schreibgeschützt aktivEs wird nicht geschrieben.
Editor im BearbeitungsmodusEs wird nicht geschrieben.
Bestätigung erforderlich aktivVor dem Schreiben erscheint die Frage Sind Sie sicher, dass Sie fortfahren möchten?

Ist der Tag-Name leer, schreibt setTag nicht und zeigt die Meldung TAG nicht gefunden! an.

Für alle Schreibfunktionen gelten diese Bedingungen:

  • Es muss eine Serververbindung bestehen.
  • Der Benutzer muss die Rolle Operate oder Editor haben.
  • Das Tag darf nicht schreibgeschützt sein.
  • Bei Tags mit dem Befehlsverhalten Impuls oder Steigende Flanke muss der Benutzer das Tag in seinem Prozessgruppenumfang sehen (siehe Schreibumfang für Tags).

Schreibvorgänge von Benutzern werden zusammen mit dem schreibenden Benutzer im Operationsverlauf gespeichert.

js
/* Start mit Bestätigung: im Widget muss Bestätigung erforderlich aktiv sein */
this.srt.setTag("Hat1.Motor1.Start", 1, this);

Ergebnis des Schreibens ​

Das Ergebnis eines Schreibvorgangs wird dem Benutzer als Warnung gemeldet. Dieses Verhalten ist für Schreibvorgänge aus Widgets und für die Schreibfunktionen im Ereigniscode gleich:

SituationWarnung
Keine SerververbindungSchreibanforderung nicht gesendet: keine SCADA-Verbindung.
Der Benutzer hat keine Rolle zum SchreibenSchreibanforderung nicht gesendet: Sie dürfen keine Tags schreiben.
Der Server hat das Schreiben abgewiesenSchreibanforderung abgelehnt: … mit dem Grund: keine Berechtigung (Rolle oder Prozessgruppenumfang), Tag schreibgeschützt, Tag in der Laufzeit nicht gefunden, Tag nicht in die Laufzeit übernommen (Lizenz- oder Treibergrenze), Tag oder Wert fehlt, oder der Server konnte die Anfrage nicht an den Treiber weiterleiten (z. B. ein vom Gerät abgewiesener BACnet-Schreibvorgang)
Gesendet, aber Geräte- oder Tag-Qualität schlechtSchreibanforderung gesendet, aber die Geräte- oder Tag-Qualität ist schlecht; der Wert erreicht das Gerät möglicherweise nicht.

Bei erfolgreichem Schreiben wird keine Meldung angezeigt. „Gesendet“ bedeutet, dass die Anfrage an den Treiber weitergeleitet wurde; es zeigt nicht, dass die SPS oder das Gerät den Wert übernommen hat. Prüfen Sie bei kritischen Befehlen das Ergebnis am nächsten Wert des geschriebenen Tags (oder des Rückmelde-Tags der SPS).

Alarm ​

Für die Alarmfunktionen benötigt der Benutzer eine Alarmberechtigung.

FunktionBeschreibung
ackAlarm(alarmId)Quittiert den Alarm. Bei 0 werden alle Alarme quittiert, die der Benutzer sehen kann.
ackSingleAlarm(alarmId)Quittiert nur den angegebenen Alarm, nie alle Alarme. Der Alarm muss in der Alarmliste des Benutzers stehen und auf Quittierung warten; bei leerer, 0 oder unbekannter Kennung oder einem bereits quittierten Alarm wird keine Quittierung gesendet. Verwendet dieselbe Berechtigungsprüfung wie die Quittiertaste der Alarmtabelle. Gibt true zurück, wenn die Quittierung gesendet wurde.
muteAlarm(mute)Schaltet in diesem Browser den Alarmton aus (true) oder ein (false).
lockAlarm(alarm)Sendet den Sperrzustand der Alarmzeile an den Server. Das Feld Ignored des Alarmobjekts gibt den gewünschten Zustand an.
js
this.srt.ackAlarm(0);

Für eine Kennung aus einem Tag verwenden Sie ackSingleAlarm, z. B. für eine Schaltfläche, die den neuesten Alarm quittiert (siehe Neuester Alarm):

js
this.srt.ackSingleAlarm(this.srt.tagValue("@NOP::__latestAlarmId"));

Gerät und Verbindung ​

Funktion / FeldBeschreibung
reInitDevice(deviceId)Startet das Gerät neu. Erfordert die Rolle Operate oder Editor, und das Gerät muss in der Prozessgruppe des Benutzers liegen.
reInitDataGroups()Lädt die Definitionen der Prozessgruppen neu. Erfordert die Rolle Editor oder UserAdministrator.
triggerDatabaseScan(deviceId)Startet beim Gerät mit dem Datenbank-Protokoll sofort einen Lesedurchlauf. Wird mit await verwendet. Erfordert die Rolle Editor.
connectedDer Zustand der Serververbindung. Der Wert wird mit .value gelesen.
deviceStatesDie Gerätezustände. Der Wert wird mit .value gelesen.
js
if (!this.srt.connected.value) { return; }
await this.srt.triggerDatabaseScan(3);

Rezept ​

Die Rezeptfunktionen werden mit await verwendet. Um ein Rezept anzuwenden, benötigt der Benutzer die Berechtigung zum Anwenden von Rezepten, und die Lizenz muss die Rezeptfunktion enthalten.

FunktionBeschreibung
applyRecipe({ RecipeId, ContinueOnError })Wendet das Rezept an. Bei ContinueOnError: true wird bei einer fehlerhaften Position nicht angehalten. FailedItemCount im Ergebnis ist die Anzahl der Positionen, die nicht geschrieben werden konnten.
getRecipes(recipeGroupId, includeItems)Listet die Rezepte auf. Die Parameter sind optional: Gruppenkennung und ob die Positionen mitgeliefert werden (Standard false).
getRecipeGroups(includeTags)Listet die Rezeptgruppen auf. includeTags ist standardmäßig true.
js
const sonuc = await this.srt.applyRecipe({ RecipeId: 7, ContinueOnError: true });
if (sonuc?.FailedItemCount > 0) { console.warn(sonuc); }

Oberfläche ​

FunktionBeschreibung
setLoadingPanel({ visible })Zeigt über der Seite das Ladefeld an (true) oder blendet es aus (false).
visualElements(widgetId, path)Liest eine Eigenschaft eines anderen Widgets über die Widget-Kennung und einen Eigenschaftspfad mit Punkten. Wird das Widget oder die Eigenschaft nicht gefunden, wird 0 zurückgegeben.
js
this.srt.setLoadingPanel({ visible: true });
try { await this.srt.applyRecipe({ RecipeId: 7 }); } finally { this.srt.setLoadingPanel({ visible: false }); }

Widget- und Editorfelder ​

FeldBeschreibung
this.twCommon.properties.valueDie aktuellen Eigenschaften des Widgets mit angewendeten Bindungen.
this.editorOptions.editModetrue, wenn sich die Seite im Editor im Bearbeitungsmodus befindet.

Nicht empfohlen ​

In der automatischen Vervollständigung können weitere Einträge erscheinen, die auf dieser Seite nicht beschrieben sind. Sie werden für die Verwendung im Ereigniscode nicht unterstützt. Verwenden Sie für den Seitenwechsel statt Ereigniscode die Einstellungen Navigation (Ziel) des Widgets.

Code ohne Benutzeraktion ​

Der onChange-Code von Kontrollkästchen und Dropdown wird auch ohne Klick ausgeführt, wenn sich der Wert des gebundenen Tags ändert (durch die SPS oder von einem anderen Bildschirm), und auf jedem Bildschirm wiederholt, auf dem die Seite geöffnet ist. Ab 2.11 ist this.srt bei diesen Ausführungen eingeschränkt: Es enthält nur Lesefunktionen und lokale Werte dieses Browsers und kann weder in die Anlage noch auf den Server schreiben.

WidgetonChange läuft eingeschränktonChange läuft mit allen Funktionen
KontrollkästchenImmer: Der Status kommt aus dem gebundenen Wert, also auch nach einem KlickNie; schreiben Sie Aufgaben, die von einem Klick abhängen, in onClick
DropdownWenn sich der gebundene Wert ändertWenn der Benutzer in der Liste auswählt
SchaltflächengruppeEr läuft nicht; onChange läuft nur bei einer Auswahl durch den BenutzerWenn der Benutzer auf eine Schaltfläche klickt, tippt oder sie mit der Eingabetaste oder Leertaste wählt
OptionsgruppeLäuft nicht; onChange läuft nur bei einer Auswahl durch den BenutzerWenn der Benutzer auswählt

Der Code von onClick, onMouseDown und onMouseUp läuft immer mit allen Funktionen.

Eingeschränktes this.srt:

Funktionen
Verfügbartag, tagValue, isNumberOrDefaultZero, connected, deviceStates, visualElements, addTag, Rezept-Lesefunktionen (getRecipes, getRecipeGroups)
Nicht verfügbarsetTag, Alarmfunktionen (ackAlarm, ackSingleAlarm, muteAlarm, lockAlarm), applyRecipe, reInitDevice, reInitDataGroups, triggerDatabaseScan, setLoadingPanel und die anderen Funktionen, die auf dieser Seite nicht beschrieben sind

Wird eine nicht verfügbare Funktion aufgerufen, hält der Code in dieser Zeile an; die Zeilen davor wurden bereits ausgeführt. Der Benutzer sieht die Warnung Beim Ausführen von benutzerdefiniertem Code ist ein Fehler aufgetreten mit einer Beschreibung wie „srt.setTag ist in Ereigniscode ohne Benutzeraktion (z. B. onChange nach Wertänderung) nicht verfügbar. Aufruf nach onClick verschieben.“ Die Warnung erscheint für dasselbe Widget und dieselbe Funktion einmal, bis die Browserseite neu geladen wird; nach dem Neuladen (auch nach dem automatischen Neuladen eines Kiosk-Bildschirms) kann sie erneut erscheinen. In die Browserkonsole wird sie bei jeder Ausführung geschrieben. Der Editor zeigt diese Aufrufe vor dem Speichern als Hinweis an.

addTag ändert nur den Tag-Wert in diesem Browser; es schreibt weder in das Gerät noch auf den Server.

Verhaltensänderung bei der Aktualisierung

Gespeicherter Code, der im onChange-Code dieser Widgets die Änderung eines Tags weitergibt, indem er in ein anderes Tag schreibt, schreibt in 2.11 nicht mehr. Um bei einer Bedieneraktion zu schreiben, verschieben Sie den Code beim Kontrollkästchen nach onClick. Ein Dropdown hat kein onClick; ein Schreibvorgang in seinem onChange-Code funktioniert weiter, wenn der Benutzer in der Liste auswählt (siehe Schreiben aus einem Dropdown). Der onChange-Code der Schaltflächengruppe läuft ab 2.10.1 nur bei einer Auswahl durch den Benutzer und mit allen Funktionen; er ist von dieser Änderung nicht betroffen. Geben Sie Werte zwischen Tags in der SPS oder auf der Serverseite weiter; da derselbe Code auf jedem geöffneten Bildschirm getrennt läuft, wiederholt eine Weitergabe im Browser den Schreibvorgang so oft, wie Bildschirme geöffnet sind.

Diese Einschränkung verhindert versehentliches Schreiben; sie ist keine Sicherheitsgrenze. Der Code läuft weiterhin mit der Sitzung des Benutzers, der die Seite geöffnet hat (siehe Wer Ereigniscode hinzufügen darf).

Das einzige Ereignis eines Dropdowns ist onChange; ein onClick-Ereignis gibt es nicht. Wählt der Benutzer in der Liste aus, läuft der onChange-Code mit allen Funktionen und kann mit setTag(..., this) schreiben. Ändert sich der gebundene Wert von selbst, läuft derselbe Code eingeschränkt und hält beim Schreibaufruf an. Um dieses Anhalten und die Warnung zu vermeiden, prüfen Sie vor dem Schreiben, ob der Code bei einer Auswahl durch den Benutzer läuft. Beim Dropdown ist event.event nur bei einer Auswahl durch den Benutzer gesetzt:

js
/* Der gebundene Wert hat sich geändert, der Benutzer hat nicht ausgewählt: nicht schreiben */
if (!event.event) return;
this.srt.setTag("Hat1.Recete.Secim", event.value, this);

Beim Dropdown empfehlen die Warnung zu einer nicht verfügbaren Funktion und der Editorhinweis statt onClick diese Prüfung: Fügen Sie vor dem Aufruf if (!event.event) return; ein. Die Schaltflächengruppe braucht diese Prüfung nicht: Ihr onChange-Code läuft nur bei einer Auswahl durch den Benutzer und mit allen Funktionen. Der onChange-Code eines Kontrollkästchens läuft immer eingeschränkt; schreiben Sie beim Kontrollkästchen in onClick.

Tag-Präfixe und @NOP:: ​

Ist für die Seite ein Tag-Präfix festgelegt, werden die im Ereigniscode geschriebenen Tag-Namen anhand dieses Präfixes aufgelöst. Diese Regel gilt für tag, tagValue und setTag. addTag wendet kein Präfix an. Auf Seiten, die in einem Modalfenster geöffnet werden, wird das Präfix der Modalseite verwendet. Ab 2.10.1 lösen auch tag("…") und tagValue("…") in Ausdrücken im Feld Tag-Name von Bindungen relative Namen mit dem Präfix der Seite oder des Modalfensters auf, das den Ausdruck enthält; das Tag-Präfix einer Composite-Komponente wird nur auf direkt oder in einfachen Anführungszeichen geschriebene Namen angewendet (siehe Gemeinsames Anlagenfenster). Zur Definition des Präfixes siehe den Abschnitt Tag-Name und Seitenpräfix.

Im Code geschriebenTag-PräfixVerwendetes Tag
"Hiz"Hat1.Hat1.Hiz
".Hiz"Hat1Hat1.Hiz (der führende Punkt wird zum Trennzeichen)
"Hat2.Hiz"Hat1.Hat1.Hat2.Hiz
"@NOP::Hat2.Hiz"beliebigHat2.Hiz
"Hat2.Hiz"keinsHat2.Hiz

Im Ereigniscode wird das Präfix auch vollständigen Namen mit Punkten vorangestellt. Um auf einer Seite mit Präfix auf ein vom Präfix unabhängiges Tag zuzugreifen, schreiben Sie @NOP:: vor den Namen. Der Ausdruck @NOP:: wird immer entfernt und kann auch auf Seiten ohne Präfix gefahrlos verwendet werden.

js
const sicaklik = this.srt.tagValue("@NOP::Genel.DisSicaklik");
const alarmSayisi = this.srt.tagValue("@NOP::__activeAlarmCount");

Der Wert Tag-Präfix einer Composite-Komponente wird nur auf die Tag-Bindungen der Komponente angewendet, nicht auf den Ereigniscode. Schreiben Sie im Ereigniscode innerhalb der Komponente den Tag-Namen passend zum Seitenpräfix.

Für Snapshot-Namen (__cons.…, __hist.…) gelten dieselben Präfixregeln wie auf der Seite Verbrauch und Snapshots.

2WinScada 2.10