Zum Hauptinhalt springen

KI-GESTÜTZTE DOKUMENTATION

Was möchten Sie wissen?

Kamera-Skript

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

  • an jedes MQTT-Topic publizieren, in Ihrem eigenen Format
  • Variablen setzen, die ein Rezeptskript lesen kann
  • Alarme auslösen, die in den Diagnoseprotokollen erscheinen
  • Timer ausführen und Zustand speichern, wie Zähler und zuletzt gesehene Werte

Es ändert niemals eine Beurteilung: Die Entscheidung über OK oder NG ist Aufgabe des Rezeptskripts. 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.

Kamera-Skript-Seite: Starten Sie mit einer Vorlage, einem leeren Skript oder einer Datei, mit dem Referenzpanel rechts

Wie es ausgeführt wird​

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

HookWird ausgeführt
onStart()Beim Laden des Skripts: nach einem Speichern, beim Einschalten und beim Start der Kamera. Timer starten und Zustand hier einrichten
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 in subscriptions oder einer Änderung der User Data der SPS
onTimer(name)Wenn ein Timer auslöst
onStop()Bevor eine neue Version übernimmt, wenn Sie das Skript abschalten 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 werden nacheinander ausgeführt, 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; wenn eine Warteschlange voll ist, 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 erneut nach einem await, nicht davor.

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

Fehler. Wenn ein Hook eine Exception 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 nutzen kann​

GlobalFunktion
mqtt.publish(topic, payload, opts?)Text, Bytes oder ein Objekt publizieren (als JSON gesendet). 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 von Topics, die abgehört werden, als String-Literale. + und # als Wildcards sind erlaubt
vars.get(name) / vars.set(name, value)Jede Variable lesen; nur solche 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
stateScratch-Speicher, der zwischen Ereignissen bestehen 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 Hilfsfunktionen wie im Rezeptskript

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. Nur das Rezeptskript kann das
  • Auf die Dateien der Kamera oder auf das Netzwerk außerhalb von MQTT zugreifen
  • Zustand über einen Reload oder Neustart hinweg erhalten: state und Timer beginnen von vorn
  • Eine Prüfung auslösen oder Rezepte umschalten. Das macht weiterhin die SPS und die HTTP API

Seine 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

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

Vorlagen​

GruppeVorlagen
Ergebnisse publizierenJedes Ergebnis an ein MQTT-Topic publizieren · Einen 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 · Einen Alarm nach aufeinanderfolgenden Ausschüssen auslösen

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 kürzlich erfasste Ergebnisse durch onStart, onResult und onStop ab und zeichnet jede Publikation, jeden Variablenschreibvorgang, Timer, Alarm und jede Log-Zeile auf, ohne tatsächlich etwas zu senden. Die kürzlich erfassten Ergebnisse werden im Speicher gehalten, sodass die Liste nach einem Neustart leer ist.

Prüfen Sie den Verbindungsstatus, bevor Sie publizieren

Sichern Sie Publikationen mit mqtt.status() === "connected" ab, wie es die Vorlagen tun, und verwenden Sie await oder fügen Sie .catch() hinzu. Eine Publikation, die fehlschlägt, ohne dass etwas darauf wartet, wird als Fehler protokolliert.

Weitere Themen​