Logo UniControl S.A.S.

Manual Técnico de Ingeniería & Especificación

Guía oficial de arquitectura para la sintaxis de lógica secuencial, diseño autómata y compilación Ladder bajo norma IEC 61131-3 — UniControl S.A.S.

💡 1. Filosofía y Metodología IEC 61131-3

El desarrollo de lógica de control en PLCs industriales sufre habitualmente de acoplamiento directo y lógica desestructurada ("código spaghetti"), donde las entradas de campo activan directamente salidas físicas sin validar el estado operativo de la máquina.

La suite de control de UniControl S.A.S. impone la arquitectura estricta basada en Autómatas Finitos de Estado (FSM):

1
Modelado Topológico 2D (FSM Designer)

Modelar los estados físicos y operacionales de la máquina (ej: Standby, Llenado, Agitación, Descarga, Falla) y las vías de transición permitidas. En este nivel no se escribe código.

2
Implementación Booleana (Logic Designer)

Declarar el mapa de variables I/O y escribir las ecuaciones que rigen el salto entre estados, ordenadas por rigurosa prioridad de evaluación.

3
Aislamiento de Salidas ("Pass-Through Protection")

Las salidas físicas (válvulas, motores, bombas) NUNCA son accionadas directamente por sensores o pulsadores de campo. Se activan evaluando únicamente los Estados (ST_...), Transiciones (X_...) o Timers (t_...) del autómata.

Beneficio Industrial: Si un sensor mecánico de campo se traba en ON debido a una falla física, el PLC no encenderá el actuador a menos que la máquina se encuentre formalmente en el paso del proceso correspondiente.

🗺️ 2. FSM Designer (Manual Detallado del Editor 2D)

El diseñador FSM en fsm.html gestiona la geometría 2D, estados y transiciones del autómata.

2.1 Creación y Gestión de Estados

  • Crear Estado: Ingresa un ID numérico entero positivo (ej. 0, 10, 160) y el nombre representativo. Haz clic en +.
  • Estado Especial ANY (Parada Global/Emergencia): Al pulsar + ANY se crea el estado global ANY. Las transiciones que parten desde ANY aplican automáticamente como interrupciones o paradas de emergencia globales desde cualquier punto del autómata.
  • Interposición y Desplazamiento de IDs (Shift IDs): Si intentas registrar un ID ya existente (ej: ID 10), el sistema detecta el conflicto y te ofrece desplazar en +1 los estados contiguos (10..N a 11..N+1). Toda la matriz de transiciones se actualiza de forma transparente.

2.2 Transiciones y Recálculo Dinámico de Tags Canónicos

  • Tags Canónicos Deterministas: Cada transición posee el tag invariantemente formateado como X_[origen]_[destino] (ej. X_0_160).
  • Recálculo Dinámico Inmediato: Al mover, renumerar o desplazar IDs de estados, las etiquetas de transición se recalculan dinámicamente en tiempo real (t.label = X_${t.from}_${t.to}), eliminando permanentemente el problema de etiquetas "inerciales" o desfasadas.
  • Títulos Humanos Descriptivos: Puedes asignar un título representativo a cada transición (ej: Llenado de Tanque Principal) que se sincroniza automáticamente con Logic Designer y los diagramas Ladder.
  • Controles Deslizantes (Flecha, Texto, Curva): En la tabla lateral dispones de deslizadores para acomodar la posición de la flecha, la curvatura de transiciones bidireccionales y la altura del texto.

2.3 Desenredado Físico 🌀 y Motor Pathfinder

  • Algoritmo Desenredador 🌀 (`unentangleSingleTransition` / `runAutoUnentangle`): Ajusta iterativamente la física y curvatura de las flechas para evitar que las líneas de transición pisen o tapen las cajas de los estados.
  • Motor Pathfinder (Navegación de Rutas Neón): Selecciona 2 estados y presiona P o haz clic en Pathfinder. El sistema ejecutará una búsqueda BFS/Dijkstra y proyectará todas las rutas posibles al fondo del lienzo usando un gradiente HSL neón (de rojo a verde). La ruta más corta se marca por defecto y las transiciones desde el estado ANY se des-priorizan automáticamente para revelar el flujo del proceso principal.

3. Logic Designer (Variables & Ecuaciones Booleanas)

En logic_designer.html se implementan las ecuaciones matemáticas de control.

3.1 Declaración del Mapa I/O

  • di (Entradas Digitales): Declaración de pulsadores y detectores booleanos (ej. cmd_start, sensor_vacio).
  • ai (Entradas Analógicas): Variables continuas evaluadas mediante comparadores relacionales (>, <, >=, <=, ==, !=), por ejemplo: nivel_litros >= 1000.
  • ton (Temporizadores al Trabajo): Se definen especificando el Preset Time (ej. pt = 10s, 500ms). Su activación en las ecuaciones requiere la sintaxis estricta:
    nombre_timer@( condicion_activacion )
    Ejemplo: t_mezcla@( ST_3_Agitacion )
  • do (Salidas Digitales):
    • Salida Sostenida (`isTrigger: false`): Activa mientras la ecuación sea verdadera.
    • Salida de Pulso / Flanco (`isTrigger: true`): Compilada automáticamente con un relé de flanco de subida R_TRIG(...).
⚠️ Importante Sintaxis TON: La sintaxis binding timer@( condicion ) es requerida por el compilador AST para vincular el temporizador con la red Ladder correspondiente.

🚨 4. Array de Prioridades y Prevención de Race Conditions

Cuando desde un mismo estado divergente (ej: State 2 - Llenado) parten múltiples transiciones (ej: Abortar X_2_4, Timeout X_2_10, Nivel Completo X_2_3), se corre el riesgo de Condiciones de Carrera (Race Conditions) si varios eventos ocurren al mismo escaneo del PLC.

Formulación Matemática de Negaciones Inyectadas

El evaluador de prioridades ordena las transiciones de la posición $0$ (máxima prioridad) a la posición $K-1$. Para cualquier transición en el índice $k > 0$, el compilador expande e inyecta automáticamente prefijos de bloqueo `NOT (!)` sobre todas las transiciones superiores:

$$\text{FullEq}_k = \left( \bigwedge_{i=0}^{k-1} \neg \text{Label}_i \right) \land (\text{Eq}_k)$$

Ejemplo para la transición de Nivel Completo `X_2_3` (Prioridad 2), donde Abortar `X_2_4` es Prioridad 0 y Timeout `X_2_10` es Prioridad 1:

FullEq = !X_2_4 AND !X_2_10 AND ( nivel_litros >= 1000 )

Esto garantiza que si el operador pulsa Abortar al mismo instante en que se alcanzan los 1000L, el PLC ejecutará la orden de seguridad humana sin dudar.

🏷️ 5. Títulos Descriptivos Humanos vs Tags Canónicos

Para simplificar el mantenimiento sin alterar el determinismo matemático:

  • Tag Canónico Invariante: Mantiene la nomenclatura estricta X_[origen]_[destino] (ej. X_0_160) que vincula la FSM con la lógica.
  • Título Humano: En la barra del editor de ecuaciones, al lado del target, dispones del campo `Título / Nombre` (ej: Llenado de Tanque Principal).
  • El título se registra en data.logic.titles y se despliega en las tablas de trabajo, en los selectores de conciliación y en las cabeceras del diagrama Ladder.

🔄 6. Sistema de Conciliación Interactiva de FSM

Cuando un proyecto ha sufrido cambios estructurales en `fsm.html` (estados renumerados, transiciones agregadas o reorientadas) y se re-importa en `logic_designer.html`, el sistema inicia el flujo de **Conciliación Interactiva**.

Partición del Motor de Diff (`diffFSMData`):
  • Conservadas (Preserved): Transiciones cuyo par $from \rightarrow to$ coincide. Se conservan sus ecuaciones y títulos intactos.
  • Nuevas (Added): Transiciones introducidas en la nueva FSM.
  • Huérfanas (Orphaned): Ecuaciones escritas en el proyecto previo cuya transición fue modificada o removida en FSM.

En el modal Conciliación de Estructura FSM, el sistema calcula una matriz de similitud basada en nombres e IDs de estados y resalta las **Sugerencias Inteligentes (`💡 Sugerido`)**, permitiéndote re-asignar ecuaciones huérfanas a las nuevas transiciones con un solo clic o descartar ecuaciones obsoletas.

🪜 7. Compilador Ladder & Previsualización Real-Time

El motor parsea las ecuaciones booleanas en un Árbol de Sintaxis Abstracta (AST) y genera redes Ladder industriales.

  • Previsualización Real-Time Sin Recorte: En la parte inferior del editor de ecuaciones, la ventana redibuja instantáneamente la red SVG Ladder. Su contenedor utiliza alineación `align-items: flex-start` con scroll anclado a `scrollTop = 0`, eliminando el problema de recorte de píxeles en ramas `OR` complejas.
  • Formatos de Exportación:
    • 🪜 TXT: Esquema Ladder ASCII ideal para documentación rápida.
    • 🖼️ Visualizar / HTML: Documento vectorial interactivo listo para imprimir en A4.
    • 📊 CSV: Tabla estructurada para ingeniería de detalle.

🤖 8. UniCo-Pilot (Motor IA Integrado)

UniCo-Pilot es un agente de auditoría y asistencia que opera 100% en el navegador utilizando la API de Google Gemini (AI Studio).

  • Configuración Segura: Haz clic en ⚙️ e ingresa tu API Key personal. Selecciona entre modelos como Gemini 3.5 Flash o Gemini 3.1 Pro. Tu clave nunca abandona tu navegador.
  • Insights Silenciosos (`cp-insight-card`): Evalúa en segundo plano condiciones de bloqueo, interlocks faltantes o violaciones de la norma IEC 61131-3.
  • Acciones Rápidas: Auditoría de prioridades (`prio`), eliminación de pass-through (`passthrough`), amarres de seguridad (`interlocks`) y recomendación de temporizadores anti-rebote (`debounce`).

🏭 9. Guía de Transcripción a PLCs Industriales

Para implementar la lógica generada en plataformas de automatización comerciales:

9.1 Siemens TIA Portal (S7-1200 / S7-1500)

  1. Crea un Data Block global DB_FSM con una variable entero ActualState (INT).
  2. En un FC en lenguaje Ladder (LAD), crea un segmento (Network) por cada transición.
  3. Usa un bloque comparador CMP == para validar DB_FSM.ActualState == Origen. Agrega los contactos de entrada y las negaciones de prioridades superiores (`NOT`). En la bobina, asigna el salto de estado MOVE (Destino -> DB_FSM.ActualState).

9.2 Rockwell Studio 5000 (Logix5000)

  1. Define un Tag `DINT` denominado `Current_State`.
  2. En la rutina Ladder, usa la instrucción `EQU Current_State Origen` al inicio del Rung.
  3. Inserta las condiciones booleanas de la transición y finaliza con `MOV Destino Current_State`.

9.3 CODESYS / Schneider EcoStruxure Machine Expert

  1. Puedes implementar la estructura directamente en Texto Estructurado (`ST`) usando una sentencia `CASE Current_State OF` o en Diagrama de Funciones Secuenciales (`SFC` / Grafcet).

⌨️ 10. Cheatsheet Completa de Atajos de Teclado y Gestos

Entorno Atajo / Acción Función y Comportamiento
FSM Canvas Click + Drag (Fondo) Desplazar la cámara (Pan 2D)
FSM Canvas Rueda del Ratón Zoom in / Zoom out en el cursor
FSM Canvas Click + Drag (Nodo) Mover nodo de estado (magnético con Grilla ON)
FSM Canvas Shift / Ctrl + Click Selección múltiple de nodos para arrastre en grupo
FSM Canvas Enter (con 2 estados sel.) Crear instantáneamente una transición entre ambos estados
FSM Canvas P (con 2 estados sel.) Ejecutar herramienta Pathfinder (Rutas Neón)
FSM Canvas Delete / Supr Eliminar estados o transiciones seleccionadas
FSM Canvas Escape Limpiar selección o cancelar trazado de Pathfinder
FSM / Logic Ctrl + Z Deshacer cambio (Undo Trajectory Stack)
FSM / Logic Ctrl + Y / Ctrl + Shift + Z Rehacer cambio (Redo)

📦 11. Caso de Estudio Resuelto & Proyectos Descargables

📄 Requerimiento del Cliente (Pliego de Condiciones):
"Se requiere automatizar un tanque de mezcla batch. El proceso inicia desde un botón SCADA y debe validar que el tanque esté completamente vacío. Luego, abre válvulas de dosificación de dos productos hasta alcanzar 1000L. Al completar el nivel, mezcla durante 10 segundos y luego descarga el producto con una bomba de achique. El operador cuenta con botón de Abortar en todo momento. Si se selecciona la opción CIP, realiza un lavado automático de 15 segundos antes de retornar a reposo. El sistema debe contar con alarmas por timeout y parada de emergencia física."
⚙️ Solución Técnica Implementada:
  • Validación Inicial: Estado 0_Standby pasa a 1_Pre_Arranque al pulsar cmd_start. Sólo si sensor_vacio es verdadero transiciona a 2_Llenado.
  • Bifurcación Prioritaria en Llenado: Prioridad 0: Abortar (X_2_4), Prioridad 1: Timeout 30s (X_2_10), Prioridad 2: Nivel 1000L (X_2_3). El compilador inyecta los `NOT (!)` requeridos.
  • Estado Especial ANY: La parada de emergencia física salta desde ANY hacia 10_Falla_Proceso (X_ANY_10) activando la alarma sonora por flanco (`R_TRIG`).

Descarga de Proyectos de Ejemplo 100% Compatibles

Descarga los archivos oficiales de UniControl para cargarlos en los editores: