Saltar al contenido principal

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.

Página del Script de la Cámara: inicie 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 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​

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 MQTT v5 content_type, response_topic, correlation_data, user_properties, message_expiry_s
mqtt.status()"disabled", "connecting", "connected" o "disconnected"
subscriptionsUna 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
stateMemoria 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, 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 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: state y 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.

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 nuevamente. Mantenga state pequeño, por ejemplo conteos en lugar de listas de cada resultado.

Plantillas​

GrupoPlantillas
Publicar resultadosPublicar cada resultado en un topic MQTT · Publicar un heartbeat en un temporizador
Recibir datos desde la líneaResponder solicitudes JSON-RPC sobre MQTT · Copiar un campo de un mensaje JSON de un proveedor en una variable
Monitorear 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​

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.

Verifique qué está conectado antes de publicar

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.

A dónde ir después​