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.

Ablauf der Ausführung
Das Skript exportiert Hooks. Jeder Hook ist optional: Ein Skript kann nur onResult exportieren oder nur subscriptions und onMessage.
| Hook | Lä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
| Global | Funktion |
|---|---|
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" |
subscriptions | Eine 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 |
state | Zwischenspeicher, 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, log | Dieselben 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:
stateund 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.
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
| Gruppe | Vorlagen |
|---|---|
| Ergebnisse publizieren | Jedes Ergebnis auf ein MQTT-Topic publizieren · Heartbeat per Timer publizieren |
| Daten von der Linie empfangen | JSON-RPC-Anfragen über MQTT beantworten · Ein Feld aus der JSON-Nachricht eines Anbieters in eine Variable kopieren |
| Produktion überwachen | OK und NG pro Schicht zählen und als CSV publizieren · Alarm auslösen nach aufeinanderfolgenden Ausschüssen |

// 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.
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.