Desarrolladores/Fundamentos

Formato de proyecto

Referencia de los documentos JSON v1 — manifest, tipos, variables, conexiones y pantallas.

4 min de lectura

Todos los documentos son JSON UTF-8 sin comentarios. Los nombres de pantallas y faceplates son nombres de archivo sin extensión.

Manifest

El archivo principal es <Nombre>.abscada (los proyectos antiguos usan project.json):

{"schema_version": 1, "name": "Planta", "startup_screen": "main",
 "screen_folders": ["Proceso", "Proceso/Bombeo"],
 "screen_defaults": {"width": 1920, "height": 1080},
 "display": {"main": {"mode": "maximized", "scale": "fit"}}}
Clave Uso
screen_folders Carpetas de pantallas, también vacías (solo Studio)
screen_defaults Tamaño propuesto para pantallas nuevas
display.main.mode normal, maximized (por defecto) o fullscreen
display.main.scale fit (proporción, por defecto), stretch (rellenar) o none (tamaño real)

Las versiones de esquema desconocidas se rechazan; las migraciones serán explícitas.

Tipos

{"Pump": {"running": "bool", "flow": "float", "setpoint": "float"}}

Primitivos: bool, int, float, string. Los campos pueden usar otros tipos; se prohíben ciclos. No hay arrays en v1.

Variables

[
  {"name": "Level", "type": "float", "initial": 0.0, "writable": false,
   "binding": {"connection": "plc", "address": "%DB1.DBD12"}},
  {"name": "Pump1", "type": "Pump",
   "initial": {"running": false, "flow": 0.0, "setpoint": 60.0},
   "writable": true,
   "overrides": {"flow": {"writable": false}},
   "bindings": {
     "Pump1.running": {"connection": "plc", "address": "%DB1.DBX0.0"},
     "Pump1.flow": {"connection": "plc", "address": "%DB1.DBD4"}
   }}
]
  • initial de una estructura debe contener exactamente sus campos.
  • bindings usa nombres completos; overrides rutas relativas.
  • Sin enlace, el campo es interno. writable es false por defecto.

Conexiones

[
  {"id": "plc", "protocol": "s7", "host": "192.168.1.10",
   "rack": 0, "slot": 1, "port": 102, "poll_ms": 250},
  {"id": "meter", "protocol": "modbus_tcp", "host": "192.168.1.20",
   "port": 502, "unit_id": 1, "poll_ms": 1000}
]

Pantallas

{"width": 1280, "height": 720, "background": "#0f172a",
 "on_open": ["screen_open"],
 "elements": [
   {"id": "level", "kind": "text", "x": 20, "y": 20, "w": 180, "h": 45,
    "text": "Nivel ", "tag": "Level", "unit": "%", "decimals": 1},
   {"id": "start", "kind": "button", "x": 20, "y": 80, "w": 140, "h": 44,
    "text": "Marcha", "tag": "Pump1.running", "action": "toggle"}
 ]}

El orden de elements es el orden de dibujo: los últimos quedan encima. folder (opcional) es la carpeta en Studio, p. ej. "Proceso/Bombeo". Un layout es una pantalla con contenedores screen_container; la antigua marca "layout": true se migra a la carpeta Layouts.

Otros documentos

Archivo Contenido
alarms.json Categorías y definiciones de alarma
alarm_views.json Configuración de cada visor de alarmas (una por control)
historian.json Ficheros de registro y retención
trends.json Configuración de cada tendencia (una por control)
automation.json Scripts de inicio, timeout y tareas
libraries.json Bibliotecas vinculadas con su huella

Consulta faceplates para el catálogo completo de elementos y propiedades.

Seguridad y OPC UA

security.json contiene política y roles; users.json, cuentas y hashes scrypt; secrets.json, contraseñas de conexión en base64 (no cifradas); opcua_server.json, configuración del servidor; pki/, certificados y claves. Las cuentas y secretos se actualizan inmediatamente. Los archivos antiguos en runtime/ se migran cuando no existe su destino en el proyecto. Protege estos datos al copiar o versionar un proyecto.

La conexión protocol: "opcua" guarda endpoint, seguridad y usuario; el enlace identifica el NodeId. El manifiesto admite library_folders para organizar objetos de librería; folder en la plantilla indica su ubicación en Studio. Los controles conservan kind: "faceplate". Consulta OPC UA y Usuarios y roles.

Textos multilingües

El manifiesto declara los idiomas y cómo se elige el idioma inicial:

{"schema_version": 1, "name": "Planta", "startup_screen": "main",
 "languages": ["es", "en"], "default_language": "es", "initial_language": "project"}

initial_language admite project, station y user. Los proyectos antiguos sin estos campos conservan el español y sus cadenas.

Las propiedades de texto admiten una cadena o un mapa de traducciones:

{"id": "title", "kind": "text", "text": {"es": "Sala de cocción", "en": "Brewhouse"}}

Se admite en text, title, message, default_text, disabled_reason, tooltip y description; las categorías de alarma lo usan en name. El mapa debe incluir el idioma por defecto, usar idiomas declarados y contener cadenas. Una traducción ausente o vacía utiliza el idioma por defecto.

Un botón cambia el idioma durante la ejecución:

{"id": "english", "kind": "button", "text": "EN", "action": "set_language", "language": "en"}

Las bibliotecas publicadas incluyen languages y default_language; el consumidor debe declarar los idiomas de sus objetos vinculados. Consulta Idiomas del proyecto.