Saltar al contenido principal

DOCUMENTACIÓN CON IA

¿Qué desea saber?

Script de Cámara

El script de cámara es un único script para toda la cámara. Reacciona a cada inspección finalizada y a los mensajes entrantes, y puede:

  • publicar en cualquier tópico 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 si una pieza aprueba o falla 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.

Página del Script de Cámara: comience desde una plantilla, un script en blanco o un archivo, con el panel de Referencia a la derecha

Cómo se ejecuta​

El script exporta hooks. Cada hook es opcional: un script puede exportar solo onResult, o solo subscriptions y onMessage.

HookSe ejecuta
onStart()Cuando se carga el script: después de guardar, cuando lo activa y cuando la cámara se inicia. 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 tópico de subscriptions, o un cambio en los User Data del PLC
onTimer(name)Cuando se dispara un temporizador
onStop()Antes de que una nueva versión tome el control, cuando desactiva el script y al apagar (no por 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 cuenta.

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 ejecuta más tiempo se detiene.

Fallos. Cuando un hook arroja un error o se detiene, el error aparece en el Registro del script y como una alerta, las llamadas que inició se cancelan y el siguiente evento se ejecuta normalmente.

Qué puede utilizar​

GlobalQué 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 de MQTT v5 content_type, response_topic, correlation_data, user_properties, message_expiry_s
mqtt.status()"disabled", "connecting", "connected" o "disconnected"
subscriptionsUna lista de tópicos a 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, de al menos 100 ms
alert.raise(title, detail?)Genera una alerta. El mismo título se genera como máximo una vez por minuto
stateMemoria temporal que persiste entre eventos, hasta que el script se recarga
csv(rows), xml.build(), xml.parse()Construya texto CSV, y construya o analice XML
pack, unpack, crc, logLos 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 y reason finales, 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 en los User Results del PLC. Solo el script de receta puede hacerlo
  • Acceder a los archivos de la cámara, o a la red salvo a través de MQTT
  • Mantener el estado entre una recarga o un reinicio: state y los temporizadores comienzan de nuevo
  • Disparar una inspección o cambiar de receta. El PLC y la HTTP API siguen haciendo eso

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 registro por segundo y 10 títulos de alerta por minuto.

Los reinicios de memoria borran el estado

Si el script se queda sin memoria, se reinicia: state y los temporizadores se borran y onStart se ejecuta de nuevo. Mantenga state pequeño, por ejemplo, conteos en lugar de listas de cada resultado.

Plantillas​

GrupoPlantillas
Publicar resultadosPublicar cada resultado en un tópico MQTT · Publicar un heartbeat en un temporizador
Recibir datos de la líneaResponder solicitudes JSON-RPC a través de MQTT · Copiar un campo de un mensaje JSON de un proveedor en una variable
Monitorear la producciónContar aprobados y fallos por turno y publicar un CSV · Generar una alerta después de rechazos consecutivos

Galería de Plantillas del script de cámara

// 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 (Dry run)​

Test ejecuta su borrador como una ejecución en seco (dry run): 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 registro sin enviar nada. Los resultados recientes se guardan en memoria, por lo que la lista estará vacía después de un reinicio.

Verifique qué está conectado antes de publicar

Proteja las publicaciones con mqtt.status() === "connected", como lo hacen las plantillas, y use await con ellas o agregue .catch(). Una publicación que falla sin nada esperándola se registra como un error.

A dónde ir después​