# Ereigniseinträge

> Beobachtete Bedingungen des geprüften Dings, als JavaScript-Ausdruck über den Kanälen des Modells geschrieben und während eines Laufs oder immer beurteilt.

Ein **Ereigniseintrag** hält fest, dass das geprüfte Ding etwas Bemerkenswertes getan hat. Wo ein
Alarm die Anlage und die Ausrüstung beobachtet, gehört ein Ereigniseintrag zum Ablauf: Seine
Flanken bleiben bei dem Lauf, der sie beobachtet hat, und gehen außerdem in den dauerhaften Verlauf
Ereigniseinträge der Seite Ereignisse ein. Seine Bedingung ist ein JavaScript-Ausdruck über den
Kanälen des Modells, auf beiden Flanken entprellt und von der Qualität dessen bestimmt, was er
liest. Ereigniseinträge wohnen unter Process > Modelle > Modell > Setup > **Ereigniseinträge** und
brauchen die Berechtigung **Rezepte und Bewertungen ändern**.

## Der Ordner Ereigniseinträge {#the-occurrences-folder}

Die Auswahl der Zeile **Ereigniseinträge** öffnet die Ordnerseite ("Überwachte Bedingungen des Prüflings. Jede Flanke bleibt, wo es zutrifft, bei ihrem Lauf und geht außerdem in die
dauerhafte Historie der Ereigniseinträge ein.") mit einer Karte je Ereigniseintrag, nach Namen; ein
Klick auf eine Karte öffnet ihn, und das X entfernt ihn. Ohne einen sagt die Seite "Noch keine
Ereigniseinträge. Fügen Sie einen hinzu."

| Befehl | Was er tut | Ausgegraut, wenn (Lage) | Nicht gezeichnet, wenn (Rolle) |
| --- | --- | --- | --- |
| **Ereigniseintrag** (Detailleiste, Ordner gewählt; Rechtsklick **Ereigniseintrag hinzufügen**) | Fügt `Ereigniseintrag <n>` hinzu: Schweregrad Warnung, während der Abläufe scharfgeschaltet, aktiviert, keine Meldung, leere Bedingung. Die Zeile kommt in ihre Gruppe, dort markiert und in den sichtbaren Bereich gerollt; ihre Karte öffnet sie. | Irgendeine Einheit hält einen Lauf, oder die Runtime ist gestoppt. | Ohne Rezepte und Bewertungen ändern. |

## Die Seite des Ereigniseintrags {#the-occurrences-page}

Der Kopf trägt den Namen, eine Pille mit dem Schweregrad (in dessen eigener Farbe) und eine Pille
**Deaktiviert**, wenn der Ereigniseintrag aus ist. Zwei Arten von Hinweis können darunter stehen:

- Eine warnende Anmerkung, wenn die gespeicherte Bedingung nicht gültig ist (der Entwurf wird
  trotzdem gespeichert; die Anmerkung sagt, was falsch ist, siehe unten).
- Ein Hinweis **Bewertung nicht verfügbar** je Einheit, auf der die laufende Bedingung nicht
  ausgewertet werden konnte, als "`<unit>`: `<error>`". Die Diagnose einer Einheit wird einmal je
  unverändertem Fehler geschrieben und gelöscht, wenn die Auswertung wieder gelingt.

### Identität und Verhalten {#identity--behavior}

| Feld | Was es ist | Werte / Vorgabe | Wirkung |
| --- | --- | --- | --- |
| **Bezeichnung** | Der Name des Ereigniseintrags: die Baumzeile, die Beschriftung des Ereignisses in der Laufdatei, im Verlauf der Seite Ereignisse und in den Berichten. | Freier Text; `Ereigniseintrag <n>` beim Anlegen. | Benennt die Zeile um und ebenso das, was die Checkliste eines Ablaufs so nennt. |
| **Schweregrad** | Das Gewicht einer Aktivierung. Die Auswahl zeigt jede Möglichkeit in der Farbe, die ihre Pille tragen wird. | **Information**, **Warnung** (Vorgabe), **Kritisch**. | Färbt die Pille und die Episode überall, wo sie gelistet wird. Während eines Laufs verlangt die Aktivierung eines Ereigniseintrags mit Warnung oder Kritisch außerdem eine Benachrichtigung des Betriebssystems, solange die Anwendung verborgen oder minimiert ist; Information bleibt im Fenster. |
| **Scharf** | Wann die Bedingung beurteilt wird. | **Während eines Ablaufs** (Vorgabe): nur, solange ein Lauf eines Ablaufs aktiv ist, der ihn scharfschaltet, über den aufgezeichneten Zeilen. **Immer**: auch außerhalb von Läufen, durch eine Überwachung im Hintergrund, die die Verknüpfungen der Einheit live liest. | Ein Ereigniseintrag mit Immer braucht keinen Ablauf, der ihn scharfschaltet; einer mit Während eines Ablaufs wird nur von den Abläufen beurteilt, die ihn ankreuzen. |
| **Einschaltverzögerung (ms)** | Wie lange die Bedingung wahr bleiben muss, bevor **Aktiviert** bestätigt wird, in der Auflösung der Abtastwerte. | Eine Anzahl Millisekunden; 0 als Vorgabe. Das Feld nimmt keine negative Zahl an: Die Eingabe wird abgelehnt, der Hinweis unter dem Feld sagt das, und der vorherige Wert kommt zurück. | Entprellt die steigende Flanke. |
| **Ausschaltverzögerung (ms)** | Wie lange die Bedingung falsch bleiben muss, bevor **Beendet** bestätigt wird. | Dasselbe; 0 als Vorgabe. | Entprellt die fallende Flanke. |
| **Aktiviert** | Ob der Ereigniseintrag überhaupt scharfschaltet. | Ein als Vorgabe. | Ein deaktivierter Ereigniseintrag schaltet nie scharf, weder in einem Lauf noch außerhalb, und sperrt nie einen Start. |
| **Meldung** | Der Text, der mit einer Aktivierung aufgezeichnet und angesagt wird. | Freier Text; leer als Vorgabe. | Reist mit jeder Flanke in die Laufdatei und ins Journal. |

### Bedingung {#condition}

"Ein einzelner JavaScript-Ausdruck, der einen Wahrheitswert zurückgibt." Die Karte hält einen Codeeditor, die Liste
der Verweise, die Sie benutzen dürfen ("Verfügbare Kanalverweise: Channels.Ch_1,
Channels.Outlet_temperature, …"), und die Erinnerung "Während eines Laufs liest die Bedingung die
aufgezeichneten Spalten des Datalogs; die Überwachung Immer liest die Verknüpfungen der Einheit
live. Syntaxfehler, fehlende Verweise und Fehler bei der Auswertung werden hier gezeigt, statt als
falsch oder als Signalverlust behandelt zu werden."

Auf einen Kanal wird als `Channels.<identifier>` verwiesen, wobei der Bezeichner der bereinigte Name
des Kanals ist: Buchstaben und Ziffern überleben, jedes andere Zeichen wird `_`, und einem Namen,
der mit einer Ziffer beginnt, wird ein `_` vorangestellt. `Channels` hält allein die Kanäle des
Modells und sonst nichts, ein Kanal namens `Math`, `isNaN` oder `true` ist also weiterhin ein
gültiger Kanalname und verdeckt keine globale Größe von JavaScript. Ein vorhandenes, gutes `NaN`
sind Daten, die Sie mit `isNaN(Channels.Pv)` prüfen können. Beispiele:
`Channels.Outlet_temperature > 80`, `Channels.Door_open && Channels.Heater_on`.

Der Entwurf wird schon während des Tippens gegen Beispielwerte des Typs jedes Kanals geprüft, und
die warnende Anmerkung unter dem Kopf sagt, was scheitert:

| Anmerkung | Bedeutung |
| --- | --- |
| "Syntaxfehler: …" | Der Ausdruck lässt sich nicht lesen. |
| "Der Kanalverweis 'Channels.X' existiert in diesem Modell nicht." | Ein Verweis nennt keinen Kanal. |
| "Mehr als ein Kanal bildet auf 'Channels.X' ab." | Zwei Kanalnamen werden auf denselben Bezeichner bereinigt; benennen Sie einen im Gitter der Kanäle um. |
| "Die Bedingung muss einen Wahrheitswert zurückgeben, gab aber `<type>` zurück." | Der Ausdruck liefert etwas anderes als wahr oder falsch. |
| "Auswertungsfehler: …" | Der Ausdruck wirft eine Ausnahme. |

Eine ungültige Bedingung wird trotzdem als Entwurf gespeichert. Sie hat anderswo Folgen: Ein
aktivierter Ereigniseintrag, der die Prüfung nicht besteht und von einem Ablauf scharfgeschaltet
wird (auf ihm angekreuzt oder mit Immer scharf), sperrt den Start dieses Ablaufs, und die Seite des
Ablaufs zeigt "Der Ereigniseintrag '`<name>`' ist ungültig: …"; ein ungültiger Ereigniseintrag mit
Immer startet seine Überwachung außerhalb von Läufen nicht und lässt stattdessen hier eine
sichtbare Diagnose zurück, statt sie bei jeder Abfrage zu wiederholen.

Jede Auswertung läuft in einer eingeschränkten Ausführungsumgebung (eine Grenze von 500 ms, eine
begrenzte Anzahl Anweisungen und ein begrenzter Speicher), ein außer Kontrolle geratener Ausdruck
lässt also seine Auswertung scheitern und nicht die Station.

## Wie ein Ereigniseintrag beurteilt wird {#how-an-occurrence-is-judged}

Während eines Laufs wird die Bedingung über den Zeilen beurteilt, die das Datalog aufzeichnet, ein
Kanal, den das Datalog des Ablaufs nicht aufzeichnet, steht ihr also nicht zur Verfügung. Ein
Ablauf, der einen Ereigniseintrag über einem solchen Kanal scharfschaltet oder der einen
scharfschaltet und überhaupt nichts aufzeichnet, wird auf seiner eigenen Seite und bei Start
abgewiesen: Der Ereigniseintrag würde nie beurteilen, und die warnende Anmerkung nennt ihn.
Außerhalb von Läufen wird ein Ereigniseintrag mit Immer von einer Überwachung beurteilt, die die
Verknüpfungen der Einheit live liest. Beide Bewerter halten den letzten bestätigten Zustand,
solange irgendein bezogener Kanal nicht verfügbar ist: Nur ein fehlender Wert oder eine schlechte
Qualität setzen das Beurteilen aus, und ein vorhandener, guter Wert (ein `NaN` eingeschlossen) sind
auswertbare Daten. Der Bewerter zeichnet vier Übergänge auf: **Aktiviert** (nach der
Einschaltverzögerung), **Beendet** (nach der Ausschaltverzögerung), **Nicht verfügbar** (ein
bezogener Kanal hat sein Signal verloren) und **Wiederhergestellt** (jeder bezogene Kanal ist
zurück; die Bedingung wird erneut beurteilt, und die zutreffende Verzögerung beginnt von vorn).

Während eines Laufs wird jeder Übergang zuerst in die Laufdatei geschrieben und dann mit seinem
Laufkontext in das dauerhafte Journal auf der Seite [Ereignisse](events-occurrences) kopiert;
außerhalb von Läufen schreibt die Überwachung allein ins Journal. Einen Lauf zu starten verwirft den
laufunabhängigen Bewerter der Einheit, und den Lauf zu verlassen legt einen frischen an, keine
Aktivierung reicht also über eine unbeobachtete Grenze. Änderungen an Name, Meldung oder
Schweregrad wirken nur auf spätere Flanken; Änderungen an der Bedingung, an den Verzögerungen, an
der Scharfschaltung oder am Aktivierungszustand beginnen eine frische Beobachtung.

Episoden (von der Aktivierung bis zum Ende, mit jedem Abschnitt eines Signalverlusts getrennt
gezählt) werden aus diesen Flanken abgeleitet, wo immer die Anwendung sie zeigt: auf der Karte
Ereigniseinträge eines Einheitenbereichs, auf der Seite Ereignisse, in den Historien und in den
Berichten. Die aktive Zeit einer Episode ist genau der Abstand zwischen den beiden gesicherten
Flanken, sie schließt die Einschaltverzögerung also aus und die Ausschaltverzögerung ein: Die Uhr
beginnt, wenn die Bedingung die Einschaltverzögerung bereits gehalten hat, und sie hält erst an,
wenn das Ende geschrieben ist, nachdem die Ausschaltverzögerung abgelaufen ist. Das ist die Zahl,
die ein Bericht einem Dritten reicht.

## Wo ein Ereigniseintrag benutzt wird {#where-an-occurrence-is-used}

Die Seite eines Ablaufs trägt die Karte **Ereigniseinträge, die während dieses Ablaufs scharf
sind**, mit einer Pille "`<n>` scharf" und einem Kontrollkästchen je Ereigniseintrag des
Modells, nach Namen. Einen anzukreuzen schaltet ihn während der Läufe dieses Ablaufs scharf; ein
Ereigniseintrag mit **Immer** beobachtet ohnehin und braucht kein Kreuz. Ohne Ereigniseintrag im
Modell sagt die Karte "Noch keine Ereigniseinträge in diesem Modell. Fügen Sie welche unter
Ereigniseinträge des Modells hinzu." Siehe [Abläufe](process-procedures).

Einen Kanal umzubenennen schreibt die Verweise `Channels.<identifier>` dieses Kanals in jeder
Bedingung des Modells mit; Zeichenketten, Kommentare und eine gleichnamige Eigenschaft eines
anderen Objekts bleiben unberührt.

## Ereigniseintrag entfernen {#remove-occurrence}

**Ereigniseintrag entfernen** steht in der Gefahrengruppe der Detailleiste, wenn der
Ereigniseintrag gewählt ist, in seinem Rechtsklickmenü und als X auf der Karte der Ordnerseite. Es
fragt zuerst ("Ereigniseintrag löschen", "Das entfernt den Ereigniseintrag aus dem Modell.") und
schaltet den Ereigniseintrag in jedem Ablauf, der ihn angekreuzt hatte, nicht mehr scharf. Es
braucht Rezepte und Bewertungen ändern und ist unter der Projektierungssperre und bei gestoppter
Runtime ausgegraut.

## Was ein Ereigniseintrag nicht tut {#what-an-occurrence-does-not-do}

- Er ist kein Alarm: Er wird nicht quittiert, hat keine Priorität und beobachtet keine Tags. Die
  Alarme der Anlage stehen auf der Seite [Logic](logic-alarms).
- Er löst nichts aus. Eine Aktivierung wird aufgezeichnet und angesagt; keine Aktion, kein Etikett
  und kein Bericht hängen daran.
- Er kann nichts außer den Kanälen des Modells lesen: kein Tag, keine Variable, kein anderes
  Modell.
- Er wird nicht je Einheit verschieden beurteilt: Eine Bedingung dient jeder Einheit, über deren
  eigenen Verknüpfungen oder aufgezeichneten Zeilen.
