## FB: `BlenderCtrl__Main` Este Bloque de Función parece ser el **orquestador central** del sistema Mixer/Starblend. ### Rol Principal - Gestionar el **estado operativo general** de la máquina (Parado, Listo, Producción, CIP, Fallo, Emergencia). - Coordinar la activación y desactivación de los sub-sistemas principales (`BlenderRun__Control` para producción, `CIPMain` para limpieza). - Actuar como punto central para los **comandos del operador** (HMI) y las **señales de interfaz** externas (Llenadora, Sala Jarabes). - Consolidar y gestionar las **condiciones de fallo críticas** del sistema. ### Entradas / Salidas Probables (Interfaz del FB) - **Entradas (`VAR_INPUT`):** - Comandos desde HMI (Ej. `StartCmd`, `StopCmd`, `ResetCmd`, `SelectModeCmd` - Podrían venir de `HMI_DB` o un UDT `HMI_Commands`). - Estado de Emergencia (`EmergencyStopActive`). - Feedback de estado de bloques subordinados (Ej. `RunControl_Status`, `CIP_Status`, `CriticalFault`). - Señales de habilitación o petición de interfaces externas (Ej. `Filler_Ready`, `SyrupRoom_Available`). - Parámetros de configuración relevantes (si no se leen directamente de `Configuration_DB`). - **Salidas (`VAR_OUTPUT`):** - Estado general de la máquina (Ej. `MachineState`, `IsRunning`, `IsStopped`, `IsInCIP`, `IsInFault`). Enviado a `Status_DB` / `HMI_Status`. - Comandos de habilitación/control para bloques subordinados (Ej. `EnableRunControl`, `EnableCIP`, `ResetSubsystems`). - Indicaciones de estado para HMI y interfaces externas (Ej. `BlenderReadyForFiller`, `AlarmActive`). - Señales de control para actuadores globales si los hubiera (poco común, usualmente se delega). ### Lógica Interna Inferida (`VAR` / `VAR_TEMP` / Lógica SCL) - **Máquina de Estados:** El núcleo del FB será probablemente una máquina de estados implementada con una variable (`STAT`) tipo `INT` o `ENUM` y una estructura `CASE` en SCL. Cada estado (`Idle`, `Ready`, `Production`, `CIP`, `Fault`, etc.) define: - Las acciones a realizar *dentro* de ese estado (ej. mantener habilitado `BlenderRun__Control`). - Las condiciones (basadas en entradas y estados internos) para *transicionar* a otros estados. - **Gestión de Modos:** Lógica para seleccionar entre `Producción` y `CIP`, asegurando que solo uno esté activo y gestionando las transiciones seguras entre ellos. - **Coordinación de Bloques:** Llamadas a las instancias de los FBs subordinados (`BlenderRun__Control`, `CIPMain_Path`, `CIPMain_Flood`, `PumpsControl`, etc.), pasando los comandos y recibiendo el feedback necesario según el estado actual. - **Manejo de Fallos:** Agregación de señales de fallo (`Fault`) desde múltiples fuentes. Lógica para determinar si un fallo es crítico y debe detener la operación, llevando la máquina al estado `Fault`. Implementación de la lógica de `Reset`. - **Gestión de Totalizadores:** Las variables `mResetProductTotTmr` y `mResetTotalizerTmr` indican que este FB contiene la lógica para iniciar el reseteo de los totalizadores (posiblemente activando un temporizador o directamente llamando a una función/método en `TotalizerCtrl`), probablemente en respuesta a un comando HMI o al final de un ciclo/batch. - **Lógica de Interfaz:** Procesar las señales de las interfaces externas (Llenadora, Sala Jarabes, CIP) y actualizar las señales de estado/petición correspondientes en los DBs de interfaz. ### Instancia DB (`BlenderCtrl__Main_DB`) - Este DB asociado almacena todas las variables estáticas (`VAR_STAT`) del `BlenderCtrl__Main`. - Contiene el estado interno persistente entre ciclos de scan: - El estado actual de la máquina de estados. - Flags internos (ej. `FirstScan`, `ResetRequestPending`). - Instancias de temporizadores (`TON`, `TOF`) o contadores (`CTU`, `CTD`) utilizados dentro del FB. - Copias de comandos o estados importantes. ### Implementación SCL - Se esperaría ver una estructura clara en SCL: - Declaraciones de `VAR_INPUT`, `VAR_OUTPUT`, `VAR_IN_OUT`, `VAR`, `VAR_STAT`, `VAR_TEMP`. - Una sentencia `CASE MyState OF ... END_CASE;` para la máquina de estados. - Llamadas a otros FBs/FCs: `InstanceName(Input1 := Value1, Output1 => Target1);` - Lógica condicional `IF...THEN...ELSE...END_IF;`. - Asignaciones `:=`. En resumen, `BlenderCtrl__Main` actúa como el director de orquesta, asegurando que todos los instrumentos (sub-sistemas) toquen en el momento adecuado según la partitura (estado/modo operativo) y respondiendo a las señales del director (HMI) y del entorno (interfaces externas, fallos). Los OBs proporcionan el escenario y el ritmo (ciclo de scan, interrupciones) para que esta orquesta funcione.