Zum Hauptinhalt springen

EQL — Hilfe zur Event Query Language

🎬 Read EQL statements · 41초 · 2026.08 기준 화면

Inhaltsverzeichnis​


Überblick​

Hauptverwendungsort: Direkte Ausführung im linken Menü unter Automatisierung > EQL-Abfrage(/query/index). Die gleiche Syntax wird in Bedingungsformeln für Erweiterte Alarme · Trigger/Statements · Flows verwendet.

EQL (Event Query Language) ist eine proprietäre Abfragesprache der Platform, mit der Echtzeit-Streamingdaten ähnlich wie mit SQL abgefragt, aggregiert und mittels Pattern Matching analysiert werden können. Während Standard-SQL auf statischen Tabellen operiert, arbeitet EQL auf kontinuierlich eingehenden Event-Streams und gibt (emittet) in jedem Moment Ergebnisse aus.

Betreiber können mit einer einzigen EQL-Zeile Folgendes implementieren:

  • Echtzeit-Überwachung — Sofortige Ergebnisausgabe, sobald ein Tag-Wert einen Schwellenwert überschreitet.
  • Aggregation auf Anlagenebene — Automatische Berechnung von Durchschnitt/Maximum/Minimum alle 5 Minuten.
  • Pattern Matching — "Alarm, wenn nach Event A innerhalb von 30 Sekunden kein Event B eintritt".
  • Zeitreihen-Join — Zeitlich ausgerichteter Vergleich zweier Tags.

EQL verwendet eine nahezu identische Syntax wie SQL, ergänzt jedoch das Konzept der Windows, um Zeit- oder Längenbereiche wie "die letzten N Sekunden / N Datensätze" zu definieren.

Verfügbarkeit je nach Engine

Diese Seite behandelt alle in der Konsole ausführbaren EQL-Funktionen. Beachten Sie jedoch, dass CEP beim Booten ein Backend auswählt und die verfügbaren Funktionen je nach Backend variieren können — Funktionen wie Joins, Variablen oder Kontexte sind möglicherweise nur in einem Backend vorhanden.

Welche Funktion wo läuft, ist in der Tabelle unter CEP — Backend aufgeführt. Die Sprache selbst wird in CEP — EQL-Sprache beschrieben, die Ablehnungstoken in Grenzen und Ablehnungstoken.

Ablehnungen erfolgen zum Zeitpunkt der Registrierung namentlich, sodass keine stillschweigenden Fehler auftreten.


Wo wird EQL verwendet​

Innerhalb der Platform wird EQL an folgenden Stellen eingesetzt:

EQL-Abfragen und Statements befinden sich nebeneinander in der Gruppe 자동화 des linken Menüs. Es gibt kein Menü mit dem Namen «CEP».

Menü · AnsichtInterne URLVerwendungszweck
Automatisierung > EQL-Abfrage — Dokumentation/query/indexSofortige EQL-Ausführung durch den Betreiber zur Überprüfung von Ergebnissen (Exploration/Debugging)
Trigger (kein Link im linken Menü) — Dokumentation/trigger/indexAutomatische Veröffentlichung von EQL-Matching-Ergebnissen an MQ-Topics oder in den Storage
Automatisierung > Statements — Dokumentation/statement/indexAuf Anlagenebene registrierte Regeln (Status/Aggregation/Event/Befehl). Speicherung erfolgt nur bei Angabe der erforderlichen Ausgabefelder
Alarm → EQL-Alarm—Alarmierung bei beliebigen Bedingungen mittels EQL-Regeln
Flow → Script—EQL-Ausdrucksmodus für flow_script_filter / flow_script_transform / flow_switch
Tag-Formular — KI-Tab—Eingangsbedingungen für Vorhersage- und Anomalieerkennungsregeln

EQL ist nur lesend — Daten werden nicht geändert. Um Alarme aus Matching-Ergebnissen zu erzeugen oder Flow-Aktionsknoten aufzurufen, verbinden Sie die Ergebnisse bitte über CEP → Trigger oder EQL-Alarm.


Grundlegende Syntax​

Die Grundstruktur von EQL ist nahezu identisch mit SQL.

SELECT <column-or-function>
FROM <stream>.<window>
WHERE <condition>
GROUP BY <field>
HAVING <aggregation-condition>
ORDER BY <field> [ASC|DESC]

Einfachste EQL:

SELECT * FROM Point.win:time(1 sec)

Gibt alle Tag-Datenpunkte aus, die in den letzten 1 Sekunde eingegangen sind, jede Sekunde aus.

Wildcards und Spaltenauswahl​

SyntaxBedeutung
SELECT *Alle Spalten einbeziehen
SELECT tag_id, valueNur spezifische Spalten
SELECT value AS v, tag_id AS idAlias zuweisen
SELECT value * 9 / 5 + 32 AS fahrenheitErgebnis eines arithmetischen Ausdrucks
SELECT CASE WHEN value > 80 THEN 'HIGH' ELSE 'OK' END AS levelBedingungsformel

Kommentare​

-- 한 줄 주석
/* 여러 줄
주석 */
SELECT * FROM Point.win:time(1 sec)

Event-Streams (14 Typen + 3 interne Typen)​

Die im Abschnitt FROM verwendbaren Streams (Event-Quellen) sind wie folgt. Alle Streams werden automatisch von der Platform generiert und können ohne separate Registrierung sofort verwendet werden.

Wenn Sie einen Namen verwenden, der hier nicht aufgeführt ist (FROM), wird die Regel nicht bereitgestellt. Nur registrierte Event-Typen können als Streams dienen (plantpulse.core.engine.eql.EventTypes).

Tag-Domäne (3 Typen)​

StreamZeitpunkt des AuftretensHauptfelder
PointBei jedem Empfang eines Tag-Wertstag_id, value, quality, ts, site_id, asset_id, unit, java_type
PointMapIdentisch, wird jedoch mit der Funktion tag('<id>') verwendet, um mehrere Tags als Key-Value abzufragen(PointMap-spezifische Helfer)
AlarmBei Auslösung eines Tag-Alarmstag_id, alarm_band, value, threshold, priority, band_message

Anlagen-Domäne (6 Typen)​

StreamZeitpunkt des AuftretensHauptfelder
AssetDataZeitreihendaten auf Anlagenebene (Aggregationsergebnis)asset_id, values(key-value), ts
AssetEventAuftreten eines Anlagen-Events (Start, Stop, Wartung etc.)asset_id, event_type, details, ts
AssetAlarmAuslösung eines Anlagen-Alarmsasset_id, alarm_band, priority, message
AssetCommandWenn ein Befehl an eine Anlage gesendet wirdasset_id, command, args
AssetAggregationAnlagen-Aggregationsergebnisse für 1 Min / 5 Min / 1 Stdasset_id, window, agg_type, values
AssetContextÄnderung des Anlagenkontexts (Metadaten)asset_id, context_key, before, after
AssetHealthStatus · AssetConnectionStatus sind keine Streams

In älteren Dokumentationen wurden diese beiden als Anlagen-Domänen-Streams aufgeführt, sie sind jedoch keine registrierten Event-Typen. Wenn Sie FROM AssetHealthStatus... schreiben, wird die Regel nicht bereitgestellt.

Die Bewertung von Health- und Verbindungsstatus erfolgt nicht über Streams, sondern als periodisch ausgeführte Jobs (AssetHealthStatusDeployer / AssetConnectionStatusDeployer). Diese Ergebnisse werden über die Ansicht und API gemeldet. Wenn Sie Statusänderungen in EQL erfassen möchten, detektieren Sie das Ausbleiben von Daten von AssetEvent · AssetAlarm oder Point mittels eines not-Patterns.

Produktions-Domäne (3 Typen)​

StreamZeitpunkt des AuftretensHauptfelder
CalendarSchichtstart / -ende / -änderungshift_id, calendar_id, event, start_time, end_time
WorkOrderÜbergang im Lebenszyklus einer WorkOrderorder_id, status, prev_status, asset_id, product_id
OEEAktualisierung des OEE-Bewertungsergebnissesorder_id, asset_id, oee, availability, performance, quality

System-Domäne (2 Typen)​

StreamZeitpunkt des AuftretensHauptfelder
LogSystemdiagnosemeldungenmodule, level, code, summary, ts
OSPerformanceServer-OS-Ressourcenindikatoren (periodisch)CPU, Speicher, Festplatte etc.
Es gibt keinen Status-Stream

Ein Event-Typ namens Status ist nicht registriert. Wenn Sie Verbindungsstatusänderungen von OPC oder Edge mit EQL erfassen wollten, funktioniert dies nicht über diesen Stream — nutzen Sie stattdessen die Detektion des Ausbleibens von Point über ein not-Pattern.

Interne Streams (3 Typen)​

Diese sind registriert, dienen jedoch nicht der Regelerstellung, sondern der Diagnose und Health-Checks.

StreamVerwendungszweck
DateTimePeriodisch auftretende Zeit-Events (Trigger für zeitbasierte Regeln)
PingÜberprüfung der Engine-Verfügbarkeit
TestZur Regelvalidierung

Alle Streams müssen vor der Verwendung zwingend mit einem Window kombiniert werden (Point.win:time(1 sec)). Wenn Sie nur FROM Point ohne Window verwenden, verschwinden die Ergebnisse sofort und sind nicht sichtbar.


Windows​

Ein Window ist ein «aus dem Stream herausgeschnittener Abschnitt in Zeit oder Länge». EQL unterstützt zwei Arten von Windows.

Zeit-Windows (Time Window)​

SyntaxBedeutung
Point.win:time(1 sec)Alle Events der letzten 1 Sekunde (sliding)
Point.win:time(10 sec)Die letzten 10 Sekunden
Point.win:time(5 min)Die letzten 5 Minuten
Point.win:time(1 hour)Die letzte 1 Stunde

Unterstützte Zeiteinheiten: sec(Sekunden) · min(Minuten) · hour(Stunden) · day(Tage).

Längen-Windows (Length Window)​

SyntaxBedeutung
Point.win:length(100)Die letzten 100 Events
Point.win:length(1000)Die letzten 1.000 Events

Batch-Windows (Batch Window)​

win:time_batch / win:length_batch — Gibt ein Ergebnis nur in dem Moment aus, in dem das Window voll ist oder die Zeit abgelaufen ist. Reduziert den Ressourcenverbrauch.

-- 매 1분마다 한 번씩 그 1분간 평균을 emit
SELECT avg(value) FROM Point.win:time_batch(1 min) WHERE tag_id = 'MOTOR-001.TEMP'

Leitfaden zur Window-Auswahl​

SituationEmpfohlenes Window
Echtzeit-Überwachung (Werte an sich)win:time(1 sec)
Kurzzeit-Durchschnitt/Maximum (z.B. 5-Min-Schnitt)win:time(5 min)
Stündliche Aggregationwin:time_batch(1 hour)
Vergleich der letzten N Datensätzewin:length(N)
Verfolgung von Änderungsratenwin:length(2) + Funktion prev()

WHERE-Bedingungen​

Es werden die gleichen Vergleichsoperatoren wie in SQL verwendet.

OperatorBeispielBedeutung
= != <>tag_id = 'MOTOR-001'Gleich / Ungleich
< <= > >=value > 80Vergleich
BETWEENvalue BETWEEN 70 AND 90Bereich
INtag_id IN ('A','B','C')In Liste enthalten
LIKEtag_id LIKE 'MOTOR-%'Pattern Matching (Wildcard %)
IS NULL / IS NOT NULLquality IS NOT NULLnull-Prüfung
AND OR NOTvalue > 80 AND quality = 'GOOD'Logische Verknüpfung

Reguläre Ausdrücke​

SELECT * FROM Point.win:time(1 sec)
WHERE tag_id REGEXP '.*\\.TEMP$'

Matcht nur Tags, die mit .TEMP enden. Backslashes müssen doppelt (\\.) eingegeben werden.

Dynamischer Standort/Anlagen-Filter​

SELECT * FROM Point.win:time(1 sec)
WHERE site_id = 'SITE-A'
AND asset_id LIKE 'LINE-1.%'
AND value > 75

Aggregationsfunktionen​

Aggregiert Events innerhalb eines Windows.

Basis-Aggregationen​

FunktionBedeutungBeispiel
count(*)Anzahl der EventsSELECT count(*) FROM Point.win:time(10 sec)
sum(field)Summesum(value)
avg(field)Durchschnittavg(value)
min(field)Minimummin(value)
max(field)Maximummax(value)
median(field)Medianmedian(value)
stddev(field)Standardabweichungstddev(value)
variance(field)Varianzvariance(value)
first(field)Erster Wert im Windowfirst(value)
last(field)Letzter Wert im Windowlast(value)

DISTINCT-Aggregation​

SELECT count(distinct tag_id) AS unique_tags
FROM Point.win:time(1 min)

Kombination mit CASE​

SELECT
count(CASE WHEN value > 80 THEN 1 END) AS high_count,
count(CASE WHEN value <= 80 THEN 1 END) AS ok_count
FROM Point.win:time(1 min)
WHERE tag_id = 'MOTOR-001.TEMP'

Zeitreihenfunktionen​

FunktionBedeutungBeispiel
prev(N, field)Wert N Schritte zuvorvalue - prev(1, value) (Differenz zum vorherigen Wert)
prevwindow(field)Array aller vorherigen Werte im Windowprevwindow(value)
rate(field)Änderungsrate pro Zeiteinheitrate(value)

Gruppierung und Sortierung​

GROUP BY​

-- 자산별 최근 1분 평균 온도
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id

HAVING — Filter nach Aggregation​

-- 평균 > 80 인 자산만
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
HAVING avg(value) > 80

ORDER BY · LIMIT​

-- 가장 뜨거운 5개 자산
SELECT asset_id, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
ORDER BY peak DESC
LIMIT 5

LIMIT schließt nur die obersten N Datensätze zum Zeitpunkt der Ergebnisausgabe ein.


JOIN — Stream-Kombination​

Zwei oder mehr Streams können zeitlich ausgerichtet zusammengeführt werden.

-- 같은 자산에서 같은 시간대의 온도와 압력을 한 행으로
SELECT p1.value AS temp, p2.value AS pressure, p1.asset_id
FROM Point.win:time(1 sec) AS p1,
Point.win:time(1 sec) AS p2
WHERE p1.tag_id LIKE '%.TEMP'
AND p2.tag_id LIKE '%.PRESSURE'
AND p1.asset_id = p2.asset_id

Join von Anlagen-Events + WorkOrders​

SELECT e.asset_id, e.event_type, w.order_id, w.status
FROM AssetEvent.win:time(5 min) AS e,
WorkOrder.win:time(5 min) AS w
WHERE e.asset_id = w.asset_id
AND e.event_type = 'STARTUP'
AND w.status = 'START'

Ein Join-Ergebnis tritt nur auf, während sich die Zeit-Windows der beiden Streams überschneiden. Bei Daten mit unterschiedlichen Zeiteinheiten passen Sie diese mit win:time_batch auf einen ähnlichen Zyklus an.


Pattern Matching​

Eine leistungsstarke EQL-Funktion zur Definition von Sequenzen, wie «Event A tritt ein und innerhalb von N Sekunden tritt B (nicht) ein».

every — Jedes Mal matchen​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]

Matcht jedes Paar von Start-Event → Stop-Event innerhalb von 60 Sekunden. Detektiert abnormale Muster wie sofortigen Stop nach kurzem Betrieb.

not — Tritt während N Zeit nicht ein​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]

Matcht, wenn nach dem Start 30 Minuten lang keine Daten eingehen (Detektion nicht reagierender Anlagen).

and / or — Gleichzeitig oder eines von beiden​

SELECT * FROM pattern [
( every AssetAlarm(priority = 'ERROR') )
and
( every WorkOrder(status = 'START') )
]

Kernbegriffe des Pattern Matching​

SchlüsselwortBedeutung
every <e>Matcht jedes Mal, wenn e auftritt
e1 -> e2e2 folgt auf e1 (Sequenz-Match)
e1 and e2Beide Events treten auf (Reihenfolge egal)
e1 or e2Eines der beiden Events tritt auf
not ee tritt nicht auf
timer:within(<duration>)Matcht nur innerhalb der angegebenen Zeit
timer:interval(<duration>)Wartet die angegebene Zeit ab

Zeit- und Statusfunktionen​

Zeitfunktionen​

FunktionBedeutung
current_timestampAktuelle Zeit (ms)
current_date()Heutiges Datum (yyyy-MM-dd)
timestamp(field)Extrahiert Timestamp des Events
hour_of_day(ts)Stunde 0–23
day_of_week(ts)Wochentag 1(So)–7(Sa)
minute_of_hour(ts)Minute 0–59
dayofmonth(ts)Tag 1–31
-- 야간 (22시~6시) 발생 알람만
SELECT * FROM Alarm.win:time(1 hour)
WHERE hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6

Statusfunktionen​

FunktionBedeutung
tag('<tag_id>')Letzter Wert dieses Tags (PointMap-Kontext)
prev_status(asset_id)Vorheriger Zustand der Anlage
health(asset_id)Health-Status der Anlage (OK/WARN/ERROR/UNKNOWN)
is_in_shift(asset_id)Ob sich die Anlage innerhalb einer Schicht befindet

Arithmetische und String-Funktionen​

FunktionBedeutung
abs(x) / round(x, n) / floor(x) / ceil(x)Mathematik
pow(x, y)y-te Potenz von x
sqrt(x)Quadratwurzel
length(s)String-Länge
upper(s) / lower(s)Groß-/Kleinschreibung
substring(s, start, len)Teilstring
concat(a, b, ...)Verkettung

Variablen und Kontexte​

Variablen — Dynamische Schwellenwerte​

-- 변수 정의 (운영자가 화면에서 조정 가능)
create variable double max_temp = 80;

-- 변수 사용
SELECT * FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > max_temp

Variablenwerte können während des Betriebs geändert werden; alle EQL-Regeln verwenden sofort den neuen Wert.

Kontexte — Aktivierung basierend auf Zeit/Bedingung​

In der Platform sind häufig verwendete Kontexte vordefiniert, die direkt übernommen werden können.

KontextAktivierungsbedingung
EVERY_1_MINUTESJede 1 Minute
EVERY_5_MINUTESAlle 5 Minuten
EVERY_10_MINUTESAlle 10 Minuten
EVERY_30_MINUTESAlle 30 Minuten
EVERY_1_HOURSJede 1 Stunde
EVERY_3_HOURSAlle 3 Stunden
EVERY_6_HOURSAlle 6 Stunden
EVERY_12_HOURSAlle 12 Stunden
DAY_WORK_TIMEWerktage 09:00–18:00
-- 5분마다 한 번씩 평균 온도 emit (그 사이에는 결과가 안 옴)
context EVERY_5_MINUTES
SELECT avg(value) AS avg_temp
FROM Point.win:time(5 min)
WHERE tag_id = 'MOTOR-001.TEMP'
-- 주간 근무시간에만 평가
context DAY_WORK_TIME
SELECT * FROM AssetAlarm.win:time(1 sec)
WHERE priority = 'ERROR'

12 Praxisbeispiele​

Beispiel 1 — Echtzeit-Überwachung eines einzelnen Tags​

SELECT value, ts, quality
FROM Point.win:time(1 sec)
WHERE tag_id = 'MOTOR-001.SPEED'

Beispiel 2 — Sofortige Detektion von Schwellenwertüberschreitung​

SELECT tag_id, value, ts
FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > 90

Beispiel 3 — 5-Minuten-Schnitt pro Anlage (Ausgabe alle 5 Min)​

context EVERY_5_MINUTES
SELECT asset_id, avg(value) AS avg_temp, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id

Beispiel 4 — Änderungsrate (gegenüber vorherigem Wert)​

SELECT tag_id, value, value - prev(1, value) AS delta
FROM Point.win:length(2)
WHERE tag_id = 'TANK-001.LEVEL'

Beispiel 5 — Nur ERROR-Alarme in der Nachtschicht​

SELECT tag_id, priority, band_message, ts
FROM Alarm.win:time(1 sec)
WHERE priority = 'ERROR'
AND hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6

Beispiel 6 — Anlagen-Health-Übergang (OK → WARN)​

SELECT asset_id, status, prev_status, ts
FROM AssetHealthStatus.win:time(1 sec)
WHERE prev_status = 'OK' AND status = 'WARN'

Beispiel 7 — Niedrige OEE in WorkOrder​

SELECT order_id, asset_id, oee, availability, performance, quality
FROM OEE.win:time(1 sec)
WHERE oee < 0.6

Beispiel 8 — Detektion nicht reagierender Anlagen (30 Min)​

SELECT * FROM pattern [
every a = AssetData()
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]

Beispiel 9 — Sofortiger Stop nach Start (instabiler Betrieb)​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]

Beispiel 10 — Gleichzeitiger Vergleich mehrerer Tags (PointMap)​

SELECT
tag('MOTOR-001.TEMP') AS temp,
tag('MOTOR-001.PRESSURE') AS pressure,
tag('MOTOR-001.VIBRATION') AS vibration
FROM PointMap.win:time(1 sec)

Beispiel 11 — Stündliche kumulierte Produktion pro Linie​

context EVERY_1_HOURS
SELECT asset_id, sum(value) AS hourly_count
FROM AssetAggregation.win:time(1 hour)
WHERE agg_type = 'PRODUCED' AND asset_id LIKE 'LINE-%'
GROUP BY asset_id

Beispiel 12 — TOP 10 Anlagen mit den meisten Alarmen​

context EVERY_10_MINUTES
SELECT asset_id, count(*) AS alarm_count
FROM AssetAlarm.win:time(10 min)
GROUP BY asset_id
ORDER BY alarm_count DESC
LIMIT 10

Leitfaden zur Performance​

1. Window-Größe bewusst klein halten​

-- ❌ 나쁜 예 — 24시간을 메모리에 유지
SELECT avg(value) FROM Point.win:time(24 hour)

-- ✅ 좋은 예 — 1시간만 메모리에 유지 + context 로 emit 주기 분리
context EVERY_1_HOURS
SELECT avg(value) FROM Point.win:time(1 hour)

2. WHERE-Klausel nah an den Trigger setzen​

Statische Filter wie Tag-ID, Anlagen-ID oder Standort-ID sollten am Anfang der WHERE-Klausel stehen. Sie werden vor GROUP BY/HAVING bewertet.

3. Beidseitige Wildcards in LIKE '%...%' sind kostenintensiv​

-- ❌ 나쁜 예
WHERE tag_id LIKE '%TEMP%'

-- ✅ 좋은 예
WHERE tag_id LIKE '%.TEMP' -- 접미사 매칭만

4. Pattern Matching mit kurzen Windows verwenden​

Vergessen Sie nicht die Zeitbeschränker in pattern [ ... timer:within(<n-minutes>) ]. Unendliche Patterns belegen kontinuierlich Speicher.

5. Anpassung der Ergebnisausgabe-Frequenz​

Trennen Sie die EQL-Evaluierung (sekundlich) von der Ausgabe, indem Sie den Kontext context EVERY_N_MINUTES nutzen, um die Ausgabe nur alle N Minuten zu tätigen. Dies reduziert die Last auf nachfolgenden Systemen.


Häufig gestellte Fragen​

F. Ich habe eine EQL-Abfrage eingegeben, aber in der Ergebnisansicht erscheint nichts. A. Bitte prüfen Sie Folgendes: ① Haben Sie nur FROM Point verwendet? — Ein Window ist erforderlich (Point.win:time(1 sec)). ② Ist die WHERE-Bedingung zu eng gefasst, sodass kein Match erfolgt? ③ Haben Sie oben rechts auf die Schaltfläche ▶ Start gedrückt? ④ Befindet sich das Ergebnispanel im Zustand ⏸ Pause?

F. Was ist der Unterschied zu SQL? A. Der größte Unterschied ist das Konzept der Windows. Da EQL auf unendlichen Streams operiert, muss ein «Bereich» definiert werden. Darüber hinaus sind die Sequenzanalyse in pattern [ ... ] und Zeitkontexte in context Funktionen, die in SQL nicht existieren.

F. Was ist der Unterschied zwischen win:time(1 sec) und win:time_batch(1 sec)? A. win:time(1 sec) ist sliding — das Ergebnis wird bei jedem eingehenden Event aktualisiert. win:time_batch(1 sec) ist tumbling — Events werden in 1-Sekunden-Blöcken gebündelt und genau in dem Moment ausgegeben, in dem die Sekunde abläuft. Verwenden Sie Batch, wenn Sie exakt sekundliche Ergebnisse benötigen.

F. Was ist der Unterschied zwischen pattern [ ... ] und einem normalen SELECT ... WHERE ...? A. SELECT bewertet ein einzelnes Event (oder Window), während pattern eine Event-Sequenz bewertet (z.B. B folgt auf A, B ohne A). Verwenden Sie Pattern, wenn zeitliche Abläufe oder Kausalitäten wichtig sind.

F. Werden registrierte Variablen sofort übernommen? A. Ja. Wenn Sie den Wert einer mit create variable definierten Variable in der Ansicht ändern, verwenden alle bereits bereitgestellten EQL-Regeln ab der nächsten Auswertung den neuen Wert.

F. Wie sende ich EQL-Matching-Ergebnisse als Alarm? A. Registrieren Sie die EQL in CEP → Trigger und aktivieren Sie die Optionen «MQ Streaming» oder «Storage-Speicherung», oder registrieren Sie die EQL unter Alarm → EQL-Alarm.

F. Kann ich anlagenbezogene Regeln pauschal auf alle Anlagen anwenden? A. Definieren Sie die anlagenbezogene EQL-Regel in CEP → Statements und mappen Sie diese Regel im Modell/Ontologie auf eine Anlagenkategorie. Die Regel wird dann automatisch auf alle Anlagen derselben Kategorie angewendet und auch für neu hinzugefügte Anlagen übernommen.

F. Kann ich zwei Streams in einer EQL-Zeile gleichzeitig verarbeiten? A. Ja. Wie im Beispiel im Abschnitt JOIN gezeigt, listen Sie die beiden Streams in der FROM-Klausel mit Kommas auf und definieren die Join-Bedingung mittels WHERE.

F. Es werden zu viele Ergebnisse ausgegeben. A. Verwenden Sie LIMIT N, um nur die obersten N Ergebnisse zu erhalten, erhöhen Sie das Ausgabeintervall über context EVERY_N_MINUTES oder bündeln Sie die Daten mittels Batch-Windows über win:time_batch. Eine striktere WHERE-Klausel ist ebenfalls effektiv.

F. Wo kann ich das Schreiben von EQL üben? A. Die Ansicht CEP → Abfrage dient als EQL-Praxiswerkzeug. Geben Sie eine Zeile ein und drücken Sie ▶ Ausführen, um sofort Ergebnisse zu sehen. Kopieren Sie zum Starten die oben genannten 12 Praxisbeispiele.


Verwandte Ansichten​

  • CEP — Ansicht zur Erstellung von EQL-Abfragen/Triggern/Statements
  • Alarm → EQL-Alarm — Alarmierung bei beliebigen Bedingungen mittels EQL
  • Flow — EQL-Modus für flow_script_filter / flow_script_transform / flow_switch
  • Tag-Formular — KI-Tab — EQL-Bedingungen für Vorhersage- und Anomalieerkennungsregeln
  • Integrierte Domänen-ID-Suche — Schnelle Suche nach Tag-/Anlagen-IDs für EQL (Strg+K)