## Framework de Gestión de Motores – Vetromeccanica ### 1. Visión general El proyecto utiliza un **framework genérico** para gobernar todos los accionamientos desde TIA Portal. La pieza central es el bloque `FB_Motors_Manage`, que implementa toda la lógica estándar (arranque, paro, rampas, alarmas, diagnóstico, etc.) para **cualquier tipo de variador** (Minimotor, Danfoss, G120C, Movigear, …). Para evitar duplicar código, cada motor del sistema dispone de: * Un _wrapper_ tipo `FC_Ttop_Motor_XXXXXX` (por ejemplo `FC_Ttop_Motor_M30710`). * Su **DB de instancia** (por ejemplo `DB_Ttop_Motor_M30710`) donde reside el _struct_ `Manage` con todos los parámetros, flags de mando y estados. El esquema típico dentro del FC es: ```pascal // Ajustes específicos del motor Motor.CFG_Inverter_Type := Inverter_Type_MINIMOTOR; Motor.CFG_Min_Speed_Hz := 10; Motor.CFG_Max_Speed_Hz := 500; // …otros ajustes… // Transferencia de órdenes desde la lógica de la mesa (FB_Table) Motor.REQ_EN_Run := Table_Status.Channel_Enable[n]; Motor.REQ_Speed_Fix_01 := TRUE; Motor.OUT_VFD_REQ_Speed_User := Velocidad_deseada; // ► Llamada al bloque genérico FB_Motors_Manage( Motor ); ``` Así, **toda la inteligencia concreta** (protecciones, gestión de alarmas, rampas, filtros, cálculos de velocidad, mapping de señales HW, etc.) **vive dentro de `FB_Motors_Manage`;** los FC sólo traducen la estrategia de proceso al formato que entiende el genérico. --- ### 2. Relación de FC_Ttop_Motor ↔ Instancia FB_Motors_Manage A partir de `xref_calls_tree.md` encontramos los siguientes wrappers activos en la mesa T-Top (cada uno llama a su DB/FB_Motors_Manage): | Canal / Función | FC wrapper | DB instancia | Tipo de variador* | Dirección PROFINET (PLC IO) | |-----------------|------------|--------------|-------------------|-----------------------------| | M30710 – Canal central bypass | `FC_Ttop_Motor_M30710` | `DB_Ttop_Motor_M30710` | DBS55-PN (Minimotor extend-A) | IP 10.1.30.37 – In/Out 1356 |1356 | | M31010 – Alimentador entrada (L) | `FC_Ttop_Motor_M31010` | `DB_Ttop_Motor_M31010` | DFC2xA (Danfoss) | 10.1.30.40 – 1404 | | M31110 – Alimentador entrada (R) | … | … | DBS55-PN | 10.1.30.41 – 1424 | | M31210 – Formato entrada | … | … | DBS55-PN | 10.1.30.42 – 1472 | | M31310 – Selector entrada | … | … | DBS55-PN | 10.1.30.43 – 1520 | | M31410 – Canal 1 | … | … | DFC2xA | 10.1.30.44 – 1568 | | M31510 – Canal 2 | … | … | DFC2xA | 10.1.30.45 – 1588 | | M31610 – Canal 3 | … | … | DBS55-PN | 10.1.30.46 – 1608 | | M31710 – Canal 4 | … | … | DBS55-PN | 10.1.30.47 – 1656 | | M31810 – Canal 5 (centro) | … | … | DBS55-PN | 10.1.30.48 – 1704 | | M31910 – Canal 6 | … | … | DBS55-PN | 10.1.30.49 – 1752 | | U32810 – Selector salida (G120C) | `FC_Ttop_Motor_U32810` | `DB_Ttop_Motor_U32810` | G120C | 10.1.30.58 – 1800 | | … | … | … | … | … | *El tipo se extrae de la columna _Module Name_ de **PLC IO.md** y del parámetro `CFG_Inverter_Type`. Estas FC son llamadas desde `FC_Ttop_Run`, que a su vez forma parte de la secuencia principal `OB1 → FC_Ttop_Run` descrita en **Especifica General.md §1.1**. --- ### 3. Estructura esencial del struct `Manage` El struct contiene +300 campos; los más relevantes se resumen por familias: 1. **CFG_*** (Configuration) – valores estáticos cargados al arranque. Entre ellos: * `CFG_VFD`, `CFG_PN`, `CFG_DP` – modo de comunicación. * `CFG_Inverter_Type` – mapa a la _tabla de constantes_ de **PLC IO.md**. * Límites: `CFG_Min_Speed_Hz`, `CFG_Max_Speed_Hz`, `CFG_Max_mBar`. * Señales adicionales HW: `CFG_Add_Signal_RUN_FWD`, `CFG_Add_Signal_TRIP`, … 2. **RCP_*** (Recipe) – velocidades y temporizadores provenientes de recetas HMI. 3. **REQ_*** (Requests) – órdenes de proceso que el wrapper escribe cada ciclo: * `REQ_EN_Run` – habilitación general. * `REQ_Speed_Fix_01 … 05` – selección de consignas fijas. * `REQ_Master_Speed_Sync` – velocidad en modo síncrono. 4. **OUT_*** – salidas hacia la periferia (bobinas de RUN, RESET, consigna Hz, etc.). 5. **STATUS_*** – feedback del variador tratado por `FB_Motors_Manage`: * `STATUS_RUN`, `STATUS_VFD_Trip`, `STATUS_VFD_Warning`, `STATUS_Ready`. * `STATUS_VFD_ACT_Speed_Hz / _User` para diagnóstico. 6. **Alarm_XX** – 16 bits genéricos de fallo estandarizados. `FB_Motors_Manage` lee **CFG** + **REQ**, actualiza **OUT** y **STATUS**, y setea **Alarm_XX** cuando procede. --- ### 4. ¿Qué hace `FB_Motors_Manage` internamente? Aunque el SCL completo no está visible, por práctica con la librería se puede resumir en: 1. **Inicialización** – copiado de _recipes_ a la estructura, validación de límites. 2. **Decodificación de órdenes**: * Prioridad: `REQ_QStop` > `REQ_Start_FWD/BWD` > `REQ_EN_Run`. * Conversión de velocidad (mm/min → Hz / unidades de variador) usando `CFG_Kspeed_User50Hz`. 3. **State Machine genérica** – estados `STOPPED`, `RUNNING`, `FAULT`, `RAMP_UP`, `RAMP_DOWN`… 4. **Gestión de rampas** – `RCP_ACC_Ramp`, `RCP_DEC_Ramp`. 5. **Monitorización de feedback** – comparación real/objetivo, timeout de ready, etc. 6. **Gestión de alarmas** – mapeo de bits de fallo variador a `Alarm_01…16`, disparo de `STATUS_VFD_Trip`. 7. **Energy Saving / Stand-by** – salidas `OUT_EnergySavingON` cuando la línea está vacía (`IN_Line_Empty`). --- ### 5. Flujo completo de mando (de la mesa al variador) ```mermaid flowchart LR FB_Table -- "Status.Channel_Enable[x], Speed" --> FC_Ttop_Motor_x FC_Ttop_Motor_x -- "REQ_*, CFG_*" --> FB_Motors_Manage FB_Motors_Manage -- "OUT_* (RUN,SpeedHz)" --> DB_Fieldbus_IO DB_Fieldbus_IO -- "Feedback bits" --> FB_Motors_Manage FB_Motors_Manage -- "STATUS_*" --> FC_Ttop_Motor_x FC_Ttop_Motor_x --> FB_Table ``` --- ### 6. Conclusiones / Buenas prácticas * **Escalabilidad:** añadir un motor es cuestión de clonar una DB + FC y ajustar `CFG_*`. * **Trazabilidad:** los campos `STATUS_` y `Alarm_XX` ofrecen un _diagnóstico unificado_ visible desde HMI sin depender del fabricante del variador. * **Separación de capas:** * _Proceso_ (FB_Table) decide **qué** hacer. * _Wrapper_ (FC_Ttop_Motor) traduce al formato genérico. * _Motor core_ (FB_Motors_Manage) ejecuta el **cómo**. --- > Nota: la tabla de la sección 2 puede completarse con los restantes motores (M31610…U33610) siguiendo el mismo patrón mostrado.