Desarrolladores/Programación

Scripts Python

API ctx, eventos de inicio, apertura de pantalla, botones y tareas periódicas.

2 min de lectura

Los scripts son archivos scripts/<nombre>.py del proyecto. Se editan en Studio (Scripts y tareas), con resaltado y comprobación de sintaxis, o desde un editor externo.

Eventos

Evento ctx.event Cuándo
Inicio startup Una vez al arrancar el Runtime, en el orden configurado
Apertura de pantalla screen_open Al abrir o navegar a la pantalla
Botón button Acción Ejecutar script
Tarea cíclica task:<id> Cada periodo, tras terminar la ejecución anterior

API ctx

# Instantánea coherente tomada al empezar esta ejecución.
if ctx.quality("Pump1.running") == "good":
    running = ctx.read("Pump1.running")
    print(f"Bomba 1: {running}")

# Estado persistente entre ejecuciones de este script, mientras dure el Runtime.
ctx.state["executions"] = ctx.state.get("executions", 0) + 1

# Solicitar una escritura; se valida y aplica al terminar sin errores.
if ctx.read("Tank.level") > 90.0:
    ctx.write("Pump1.setpoint", 50.0)
Miembro Descripción
ctx.read(nombre) Valor; lanza error si la calidad no es good
ctx.quality(nombre) good, uncertain o bad
ctx.write(nombre, valor) Encola una escritura (máx. 1000 por ejecución)
ctx.state Diccionario JSON serializable por script
ctx.event Evento que disparó la ejecución
ctx.screen Pantalla de origen; vacío en inicio y tareas

Si el script lanza una excepción, sus escrituras y cambios de ctx.state se descartan. print() y los errores aparecen en Ejecuciones.

Configuración

{
  "startup": ["startup"],
  "timeout_seconds": 10,
  "tasks": [
    {"id": "quality", "script": "check_quality", "interval_ms": 5000, "enabled": true}
  ]
}

Se guarda en automation.json. Una pantalla añade "on_open": ["screen_open"]; un botón "action": "script", "script": "nombre".

Ejecución

  • Cada ejecución usa un proceso Python nuevo, con límite de 0,1 a 300 s (10 por defecto).
  • Los eventos se serializan: un script lento retrasa a otros, pero no bloquea Qt ni la adquisición.
  • Las tareas no se solapan ni recuperan periodos perdidos.

Código de confianza

El proceso separado permite cancelar, pero no es una sandbox. Los scripts tienen los permisos del usuario y pueden importar cualquier biblioteca instalada.

Ejemplo: contador de arranques

# scripts/count_starts.py — tarea cada 1000 ms
running = ctx.read("Pump1.running")
was_running = ctx.state.get("was_running", False)
if running and not was_running:
    ctx.write("Pump1.starts", ctx.read("Pump1.starts") + 1)
ctx.state["was_running"] = running

Idioma del runtime

ctx.language devuelve el idioma actual. ctx.set_language() acepta un idioma declarado en el proyecto y aplica el cambio cuando el script termina correctamente y se validan sus órdenes.

if ctx.language == "es":
    ctx.set_language("en")