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.

Wie es ausgeführt wird
Das Skript exportiert Hooks. Jeder Hook ist optional: Ein Skript kann nur onResult oder nur subscriptions und onMessage exportieren.
| Hook | Wird 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
| Global | Funktion |
|---|---|
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" |
subscriptions | Eine 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 |
state | Scratch-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, log | Dieselben 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:
stateund 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.
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
| Gruppe | Vorlagen |
|---|---|
| Ergebnisse publizieren | Jedes Ergebnis an ein MQTT-Topic publizieren · Einen 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 · Einen Alarm nach aufeinanderfolgenden Ausschüssen auslösen |

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