Hola, soy Marcos Álvarez, Ingeniero en automatización industrial con más de 10 años de experiencia diseñando, programando y poniendo en marcha sistemas de control para sectores como la automoción, la alimentación, la logística y el sector farmacéutico. Esta entrada del blog la voy a dedicar a hablaros del lenguaje de Texto Estructurado o en inglés Structured Text, a continuación lo llamaremos solo (ST).
El objetivo de este post no es profundizar en todos los aspectos de este lenguaje, sino, conocer sus bases. En el apartado de Ejercicios básicos se profundizará más de una forma práctica.
Índice
1. Introducción a ST.
2. Estructura del programa.
3. Operadores.
4. Sentencias de control.
5. Ejemplos prácticos.
1. Introducción al lenguaje estructurado (ST)
¿Qué es el lenguaje ST?
Cuando comencé en el mundo de la automatización industrial me formé primero con Ladder (LD). Podría decir que todos empezamos así, porque es un lenguaje intuitivo y permite entender la lógica de control casi como si estuviéramos viendo un esquema eléctrico. Pero a medida que vas avanzando y adquiriendo experiencia te das cuenta de que otros lenguajes te ofrecen más posibilidades, es el caso de ST.
ST es uno de los cinco lenguajes soportados por el estándar IEC 61131-3, es una herramienta de alto nivel pensada para desarrollar sistemas de control más complejos, más seguros y más legibles siendo muy similar a lenguajes como Pascal o incluso C, por lo que cualquier persona que venga del mundo del desarrollo de software se sentirá muy cómoda.
Al principio, reconozco que puede parecer menos visual que otros lenguajes. No ves los contactos, no ves los relés, ni las bobinas. Pero en cuanto aprendes a leerlo, te da una capacidad de abstracción, organización y control que, en proyectos medianos o grandes, marca una diferencia.
Comparativa con otros lenguajes de PLC (LD, FBD, IL, SFC)
Lo que más me atrajo desde un principio fue su potencial para estructurar el código. No estás limitado a lógicas secuenciales. Puedes definir estructuras, funciones, bloques funcionales, arrays... incluso puedes aplicar conceptos de programación orientada a objetos, dependiendo del entorno que uses. Todo esto te permite diseñar sistemas que van mucho más allá de una lógica de relés.
Te permite expresar condiciones complejas en una sola línea. Por ejemplo, con una simple sentencia IF puedes tomar decisiones que en Ladder requerirían muchos contactos en serie y paralelo. Esto no solo ahorra tiempo, sino que también reduce errores y mejora la legibilidad del programa.
¿Dónde se usa?
Hoy en día, casi todos los entornos de programación para PLC lo soportan: TIA Portal de Siemens, Codesys, Beckhoff TwinCAT, Omron, Schneider, entre otros. Y cada vez más empresas exigen a sus programadores que conozcan ST porque es el lenguaje ideal para proyectos que involucran:
- Procesamiento de datos (como cálculos de producción, estadísticas, algoritmos PID, etc.).
- Automatismos complejos con muchas condiciones y decisiones.
- Modularidad y reutilización del código.
- Integración con HMI, SCADA y sistemas externos.
Ventajas y desventajas de usar ST
Como todo lenguaje, ST tiene sus puntos fuertes y sus limitaciones. Te resumo las que yo he visto.
✅ Ventajas
- Legibilidad: bien estructurado, se lee casi como un pseudocódigo técnico.
- Flexibilidad: puedes manipular variables, arrays, estructuras, hacer cálculos complejos, etc.
- Escalabilidad: Ideal para proyectos grandes, donde la modularidad y la claridad son clave.
- Portabilidad: muchos fabricantes lo soportan, por lo que puedes migrar conocimientos entre plataformas.
- Curva de aprendizaje: para alguien acostumbrado a Ladder, pasar a ST puede ser intimidante.
- Menos visual: para diagnósticos rápidos o para explicar lógicas simples a técnicos de mantenimiento, Ladder puede ser más accesible.
- Depende mucho del entorno: la implementación de ST puede variar ligeramente entre plataformas.
2. Estructura del programa
Cuando programamos en ST, no lo hacemos como si estuviéramos escribiendo un texto libre en un editor cualquiera, sino, que tiene una estructura bien definida, y esa estructura es lo que le permite al autómata entender nuestras instrucciones con precisión. Aprender esta base es clave para escribir código funcional y mantenible.
Voy a explicártelo desde la práctica: lo que vas a ver en los entornos como TIA Portal o Codesys es que todo programa, función o bloque funcional sigue una plantilla estructurada, compuesta por dos grandes partes: Declaración de variables y Cuerpo de código.
Sintaxis general de un bloque de programa
Cada bloque de código (ya sea un programa, una función o un bloque funcional) se define con una estructura que podríamos comparar a una "caja". Dentro de esa caja definimos qué variables vamos a usar y qué instrucciones queremos que el PLC ejecute.
Esto sería un programa básico llamado Main, que enciende un motor (Motor := TRUE) cuando el botón de inicio (StartButton) está activado. Fíjate que hay dos partes claras:
- La zona de declaración de variables (entre VAR y END_VAR).
- La zona de código, donde escribimos la lógica.
Declaración de variables (VAR, END_VAR)
Como programador, necesitas declarar todas las variables que vas a usar antes de utilizarlas. Esto es obligatorio. Si no lo haces, el compilador (el sistema que transforma tu código en instrucciones que el PLC puede ejecutar) te dará error.
Las variables se declaran entre las palabras clave VAR y END_VAR.
Ejemplo
VAR
SensorPresion : BOOL; // Variable booleana
ContadorBotellas : INT; // Contador entero
Temperatura : REAL; // Número decimal
TextoAlarma : STRING[20]; // Texto de hasta 20 caracteres
END_VAR
Podemos añadir comentarios al lado de cada variable usando //, lo cual recomiendo encarecidamente para que el código sea legible para ti y para quien venga después.
También puedes declarar variables temporales (VAR_TEMP) y variables constantes (VAR CONSTANT). Pero por ahora, con VAR te basta para empezar.
Bloques de código (PROGRAM, FUNCTION, FUNCTION_BLOCK)
En entornos como TIA Portal, puedes llamar funciones y bloques funcionales desde tus programas. La modularidad es uno de los grandes puntos fuertes de ST. Es decir, puedes tener:
- Un programa principal (PROGRAM Main)
- Que utiliza funciones (FUNCTION) para cálculos.
- Y bloques funcionales (FUNCTION_BLOCK) para tareas que requieren seguimiento de estado.
Es el bloque principal. Es donde defines la lógica general del control. Por lo general, los autómatas ejecutan uno o varios programas, dependiendo de su configuración.
Ejemplo
Una función es un bloque que devuelve un único valor, y no tiene memoria interna (no "recuerda" nada entre ciclos). Ideal para cálculos o condiciones simples reutilizables.
Ejemplo
// Cálculo del IVA
FUNCTION CalculoIVA : REAL
VAR_INPUT
PrecioSinIVA : REAL;
END_VAR
CalculoIVA := PrecioSinIVA * 0.21;
END_FUNCTION
Este bloque puede usarse dentro de un programa para calcular el IVA de cualquier valor.
FUNCTION_BLOCK
Es un bloque más avanzado, que sí tiene memoria interna y puede guardar estados entre ciclos. Es útil para controlar secuencias, temporizadores personalizados, o cualquier lógica que necesite "recordar" lo que pasó anteriormente.
Ejemplo
//Arranque de un motor
FUNCTION_BLOCK FB_Motor
VAR_INPUT
Arranque : BOOL; // Variable externa
END_VAR
VAR
EstadoMotor : BOOL; // Variable interna
END_VAR
IF Arranque THEN // Si Arranque es 1
EstadoMotor := TRUE; // EstadoMotor es 1
END_IF
END_FUNCTION BLOCK
Los bloques funcionales son como pequeños módulos encapsulados, y puedes tener instancias de ellos como si fueran "objetos"
Tipos de datos básicos
Igual que en cualquier lenguaje de programación, todo gira en torno a variables. Cada variable tiene un tipo de dato, que determina:
- El tipo de información que contiene (número, texto, valor lógico...).
- El espacio que ocupa en memoria.
- Qué operaciones se pueden hacer con ella
Consejo profesional: usa siempre el tipo más ajustado a lo que necesitas. No pongas REAL si vas a contar piezas: INT es más preciso, rápido y ocupa menos.
Tipos de datos compuestos
En este ejemplo, tienes 5 variables REAL bajo un mismo nombre. Se accede así: Temperaturas[3] := 24.5.
Esto te permite trabajar con datos relacionados como si fueran uno solo: Motor1.Activo, Motor 1.Velocidad, etc. Ideal para modular y reutilizar.
Conversión de tipos
En ST, a veces necesitas convertir de un tipo a otro, por ejemplo de INT a REAL para operar
decimales, o de BOOL a INT para hacer sumas lógicas.
Estas conversiones se hacen con funciones:
3. Operadores
- Operadores aritméticos.
- Operadores relacionales.
- Operadores lógicos.
Aritméticos ( +, -, x, /, MOD)
Relacionales ( =, < >, <, >, < =, > =)
Estos operadores comparan dos valores y devuelven un resultado booleano (TRUE o FALSE). Se utilizan en condiciones, por ejemplo, dentro de un IF.
Lógicos (AND, OR, NOT, XOR)
Se utilizan para combinar condiciones booleanas. Son fundamentales cuando necesitas evaluar varias condiciones al mismo tiempo.
Los operadores pueden combinarse usando paréntesis para controlar el orden de evaluación. Esto es muy importante para evitar errores lógicos.
Consejo profesional: si tienes que pensar dos veces qué evalúa tu condición… usa paréntesis. Hazle la vida fácil al que venga detrás de ti.
4. Sentencias de control
Hasta ahora hemos aprendido a declarar variables, escribir bloques y usar operadores. Pero un programa sin decisiones ni ciclos es como una película sin giros: predecible y aburrida.
En este módulo veremos las sentencias de control que nos permiten condicionar el flujo del programa y repetir acciones de forma estructurada.
- Condicionales: Para decidir qué se ejecuta segíun ciertas condiciones.
- Bucles: Para repetir instrucciones automáticamente mientras se cumpla una condición.
Condicionales (IF...THEN...ELSE, ELSEIF, CASE)
También puedes usar ELSIF (equivalente a "sino si") para múltiples alternativas:
Ejemplo
IF Temperatura < 15 THEN
Ideal para manejar varias posibilidades según un valor concreto. Funciona como un interruptor multiposición.
Bucles (FOR...DO, WHILE, REPEAT)
Los bucles permiten repetir una acción sin escribirla varias veces. Son muy útiles en situaciones como recorrer arrays, esperar eventos, generar retardos por software, etc.
Bucle con contador. Sabes de antemano cuántas veces se va a repetir.
Hace al menos una ejecución y se repite hasta que se cumpla la condición.
5. Ejemplos prácticos
Programa de arranque de motor
Control de nivel con temporizador
En este ejemplo controlamos el llenado de un tanque con una válvula, activando un temporizador que mantiene abierta la válvula durante un tiempo para llenar el nivel.
Comentario final
El lenguaje Structured Text (ST) representa un salto cualitativo en la programación de autómatas programables, especialmente en aplicaciones donde la complejidad lógica y la escalabilidad del proyecto son factores determinantes. Gracias a su sintaxis estructurada y expresiva, permite desarrollar código limpio, reutilizable y fácil de mantener, alineado con las mejores prácticas de ingeniería de software.
A lo largo de esta entrada, hemos recorrido desde su fundamento normativo (IEC 61131-3) hasta sus estructuras clave —como condicionales, bucles, funciones y bloques de datos— con un enfoque orientado a la práctica profesional. Hemos comprobado cómo ST no solo mejora la legibilidad y la depuración del programa, sino que también facilita el trabajo en equipos multidisciplinares y en proyectos industriales de gran envergadura.
Espero que os haya resultado útil y espero colaborar en más entradas. Saludos!
Te ánimo a profundizar en el temario en la bibliografía que te dejo abajo.
— Juanjo
Bibliografía
SIEMENS. (n.d.). SCL para SIMATIC S7-300/400 Programación de bloques. Manual. https://cache.industry.siemens.com/dl/files/188/1137188/att_27483/v1/SCLV4_s.pdf
Texto estructurado (ST, Structured Text). (n.d.). Wikipedia. Retrieved June 26, 2025, from https://es.wikipedia.org/wiki/Texto_estructurado_(ST,_Structured_Text)
0 Comentarios