Skip to main content
Skip table of contents

Runtime Skript

Die Runtime Skript wird dafür verwendet, Programmecode zu erstellen und auslöserbasiert ablaufen zu lassen. Hiermit können z. B. Signalwerte abgefragt, Sollwerte ereignisbasiert gesetzt, ein Chargenstart bzw. -stopp realisiert oder ein Kamerabild ins Archiv übernommen werden. Ebenso kann per Skript überprüft werden, ob in einem bestimmten Zeitraum ein Kamerabild im Archiv vorhanden ist. Die zugrunde liegende Programmiersprache ist JavaScript.

Die Konfigurationseinheit “Runtime Skript” kann nur benutzt werden, wenn die SCADA-Lizenz das Modul “Skript-Modul beinhaltet.

Über das Plus kann direkt ein neues Objekt angelegt werden. Sollten Sie ein Objekt bearbeiten wollen oder suchen, klicken Sie auf die Schaltfläche (Der Bereich um das Plus herum), um eine Liste aller bestehender Objekte angezeigt zu bekommen. Dort können Sie das Objekt auswählen, welches bearbeitet werden soll.

Basiskonfiguration

Der Name des Objektes muss vergeben werden. Zusätzlich kann optional ein Beschreibungstext ergänzt werden.


Ausloeser

Der Auslöser gibt an, wann bzw. in welchem Zyklus das nachfolgende Skript ausgeführt werden soll. Es stehen verschiedene Möglichkeiten zur Verfügung. Anbei ein Beispiel mit allen verfügbaren Optionen.

Typ

Wert

Aktion

Beschreibung

Cyclic Trigger

Ganze Zahl

-

Zyklischer Auslöser

Event Trigger

Ereignisdefinition

  • Entered

  • Dropped

  • Acknowledged

Eventbasierter Auslöser

Condition Trigger

Signalbedingung

  • Raised

  • Dropped

Signalbedingung als Auslöser

Batch Trigger

Chargendefinition

  • Started

  • Stopped

Chargenstart bzw. -stopp als Auslöser


Variablen

Um das Runtime Skript für die Objektorientierung nutzbar zu machen oder um übersichtlich die Variablen im Skript darzustellen, können außerhalb des Skripts sog. Statische Variablen angelegt werden, die dann innerhalb des Skripts verwendet werden können:

Die Variable SignalID kann dann so im Skript bzw. im Editor verwendet werden. Weitere Informationen sind im Kapitel Editor aufgeführt.


Editor

Mit dem Skript-Editor wird der eigentliche Programmablauf ermöglicht. Die Programmiersprache ist JavaScript. Der Funktionsumfang von JavaScript (ES2022) steht größtenteils zur Verfügung, eine detaillierte Liste was unterstützt wird, findet sich auf: https://github.com/sebastienros/jint.

Über die Buttons “Testen” und “Ausführen” kann das Skript manuell ausgeführt werden. Diese manuellen Aktionen werden erfasst und im Reiter “Historie” geloggt. Ein Klick auf “Testen” erzeugt einen “Dry Run” in der Historie. Hierbei werden keine Sollwerte gesetzt, Chargen gestartet bzw. gestoppt oder Kamerabilder ins Archiv gelegt. Unter Historie kann der Anwender jedoch berechnete Werte oder Skript-Feedback einsehen. Ein Klick auf “Ausführen” führt das Skript vollständig aus.

Um in dem Skript mit der JUMO Cloud Anwendung zu interagieren, werden einige Funktionen und Namespaces zur Verfügung gestellt. Um eine Funktion auf einem Namespace aufzurufen, schreibt man:

{Namespace}.{Funktionsaufruf}

Es folgen nun die Namespaces und deren Funktionen.

Kursiv geschriebene Ausdrücke in geschweiften Klammern werden als Platzhalter verwendet, d.h. in einem richtigen Anwendungsfall müssen diese durch Variablen oder Werte ersetzt werden. {SignalID}


SignalAccess

Der Namespace SignalAccess stellt Funktionen bereit, um Werte von Signalen auszulesen und
Sollwerte zu setzen.

Wie erhalte ich die SignalID?

In der Konfiguration kann unter der Auflistung aller Signale die Spalte “Id” aktiviert werden. Anschließend werden alle SignalID’s angezeigt.

Mit der Funktion SignalAccess.GetValue({SignalID}): number | string kann der aktuellen Live-Wert des Signals, der über den Parameter spezifiziert wurde, ausgelesen werden. Der Wert wird als Nummer oder String zurückgegeben. Existiert das Signal nicht oder ist der Parameter {SignalID} leer, wird null zurückgegeben.

JS
SignalAccess.GetValue({SignalID}): number | string

Mit der Funktion GetValueWithTimestamp({SignalID}): {Value: number | string, Timestamp:
Date} kann der aktuellen Live-Wert zusammen mit dem dazugehörigen Zeitstempel des Signals, der über den Parameter spezifiert wurde, ausgelesen werden. Existiert das Signal nicht oder ist der Parameter {SignalID} leer, wird null zurückgegeben.

JS
SignalAccess.GetValueWithTimestamp({SignalID}): {Value: number | string, Timestamp:
Date}

Mit der Funktion SignalAccess.SetValue({SignalID}, {Value}): void kann der Wert eines Signals (Ausgang) gesetzt werden, d.h. der im zweiten Parameter {Value} spezifizierte Wert wird an das Gateway gesendet oder im Fall eines virtuellen Signals (Signal ohne Datenquelle und Datenverbindung) als Live-Wert erzeugt. Das Signal wird über den ersten Parameter {SignalID} spezifiziert.

JS
SignalAccess.SetValue({SignalID}, {Value}): void

Virtuelle Signale ohne Datenquelle und Datenverbindung werden aktuell nicht historisch gespeichert.


BatchAccess

Der Namespace BatchAccess stellt Funktionen bereit, um Chargen zu starten bzw. zu stoppen und
aktive Chargen abzufragen.

Wie erhalte ich die BatchDefinitionID?

In der Konfiguration kann unter der Auflistung aller Chargendefinitionen die Spalte “Id” aktiviert werden. Anschließend werden alle BatchDefinitionID’s angezeigt.

Mit der Funktion BatchAccess.GetRunningBatches({BatchDefinitionID}): Batch[] können die aktiven laufenden Chargen, die über den Parameter {BatchDefinitionID} spezifizierten Chargendefinition, abgefragt werden.

JS
BatchAccess.GetRunningBatches({BatchDefinitionID}): Batch[]

Mit der Funktion BachAccess.StartBatch({BatchDefinitionId}, {MetadataValues}): Batch können neue Chargen gestartet werden. Der Parameter {BatchDefinitionID} spezifiziert hierbei die gewünschte Chargendefinition. Die Kopfdaten werden über den zweiten Parameter {MetadataValues} übergeben. Hierbei muss der exakte Name des Kopfdatenfeldes aus der Chargendefinition übernommen werden. Nachfolgend wird durch Doppelpunkt der entsprechende Wert spezifiziert. Zum Beispiel {Produkttyp: 300} oder {Produktname: Produkt1}. Werden mehrere Kopfdaten gesetzt, so können diese durch Komma nacheinander aufgeführt werden {Produkttyp: 300,  Produktname: "Wiener Würstchen"}.

JS
BachAccess.StartBatch({BatchDefinitionId}, {MetadataValues}): Batch

Mit der Funktion BachAccess.StopBatch({BatchDefinitionId}, {BatchId}, {MetadataValues}): Batch können laufende Chargen gestoppt werden. Der Parameter {BatchDefinitionID} spezifiziert hierbei die laufende Chargendefinition. Der Parameter {BatchId} spezifiziert die jeweilige Charge. Die Kopfdaten werden über den dritten Parameter {MetadataValues} übergeben. Hierbei muss der exakte Name des Kopfdatenfeldes aus der Chargendefinition übernommen werden. Nachfolgend wird durch Doppelpunkt der entsprechende Wert spezifiziert. Zum Beispiel {Produkttyp: 300} oder {Produktname: Produkt1}. Werden mehrere Kopfdaten gesetzt, so können diese durch Komma nacheinander aufgeführt werden {Produkttyp: 300,  Produktname: "Wiener Würstchen"}.

Wie erhalte ich die BatchId ?

Um die ID der laufenden Charge zu erhalten, kann die Funktion GetRunningBatches({BatchDefinitionID}) wie oben beschrieben benutzt werden. In der Historie wird beim Skript “Testen” der ID-Wert geloggt (sofern die Environment.Print() Funktion verwendet wird (siehe weiter unten))

JS
BatchAccess.GetRunningBatches({BatchDefinitionID}): Batch[]

JS
BachAccess.StopBatch({BatchDefinitionId}, {BatchId}, {MetadataValues}): Batch

CameraAccess

Der Namespace CameraAccess stellt Funktionen bereit, um Archivbilder von Kameras zu erstellen
und abzufragen.

Wie erhalte ich die CameraID ?

In der Konfiguration kann unter der Auflistung aller Kameras die Spalte “Id” aktiviert werden. Anschließend werden alle CameraID’s angezeigt.

Mit der Funktion CameraAccess.AnyArchiveImage({CameraID}, {From}, {Till}): boolean kann überprüft werden, ob ein Archivbild existiert oder nicht. Der Parameter {CameraID} spezifizierte die jeweilige Kamera. Der Parameter {From}, {Till} spezifiziert den Zeitraum, in dem abgefragt werden soll, ob ein Archivbild existiert.

JS
CameraAccess.AnyArchiveImage({CameraID}, {From}, {Till}): boolean

Mit der Funktion CameraAccess.TakeArchiveImage({CameraId}): void kann ein Archivbild aufgenommen werden. Der Parameter {CameraID} spezifizierte die jeweilige Kamera.

JS
CameraAccess.TakeArchiveImage({CameraId}): void

Environment

Der Namespace Environment stellt allgemeine Hilfsfunktionen bereit, um das Erstellen von Skripten zu
vereinfachen und Logeinträge in der Historie zu generieren.

Mit der Funktion Environment.Print({Message}) können Nachrichten aller Art als Logeinträge in die Historie des Skripts geschrieben werden, um diese einfacher zu debuggen. Die Werte müssen jedoch serialisierbar sein.

Was ist {Message} ?

In diesem Ausdruck kann sowohl reiner Text als auch ein Skriptwert stehen. Die Bezeichnung in Anführungszeichen wird als reiner Text übernommen.

Skript Editor

Ausgabe Historienlog

JS
Environment.Print({Message})

Mit der Funktion Environment.GetCurrentUtcDateTime() kann die aktuelle Zeit in UTC abgefragt werden.

JS
Environment.GetCurrentUtcDateTime()

Status über mehrere Skriptausführungen hinweg speichern

Es kann vorkommen, dass man bestimmte Variablen oder Werte {Message} persistent speichern will, um sie bei der nächsten Ausführung des Skriptes zu verwenden. Dies ermöglicht das Objekt ScriptResources[{Message}].

JS
ScriptResources[{Message}]


Historie

Jede Auslösung des Skriptes wird in der Historie gespeichert. Eine Manuelle Auslösung über den “Testen” oder “Ausführen” Button wird als Manueller Eintrag festgehalten. Ein “Testen” erzeugt einen “Dry Run”, in dem keine tatsächlichen Skript-Aktionen ausgeführt werden.

Über das Plus Symbol rechts kann das Log angeschaut werden. Hier werden Aktionen des Skripts aufgeführt und errechnete bzw. abgefragte oder gesetzte Werte eingesehen werden.


Verweise

In den Verweisen tauchen alle Objekte auf, die Referenzen mit dem Objekt haben.


Audit-Log

Das Audit-Log ein Änderungsprotokoll, das transparent aufzeigt wie das Objekt geändert wurde. Bei einigen Objekten wird auch angezeigt, welche Sollwerte von einer bestimmten Person gesetzt wurden. Power User können über den Button auf der rechte Seite eine Detailansicht erhalten, um nachzuvollziehen, was genau in der Konfiguration geändert wurde.

Mit dem Audit-Log kann schnell nachvollzogen werden, was mit dem Objekt zuletzt passiert ist. Es entspricht einem Auszug des Leitvorgangsarchivs.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.