DOCUMENTACIÓN CON IA
¿Qué desea saber?
Script de la Cámara
El script de la cámara es un script para toda la cámara. Reacciona a cada inspección finalizada y a los mensajes entrantes, y puede:
- publicar en cualquier topic MQTT, en su propio formato
- establecer variables, para que un script de receta las lea
- generar alertas, que aparecen en Registros de Diagnóstico
- ejecutar temporizadores y mantener el estado, como contadores y los últimos valores observados
Nunca cambia un veredicto: decidir aprobado o fallo es tarea del script de receta. Sigue ejecutándose durante los cambios de receta.
Abra Integration > Camera Script. Nada se ejecuta hasta que active el script, por lo que puede escribirlo y probarlo primero.

Cómo se ejecuta
El script exporta hooks. Cada hook es opcional: un script puede exportar solo onResult, o solo subscriptions y onMessage.
| Hook | Se ejecuta |
|---|---|
onStart() | Cuando el script se carga: después de guardar, al activarlo y cuando la cámara arranca. Inicie temporizadores y configure el estado aquí |
onResult(result) | Después de cada inspección en Producción. Exporte options = { setup_results: true } para obtener también los resultados de Configuración |
onMessage(msg) | Para un mensaje en un topic en subscriptions, o un cambio en los User Data del PLC |
onTimer(name) | Cuando se activa un temporizador |
onStop() | Antes de que una nueva versión tome el control, cuando desactive el script y al apagarse (no en caso de pérdida de energía) |
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 });
}
Uno a la vez. Los hooks se ejecutan uno a la vez, por lo que el estado nunca cambia mientras un hook está en ejecución. Los nuevos eventos esperan en una cola de hasta 64 resultados y 256 mensajes; cuando una cola está llena, el evento más antiguo se descarta y se contabiliza.
Awaiting. Mientras un hook espera mqtt.publish o vars.set, el hook del siguiente evento puede ejecutarse. Lea state nuevamente después de un await, no antes.
Tiempo. Un hook tiene 1 segundo hasta su primer await, y 50 ms por cada parte posterior. Un hook que se ejecute por más tiempo se detiene.
Fallos. Cuando un hook lanza una excepción o se detiene, el error aparece en el Log del script y como una alerta, las llamadas que inició se cancelan, y el siguiente evento se ejecuta normalmente.
Qué puede usar
| Global | Qué hace |
|---|---|
mqtt.publish(topic, payload, opts?) | Publica texto, bytes o un objeto (enviado como JSON). Opciones: qos (0, 1 o 2), retain, y las propiedades MQTT v5 content_type, response_topic, correlation_data, user_properties, message_expiry_s |
mqtt.status() | "disabled", "connecting", "connected" o "disconnected" |
subscriptions | Una lista de topics para escuchar, como literales de cadena. Se permiten los comodines + y # |
vars.get(name) / vars.set(name, value) | Lea cualquier variable; establezca aquellas cuya fuente sea Camera script |
timers.set(name, ms, { repeat }) / timers.clear(name) | Temporizadores con nombre, al menos 100 ms |
alert.raise(title, detail?) | Genera una alerta. El mismo título se genera como máximo una vez por minuto |
state | Memoria de trabajo que persiste entre eventos, hasta que el script se recarga |
csv(rows), xml.build(), xml.parse() | Construye texto CSV, y construye o analiza XML |
pack, unpack, crc, log | Los mismos helpers que el script de receta |
result en onResult tiene la misma estructura que un mensaje de resultado: la receta, el disparo, el judgment final y la reason, el resultado de cada herramienta, vars, metadata, tags, image.url y más. Consulte MQTT.
Qué no puede hacer un script de cámara
- Cambiar un veredicto o escribir los User Results del PLC. Solo el script de receta puede hacerlo
- Acceder a los archivos de la cámara, o a la red fuera de MQTT
- Mantener el estado entre una recarga o un reinicio:
statey los temporizadores comienzan de nuevo - Disparar una inspección o cambiar de receta. El PLC y la API HTTP siguen haciéndolo
Sus límites: 16 MiB de memoria incluyendo state, hasta 16 llamadas en curso, 32 temporizadores, 256 KiB por mensaje MQTT recibido, 50 líneas de log por segundo, y 10 títulos de alerta por minuto.
Si el script se queda sin memoria, se reinicia: state y los temporizadores se borran y onStart se ejecuta nuevamente. Mantenga state pequeño, por ejemplo conteos en lugar de listas de cada resultado.
Plantillas
| Grupo | Plantillas |
|---|---|
| Publicar resultados | Publicar cada resultado en un topic MQTT · Publicar un heartbeat en un temporizador |
| Recibir datos desde la línea | Responder solicitudes JSON-RPC sobre MQTT · Copiar un campo de un mensaje JSON de un proveedor en una variable |
| Monitorear producción | Contar aprobados y fallos por turno y publicar un CSV · Generar una alerta después de rechazos consecutivos |

// 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,
});
}
}
Ejecución en seco
Test ejecuta su borrador como una ejecución en seco: reproduce los resultados recientes a través de onStart, onResult y onStop, y registra cada publicación, escritura de variable, temporizador, alerta y línea de log sin enviar nada. Los resultados recientes se mantienen en memoria, por lo que la lista estará vacía después de un reinicio.
Proteja las publicaciones con mqtt.status() === "connected", como lo hacen las plantillas, y utilice await o agregue .catch(). Una publicación que falla sin nada esperándola se registra como un error.