Zum Inhalt springen

Auslöser

Der Auslöser (Trigger) entscheidet, wann ein Skript läuft — und damit, ob eine Anlage um 03:00 Uhr angefasst wird, während niemand zusieht. Er steht in der Eigenschaftsspalte, mit einem erklärenden Satz unter der Auswahl.

Es gibt sieben Arten. Sechs lassen ein Skript laufen, die siebte sagt, dass es das nie tut.

Jeder Schreibvorgang auf eines der ausgewählten Tags ist eine Gelegenheit zu laufen — jeder einzelne, nicht jede Bildschirmaktualisierung. Wählen Sie mindestens ein Tag; sonst sieht das Skript eingerichtet aus und löst nie aus.

Drei Verfeinerungen, jede hinter einem Kästchen, alle standardmäßig aus:

Bedingung (Condition). Ein Vergleich gegen den Wert, zum Beispiel > 80. Ausgelöst wird in dem Moment, in dem die Bedingung wahr wird — nicht immer wieder, solange sie wahr bleibt. Eine Schwelle, die bei 81, 82 und 83 erneut feuert, ist keine Schwelle, sondern ein Datenstrom. Der Wert wird als JSON gelesen, wo das geht: 42 ist eine Zahl, true ein Wahrheitswert, alles andere Text. Anführungszeichen erzwingen Text.

Beruhigungszeit (Settle time). Bei einem zappelnden Wert ist der interessante Moment der, in dem er stehenbleibt. Ausgelöst wird, wenn sich so lange nichts mehr bewegt hat. Zwischen 50 ms und einer Stunde.

Gütewechsel (Quality change). Eine ausgefallene Quelle ändert keine Zahl — sie steht nur nicht mehr für sie ein. Damit wird auch das ein Ereignis: unbrauchbar geworden, wieder brauchbar geworden, oder beides.

In einem festen Takt, gezählt ab dem Scharfschalten — nicht ab der vollen Stunde. Zwischen 250 ms und 24 Stunden. Wer die Uhr will, nimmt Zeitplan.

Ein zyklisches Skript, das stehenbleibt, ist der leiseste Ausfall überhaupt: nichts meldet einen Fehler, kein Wert wird schlecht, der Anlage wird einfach nichts mehr gesagt. Der Watchdog hat zwei Hälften, und keine ersetzt die andere:

Herzschlag-Tag (Heartbeat tag). Jeder Lauf schreibt hier einen hochzählenden Wert. Eine SPS kann von außen zusehen und in den sicheren Zustand gehen, wenn die Zahl stehenbleibt. Diese Hälfte wirkt noch, wenn wir der Ausfall sind — ein hängender Dienst, ein toter Rechner.

Karenzzeit (Grace period). Kommt so lange kein Lauf zu Ende, wird das als Fehllauf ins Protokoll geschrieben. Diese Hälfte wirkt, wenn es der Instanz gut geht und dem Skript nicht: volle Warteschlange, ein Lauf, der bei jedem Takt hängt. Sie muss mindestens das Anderthalbfache des Takts betragen und nie weniger als 500 ms — enger meldet sie einen Fehllauf, sobald ein Lauf einmal etwas länger dauert.

Alarm-Tag (Alarm tag). Wird bei einem Fehllauf auf true gesetzt und beim nächsten abgeschlossenen Lauf wieder auf false. Es braucht eine Karenzzeit, sonst entscheidet nie jemand, dass ein Lauf fehlt.

Nach der Uhr, nach der die Anlage läuft: alle N Minuten, alle N Stunden zur Minute X, täglich um 06:00, an ausgewählten Wochentagen um 06:00. „Alle 15 Minuten” trifft :00, :15, :30, :45 — ein Takt zählt dagegen ab dem Scharfschalten.

Nur Minutenzahlen, die eine Stunde gleichmäßig teilen, sind erlaubt: 1, 2, 3, 5, 6, 10, 15, 20, 30. Sonst bliebe an der vollen Stunde ein kurzer Rest.

Dieselbe Uhr liest im Skript system.time.plant_now(). datetime.now() liest sie nicht — das ist die Zone der Maschine, auf der das Skript ausgeführt wird, und ein Skript, das um „06:00” startet und dann selbst nach der Uhrzeit fragt, rechnet sonst gegen seinen eigenen Auslöser.

Ein Lauf, der ausfällt, während die Instanz weg war, wird nicht nachgeholt. Er wird als verpasst protokolliert. Ein Sollwert für 08:00 darf nicht um 08:12 ankommen.

Etwas, das die Instanz selbst getan hat — nicht etwas, das ein Wert getan hat:

  • Die Instanz ist gestartet — nachdem die Verbindungen stehen, nie solange der Weg zu den Maschinen noch zu ist.
  • Die Instanz fährt herunter — bevor sie weg ist, solange Schreiben noch geht.
  • Eine Verbindung ist abgerissen — eine Quelle antwortet nicht mehr.
  • Eine Verbindung ist zurück — der Moment, Liegengebliebenes nachzuschicken.

Einmal für jede neue Datei in einem Ordner der Dateiablage — hochgeladen auf der Seite Dateien, von einer Maschine mit API-Token geschickt, vom Assistenten oder von einem anderen Skript geschrieben. Eine in den Ordner verschobene Datei gilt ebenfalls als angekommen. Das Skript bekommt die Datei als params["file_id"] (dazu params["folder"] und params["name"]).

  • Ordner — nur dieser Ordner, nicht die darunter; leer heißt oberste Ebene. Chat/, Users/ und Sessions/ sind nicht erlaubt: dort liegt, was einer Person oder einem Gespräch gehört, und das sehen Skripte nicht.
  • Namensmuster — optional, im Shell-Stil: *.zip, export-*.csv. Groß- und Kleinschreibung zählt nicht.

Einmal je Datei. Ein erfolgreicher Lauf wird vermerkt; dieselbe Datei geht nicht noch einmal an das Skript. Dateien, die ankommen, während die Instanz steht, werden beim Start abgeholt, und eine Datei, deren Signal verloren ging, wird binnen einer Minute gefunden. Ein gescheiterter Lauf wird nach einem Neustart oder nach dem nächsten Speichern des Skripts wiederholt — nicht jede Minute. Es zählen nur Dateien, die nach dem Anlegen des Skripts angekommen sind: wer einen Import für einen Ordner mit einem Jahr Lieferungen einschaltet, startet nicht ein Jahr Läufe — dafür das Skript von Hand starten.

Die Obergrenze an Läufen je Minute gilt wie bei jedem Auslöser. Machen Sie das Skript selbst zweifach-sicher mit system.file.claim() — siehe Die Skript-Schnittstelle.

Es läuft, wenn jemand auf Jetzt starten drückt. So wird ein Skript erprobt, bevor man ihm eine Maschine anvertraut.

Der Auslöser, der nie auslöst. Siehe Bibliotheken.

  • Der Schalter Eingeschaltet sagt nur dann, dass etwas von allein läuft, wenn diese Instanz überhaupt einen Auslöser-Kreislauf hat. Hat sie keinen, steht das auf der Seite: Skripte lassen sich dann bearbeiten und von Hand starten, mehr nicht.
  • Eine Kopie ist immer ausgeschaltet, egal was das Original war.
  • Eine Auslöser-Einstellung, die der Server ablehnen würde, wird schon beim Tippen unter dem betroffenen Feld beanstandet — mit der Zahl, die zulässig wäre.