4. Validacion en OpenPLC y Prototipo Fisico - gevengood/Automatizacion-Tanque-Quimico-Doncel GitHub Wiki
4. Validación en OpenPLC y Prototipo Físico con ESP32 (Control por Sensores)
4.1 Arquitectura del Prototipo Físico
Para validar la solución con equipamiento real bajo una aproximación de proceso controlado por sensores, se construyó un banco de pruebas electrónico gobernado por un microcontrolador ESP32-DOIT DevKit V1 (30 pines) ejecutando la lógica IEC 61131-3 diseñada en OpenPLC Editor.
Componentes del Montaje:
- Unidad de Control (ESP32 DevKit V1): Procesador dual-core a 3.3 V encargado de escanear los sensores infrarrojos y pulsadores, procesar las ecuaciones combinacionales y el conteo de lotes (CTU), y conmutar los indicadores luminosos.
- Doble Fuente de 5 V DC con GND Común:
- Fuente 1 (5 V DC): Alimentación exclusiva del ESP32.
- Fuente 2 (5 V DC): Alimentación de los 3 sensores FC-51 y los 5 LEDs indicadores.
- GND Común: Ambos polos negativos se interconectan en un riel común de tierra.
- Tres Sensores Infrarrojos FC-51 (B1, B2, B3): Basados en el comparador LM393 con ajuste de umbral mediante potenciómetro. Operan con lógica Active-LOW: entregan
LOWal detectar obstáculo yHIGHen ausencia. En el Ladder se acondicionan mediante contactos negados ([/]) para normalizar las banderas internas. - Dos Pulsadores (START y STOP) en configuración Pull-Down: Con resistencias de 10 kΩ hacia GND en las entradas digitales del ESP32.
- Cinco LEDs (H1 a H5) con Resistencias Limitadoras: Cada salida digital se conecta al LED en serie con resistencia de 220 Ω — 330 Ω hacia GND común.
4.2 Diagrama Esquemático del Circuito Físico
[FUENTE 1: 5V DC] [FUENTE 2: 5V DC (Sensores y LEDs)]
| |
+-------------------+ +-------------------+-------------------+
| | | |
v | v v
+--------------+ | +-------------------+ +-------------------+
| VIN (5V) | | | VCC Sensores FC51 | | Etapa de Salida |
| | | +-------------------+ +-------------------+
| ESP32 | | | | |
| DEVKIT V1 | | OUT(B1) | | | OUT(B3)
| | <---------+-----------------+ | +---------+
| GPIO 21 | (%IX0.2: Sensor FC-51 B1 Fondo) | |
| GPIO 22 | <-----------------------------------+ OUT(B2) |
| GPIO 23 | <-----------------------------------------------------+
| |
| GPIO 18 | <--- [Pulsador START] <--- +VCC (con 10k Pull-Down a GND)
| GPIO 19 | <--- [Pulsador STOP ] <--- +VCC (con 10k Pull-Down a GND)
| GPIO 05 | <--- [Pulsador RESET] <--- +VCC (con 10k Pull-Down a GND)
| |
| GPIO 25 | ---> [220 Ω] ---> [>| LED H4: Tanque Vacío ] ---> GND COMÚN
| GPIO 26 | ---> [220 Ω] ---> [>| LED H2: Nivel Muy Bajo ] ---> GND COMÚN
| GPIO 27 | ---> [220 Ω] ---> [>| LED H1: Nivel Correcto ] ---> GND COMÚN
| GPIO 32 | ---> [220 Ω] ---> [>| LED H3: Sobrellenado ] ---> GND COMÚN
| GPIO 33 | ---> [220 Ω] ---> [>| LED H5: Falla Sensores ] ---> GND COMÚN
| |
| GND | --------------------------------------------------------------> GND COMÚN
+--------------+ (Fuentes 1 y 2)
4.3 Mapeo de Pines (Pin Mapping) y Variables en OpenPLC Editor
| Pin GPIO | Tipo | Dirección IEC | Alias | Función |
|---|---|---|---|---|
| 18 | Digital Input | %IX0.0 |
In_Start |
Pulsador de marcha (Pull-Down) |
| 19 | Digital Input | %IX0.1 |
In_Stop |
Pulsador de parada (Pull-Down) |
| 21 | Digital Input | %IX0.2 |
In_B1 |
Sensor FC-51 Nivel Fondo (B1) |
| 22 | Digital Input | %IX0.3 |
In_B2 |
Sensor FC-51 Nivel Medio (B2) |
| 23 | Digital Input | %IX0.4 |
In_B3 |
Sensor FC-51 Nivel Alto (B3) |
| 05 | Digital Input | %IX0.5 |
In_Reset |
Pulsador de reinicio de lotes |
| 25 | Digital Output | %QX0.0 |
LED_H4 |
LED Tanque Vacío (H4) |
| 26 | Digital Output | %QX0.1 |
LED_H2 |
LED Nivel Muy Bajo (H2) |
| 27 | Digital Output | %QX0.2 |
LED_H1 |
LED Nivel Correcto (H1) |
| 32 | Digital Output | %QX0.3 |
LED_H3 |
LED Sobrellenado (H3) |
| 33 | Digital Output | %QX0.4 |
LED_H5 |
LED Falla en Sensores (H5) |

Declaración de Variables en main (OpenPLC)
VAR
In_Start : BOOL AT %IX0.0; (* Pulsador físico de marcha del sistema (GPIO 18) *)
In_Stop : BOOL AT %IX0.1; (* Pulsador físico de parada del sistema (GPIO 19) *)
In_B1 : BOOL AT %IX0.2; (* Sensor FC-51: Detección nivel fondo / vacío (GPIO 21) *)
In_B2 : BOOL AT %IX0.3; (* Sensor FC-51: Detección nivel mínimo / medio (GPIO 22) *)
In_B3 : BOOL AT %IX0.4; (* Sensor FC-51: Detección nivel alto / rebose (GPIO 23) *)
In_Reset : BOOL AT %IX0.5; (* Pulsador físico de reset para contador de lotes (GPIO 5) *)
LED_H4 : BOOL AT %QX0.0; (* Salida LED: Indicador Tanque Vacío (GPIO 25) *)
LED_H2 : BOOL AT %QX0.1; (* Salida LED: Indicador Nivel Muy Bajo (GPIO 26) *)
LED_H1 : BOOL AT %QX0.2; (* Salida LED: Indicador Nivel Correcto (GPIO 27) *)
LED_H3 : BOOL AT %QX0.3; (* Salida LED: Indicador Sobrellenado (GPIO 32) *)
LED_H5 : BOOL AT %QX0.4; (* Salida LED: Alarma por falla en sensores (GPIO 33) *)
bAutoRunning : BOOL; (* Bandera de marcha del proceso con enclavamiento *)
B1 : BOOL; (* Estado lógico normalizado del sensor de fondo B1 *)
B2 : BOOL; (* Estado lógico normalizado del sensor medio B2 *)
B3 : BOOL; (* Estado lógico normalizado del sensor superior B3 *)
ContadorLotes : CTU; (* Bloque de conteo ascendente de lotes producidos *)
iLotesActuales : INT; (* Registro del conteo actual de ciclos completados *)
bLoteCompleto : BOOL; (* Bandera de meta de lotes alcanzada *)
CTU0 : CTU;
END_VAR

4.4 Desarrollo del Programa Ladder en OpenPLC (Rungs 1 a 10)
Rungs 1 a 3: Enclavamiento de Seguridad y Normalización de Sensores (B1, B2)
- Rung 1 (Circuito de Marcha y Parada con Seguridad): Enclava la bandera de operación
bAutoRunningal accionar el pulsador físicoIn_Start(%IX0.0), manteniendo en serie los contactos normalmente cerrados de paradaIn_Stop(%IX0.1) y de alarmaLED_H5(%QX0.4). - Rung 2 (Normalización del Sensor FC-51 B1): Dado que el módulo FC-51 opera con salida Active-LOW (0 V al detectar obstáculo), se invierte la entrada física
In_B1(%IX0.2) mediante un contacto negado|/|, activando la variable internaB1. - Rung 3 (Normalización del Sensor FC-51 B2): Invierte la señal de
In_B2(%IX0.3) para activar la marca lógicaB2.

Rungs 4 a 6: Normalización de Sensor Superior (B3) e Indicadores H4 y H2
- Rung 4 (Normalización del Sensor FC-51 B3): Invierte la señal de
In_B3(%IX0.4) para obtener la variable lógicaB3. - Rung 5 (LED H4 — Tanque Vacío): Evalúa tres contactos normalmente cerrados en serie (
B1,B2,B3) para energizarLED_H4(%QX0.0— GPIO 25) cuando ningún sensor detecta fluido. - Rung 6 (LED H2 — Nivel Muy Bajo): Energiza
LED_H2(%QX0.1— GPIO 26) ante la presencia de fluido exclusivamente en el nivel inferior.

Rungs 7 a 9: Indicadores de Nivel Correcto (H1), Sobrellenado (H3) y Alarma de Falla (H5)
- Rung 7 (LED H1 — Nivel Correcto): Activa la salida
LED_H1(%QX0.2— GPIO 27) cuando B1 y B2 están activos sin B3. - Rung 8 (LED H3 — Sobrellenado): Activa
LED_H3(%QX0.3— GPIO 32) cuando los tres sensores (B1,B2,B3) se encuentran simultáneamente activos. - Rung 9 (LED H5 — Alarma por Falla en Sensores): Implementa la ecuación reducida por Karnaugh (B2·B1') + (B3·B2') mediante dos ramas en paralelo, activando
LED_H5(%QX0.4— GPIO 33) ante cualquier combinación físicamente imposible.

Rung 10: Conteo Automático de Lotes (Bloque CTU)
- Rung 10 (Contador de Lotes Requeridos): Cada flanco ascendente de
LED_H3en la entradaCUdel bloqueContadorLotes(CTU) incrementaiLotesActuales(CV) hasta la meta preestablecida (PV = 5 lotes), con reinicio medianteIn_Reset(R).

Anterior: 3. Implementación en CODESYS y HMI | Siguiente: 5. Pruebas, Conclusiones y Referencias IEEE