EL FAMOSO «FIZZ BUZZ»
El reto FizzBuzz es uno de los ejercicios clásicos de programación. A primera vista parece simple, pero en realidad es una excelente herramienta para evaluar lógica, estructura condicional y claridad de pensamiento.
En esta entrada lo resolvemos en Structured Text (ST), aplicándolo al entorno PLC.
El reto
El objetivo es recorrer los números del 1 al 100 y aplicar las siguientes reglas:
- Sustituir los múltiplos de 3 por
"Fizz". - Sustituir los múltiplos de 5 por
"Buzz". - Sustituir los múltiplos de 3 y 5 a la vez por
"FizzBuzz". - En cualquier otro caso, mostrar el número.
Declaración de variables
FOR i:= 1 TO 100 DO
tempString := '';
IF (i MOD 3 = 0) AND (i MOD 5 = 0) THEN
tempString := 'Fizzbuzz';
ELSIF (i MOD 3 = 0) THEN
tempString := 'Fizz';
ELSIF (i MOD 5 = 0) THEN
tempString := 'buzz';
ELSE
// Numero resultante
tempString := INT_TO_STRING(i);
END_IF
Results[i] := tempString;
END_FOR;
Aunque en esta versión no utilizamos directamente Mult3, Mult5 y Multi3And5, declararlos es interesante desde un punto de vista arquitectónico: permite separar condiciones, mejorar legibilidad y facilitar futuras ampliaciones.
El array Results almacenará el resultado final de cada iteración.
Lógica principal
FOR i:= 1 TO 100 DO
tempString := '';
IF (i MOD 3 = 0) AND (i MOD 5 = 0) THEN
tempString := 'Fizzbuzz';
ELSIF (i MOD 3 = 0) THEN
tempString := 'Fizz';
ELSIF (i MOD 5 = 0) THEN
tempString := 'buzz';
ELSE
// Numero resultante
tempString := INT_TO_STRING(i);
END_IF
Results[i] := tempString;
END_FOR
Análisis técnico
Uso del operador MOD
La clave del reto está en detectar múltiplos.
En PLC, esto se hace utilizando el operador MOD:
i MOD 3 = 0
Si el resto es cero, el número es múltiplo.
Orden de las condiciones
Es fundamental evaluar primero:
(i MOD 3 = 0) AND (i MOD 5 = 0)
¿Por qué?
Porque si evaluamos primero el múltiplo de 3 o de 5 por separado, nunca llegaríamos al caso combinado.
Este pequeño detalle demuestra la importancia del orden lógico en estructuras condicionales.
Conversión de tipo
Cuando el número no cumple ninguna condición especial:
tempString := INT_TO_STRING(i);
En PLC no existe conversión implícita automática entre tipos numéricos y cadenas, por lo que debemos hacerlo explícitamente.
Este tipo de detalles son importantes cuando trabajamos con HMI, logging o sistemas de trazabilidad.
Reflexión
Aunque FizzBuzz es un ejercicio básico, permite practicar:
- Estructuras de control
- Orden lógico de evaluación
- Gestión de tipos
- Claridad y legibilidad del código
- Separación de responsabilidades (si evolucionamos el diseño)
En un entorno industrial real, este mismo patrón lógico podría formar parte de:
- Generadores de eventos
- Sistemas de clasificación
- Evaluadores de condiciones complejas
- Secuencias basadas en reglas
La diferencia entre un ejercicio simple y un sistema industrial complejo no es el concepto base, sino la escala y la arquitectura.
Posible mejora
Una versión más estructurada podría:
- Separar el cálculo de múltiplos en variables booleanas (
Mult3,Mult5) - Encapsular la lógica en una función
- Parametrizar el rango (no fijarlo a 1..100)
- Implementar testing unitario (en TwinCAT, por ejemplo, con TcUnit)

No responses yet