Zum Hauptinhalt springen

KI-GESTÜTZTE DOKUMENTATION

Was möchten Sie wissen?

Kamera-Skript

Das Kamera-Skript ist ein einzelnes Skript für die gesamte Kamera. Es reagiert auf jede abgeschlossene Prüfung und auf eingehende Nachrichten und kann:

  • auf beliebige MQTT-Topics publizieren, in Ihrem eigenen Format
  • Variablen setzen, damit ein Rezept-Skript sie lesen kann
  • Alarme auslösen, die in den Diagnoseprotokollen erscheinen
  • Timer ausführen und Zustände speichern, etwa Zähler und zuletzt gesehene Werte

Es ändert niemals eine Beurteilung: Die Entscheidung über OK oder NG ist Aufgabe des Rezept-Skripts. Es läuft über Rezeptwechsel hinweg weiter.

Öffnen Sie Integration > Camera Script. Es läuft nichts, bis Sie das Skript einschalten, sodass Sie es zuerst schreiben und testen können.

Seite Camera Script: Start aus einer Vorlage, einem leeren Skript oder einer Datei, mit dem Referenz-Panel auf der rechten Seite

Ablauf der Ausführung​

Das Skript exportiert Hooks. Jeder Hook ist optional: Ein Skript kann nur onResult exportieren oder nur subscriptions und onMessage.

HookLäuft
onStart()Wenn das Skript geladen wird: nach einem Speichern, beim Einschalten und beim Start der Kamera. Starten Sie hier Timer und initialisieren Sie den Zustand
onResult(result)Nach jeder Prüfung im Produktionsmodus. Exportieren Sie options = { setup_results: true }, um auch Ergebnisse aus dem Einrichtungsmodus zu erhalten
onMessage(msg)Bei einer Nachricht auf einem Topic aus subscriptions oder einer Änderung der User Data der SPS
onTimer(name)Wenn ein Timer auslöst
onStop()Bevor eine neue Version übernimmt, beim Ausschalten des Skripts und beim Herunterfahren (nicht bei Stromausfall)

export const subscriptions = ["plant/line3/cmd"]; // MQTT topics this script listens on

export function onStart() {

state.results = 0;
timers.set("heartbeat", 30 * 1000, { repeat: true });
}

export function onResult(result) {

state.results = Number(state.results ?? 0) + 1;
}

export async function onTimer(name) {

if (name !== "heartbeat" || mqtt.status() !== "connected") return;
await mqtt.publish("plant/line3/alive", { alive: true, results: state.results }, { qos: 0 });
}

Eins nach dem anderen. Hooks laufen nacheinander, sodass sich der Zustand nie ändert, während ein Hook läuft. Neue Ereignisse warten in einer Warteschlange von bis zu 64 Ergebnissen und 256 Nachrichten; ist eine Warteschlange voll, wird das älteste Ereignis verworfen und gezählt.

Awaiting. Während ein Hook auf mqtt.publish oder vars.set wartet, kann der Hook des nächsten Ereignisses laufen. Lesen Sie state nach einem await erneut, nicht davor.

Zeit. Ein Hook hat 1 Sekunde bis zu seinem ersten await und 50 ms für jeden weiteren Abschnitt danach. Ein Hook, der länger läuft, wird gestoppt.

Fehler. Wenn ein Hook einen Fehler wirft oder gestoppt wird, erscheint der Fehler im Log des Skripts und als Alarm, die von ihm gestarteten Aufrufe werden abgebrochen, und das nächste Ereignis läuft wie gewohnt.

Was es verwenden kann​

GlobalFunktion
mqtt.publish(topic, payload, opts?)Text, Bytes oder ein Objekt (als JSON gesendet) publizieren. Optionen: qos (0, 1 oder 2), retain und die MQTT-v5-Eigenschaften content_type, response_topic, correlation_data, user_properties, message_expiry_s
mqtt.status()"disabled", "connecting", "connected" oder "disconnected"
subscriptionsEine Liste der zu abonnierenden Topics als String-Literale. +- und #-Wildcards sind erlaubt
vars.get(name) / vars.set(name, value)Jede Variable lesen; diejenigen setzen, deren Quelle Camera script ist
timers.set(name, ms, { repeat }) / timers.clear(name)Benannte Timer, mindestens 100 ms
alert.raise(title, detail?)Einen Alarm auslösen. Derselbe Titel wird höchstens einmal pro Minute ausgelöst
stateZwischenspeicher, der zwischen Ereignissen erhalten bleibt, bis das Skript neu geladen wird
csv(rows), xml.build(), xml.parse()CSV-Text erzeugen sowie XML erzeugen oder parsen
pack, unpack, crc, logDieselben Helfer wie im Rezept-Skript

result in onResult hat dieselbe Struktur wie eine Ergebnisnachricht: das Rezept, den Trigger, die endgültige judgment und reason, das Ergebnis jedes Tools, vars, metadata, tags, image.url und mehr. Siehe MQTT.

Was ein Kamera-Skript nicht kann​

  • Eine Beurteilung ändern oder User Results der SPS schreiben. Das kann nur das Rezept-Skript
  • Auf die Dateien der Kamera oder das Netzwerk außer über MQTT zugreifen
  • Zustände über ein Neuladen oder einen Neustart hinweg erhalten: state und Timer beginnen von neuem
  • Eine Prüfung auslösen oder Rezepte wechseln. Das übernehmen weiterhin die SPS und die HTTP API

Grenzen: 16 MiB Speicher inklusive state, bis zu 16 laufende Aufrufe, 32 Timer, 256 KiB pro empfangener MQTT-Nachricht, 50 Log-Zeilen pro Sekunde und 10 Alarmtitel pro Minute.

Speicher-Resets löschen den Zustand

Geht dem Skript der Speicher aus, wird es zurückgesetzt: state und Timer werden gelöscht und onStart läuft erneut. Halten Sie state klein, zum Beispiel Zählwerte statt Listen jedes Ergebnisses.

Vorlagen​

GruppeVorlagen
Ergebnisse publizierenJedes Ergebnis auf ein MQTT-Topic publizieren · Heartbeat per Timer publizieren
Daten von der Linie empfangenJSON-RPC-Anfragen über MQTT beantworten · Ein Feld aus der JSON-Nachricht eines Anbieters in eine Variable kopieren
Produktion überwachenOK und NG pro Schicht zählen und als CSV publizieren · Alarm auslösen nach aufeinanderfolgenden Ausschüssen

Vorlagengalerie des Kamera-Skripts

// Raise an alert after consecutive rejects

export function onResult(result) {

state.streak = result.judgment === "fail" ? Number(state.streak ?? 0) + 1 : 0;
if (state.streak === 3) {
alert.raise("Reject streak", {
streak: state.streak,
recipe: result.recipe.name,
reason: result.reason,
});
}
}

Dry Run​

Test führt Ihren Entwurf als Dry Run aus: Er spielt aktuelle Ergebnisse durch onStart, onResult und onStop erneut ab und zeichnet jede Publikation, jedes Variablenschreiben, jeden Timer, jeden Alarm und jede Log-Zeile auf, ohne tatsächlich etwas zu senden. Die aktuellen Ergebnisse werden im Speicher gehalten, daher ist die Liste nach einem Neustart leer.

Vor dem Publizieren prüfen, was verbunden ist

Schützen Sie Publikationen mit mqtt.status() === "connected", wie es die Vorlagen tun, und verwenden Sie await oder fügen Sie .catch() hinzu. Eine Publikation, die fehlschlägt und auf die nichts wartet, wird als Fehler protokolliert.

Wie geht es weiter​