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"}
}}
]
initialde una estructura debe contener exactamente sus campos.bindingsusa nombres completos;overridesrutas relativas.- Sin enlace, el campo es interno.
writableesfalsepor 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.