6. Lenguajes de programación: Lenguaje texto estructurado

                                                                                     
                                                                            Imagen generada por chatGPT


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.
De hecho, en mi experiencia trabajando con sistemas de producción para farmacéuticas y fabricas de automoción, ST fue la única opción viable para muchas tareas que habrían sido un infierno en Ladder. Desde el control de lotes hasta algoritmos de control adaptativo, todo se desarrolló en ST.


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.
❌ Desventajas
  • 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.



Ejemplo

// Arranque de un motor
PROGRAM Main
VAR
StartButton : BOOL;
Motor : BOOL;
END_VAR

Motor := StartButton;

END_PROGRAM


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.
Así logras que el código sea reutilizable, ordenado y mantenible, tres principios que un buen ingeniero de automatización debe abrazar.


PROGRAM
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

// Encendido de una luz con un pulsador
PROGRAM MAIN

VAR
Luz : BOOL;
Pulsador : BOOL;
END_VAR

Luz := Pulsador;

END_PROGRAM


FUNCTION

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
Aquí te explico los tipos de datos básicos más utilizados:

Tipo

Descripción

Ejemplo

BOOL

Valor lógico: TRUE (1) o FALSE (0)

Sensor := TRUE

INT

Número entero (−32.768 a 32.767)

Contador := 15

DINT

Entero doble (−2.147M a +2.147M)

Total := -12345

REAL

Número decimal (coma flotante)

Velocidad := 3.14

STRING

Cadena de texto (hasta 255 caracteres)

Nombre := 'Motor A'

TIME

Representa una duración temporal

T := T#5s (5 segundos)

DATE, DT

Fechas y marcas temporales

Fecha := D#2025-06-21


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

A veces necesitamos manejar conjuntos de datos relacionados. Para eso existen los tipos compuestos. Son clave para estructurar tu programa de forma profesional.


ARRAY
Permite guardar varios elementos del mismo tipo, como una lista o vector.

VAR
    Temperaturas : ARRAY [1...5] OF REAL;
END_VAR

En este ejemplo, tienes 5 variables REAL bajo un mismo nombre. Se accede así: Temperaturas[3] := 24.5.


STRUCT
Permite agrupar variables de distinto tipo en una sola unidad lógica.

TYPE MotorStatus:
STRUCT
    Activo : BOOL;
    Velocidad : REAL;
    HorasFuncionando : INT;
END_STRUCT
END_TYPE

VAR
    Motor1 : MotorStatus
END_VAR

 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:


Conversión

Ejemplo

INT_TO_REAL(x)

Convierte 5 → 5.0

REAL_TO_INT(x)

Convierte 3.99 → 3

BOOL_TO_INT(TRUE)

Da 1

INT_TO_STRING(123)

Da '123'

STRING_TO_INT('45')

Da 45


3. Operadores

Hasta ahora ya sabes cómo se estructura un programa en ST y cómo declarar variables. Pero para que esas variables hagan algo útil, necesitas conectarlas mediante operadores. Es decir, necesitas realizar operaciones matemáticas, comparaciones y decisiones lógicas. Eso es exactamente lo que vamos a aprender en este punto.

Los operadores en ST se dividen en tres grandes familias:
  • Operadores aritméticos.
  • Operadores relacionales.
  • Operadores lógicos.

Aritméticos ( +, -, x, /, MOD)

Operador

Función

Ejemplo

+

Suma

Total := A + B;

-

Resta

Diferencia := A - B;

*

Multiplicación

Resultado := A * B;

/

División

División := A / B;

MOD

Módulo (resto)

Resto := A MOD B;


Ejemplo

VAR
    Unidades            : INT := 12;
    PrecioUnitario     : REAL := 3.5;
    Total                    : REAL;
END_VAR

Total := Unidades * PrecioUnitario;

Relacionales ( =, < >, <, >, < =, > =)

Estos operadores comparan dos valores y devuelven un resultado booleano (TRUE o FALSE). Se utilizan en condiciones, por ejemplo, dentro de un IF.


Operador

Significado

Ejemplo

=

Igual

A = B

<>

Distinto

A <> B

<

Menor que

A < B

>

Mayor que

A > B

<=

Menor o igual

A <= B

>=

Mayor o igual

A >= B


Ejemplo

IF Temperatura > 80.0 THEN  // Si la Temperatura es superior a 80 grados activar alarma
    Alarma := TRUE;
END_IF;

Lógicos (AND, OR, NOT, XOR)

Se utilizan para combinar condiciones booleanas. Son fundamentales cuando necesitas evaluar varias condiciones al mismo tiempo.


Operador

Significado

Ejemplo

AND

Y lógico

Sensor1 AND Sensor2

OR

O lógico

Pulsador1 OR Pulsador2

NOT

Negación

NOT SensorPresionado

XOR

O exclusivo (uno u otro, pero no ambos)

A XOR B

Ejemplo

IF (SensorPuerta = TRUE) AND (MotorMarcha = FALSE) THEN
    LuzInterior := TRUE;
END_IF;

Aquí estamos activando la luz interior si la puerta está abierta y el motor no está en marcha. Fíjate cómo combinamos las condiciones con AND.

Ejemplo

IF BotonEmergencia OR ParadaDeSeguridad THEN
    PararMaquina := TRUE;
END_IF;

En este caso, si el botón de emergencia o la parada de seguridad están activos, la máquina se para.


Ejemplo con combinación de operadores

Los operadores pueden combinarse usando paréntesis para controlar el orden de evaluación. Esto es muy importante para evitar errores lógicos.


IF (Sensor1 AND Sensor2) OR (Sensor3 AND NOT Sensor4) THEN
    Activar := TRUE;
END_IF;

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.


las agrupamos en dos grandes tipos:
  • 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)

IF...THEN...ELSE
La estructura más usada. Evalúa una condición: si es cierta, ejecuta un bloque; si no, otro.

Ejemplo
// Si el sensor detecta un nivel por debajo de 30 se activa la bomba
IF SensorNivel < 30 THEN
    ActivarBomba := TRUE;
ELSE
    ActivarBomba := FALSE;
END_IF;

También puedes usar ELSIF (equivalente a "sino si") para múltiples alternativas:


Ejemplo

IF Temperatura < 15 THEN

    Modo := 'FRIO';
ELSIF Temperatura > 30 THEN
    Modo := 'CALOR';
ELSE
    Modo := 'NORMAL';
END_IF;


CASE

Ideal para manejar varias posibilidades según un valor concreto. Funciona como un interruptor multiposición.


CASE SelectorModo OF
    1: Modo := 'AUTO';
    2: Modo := 'MANUAL';
    3: Modo := 'MANTENIMIENTO';
ELSE
    Modo := 'ERROR';
END_CASE;

Consejo: el CASE es mucho más limpio que un IF con 10 ELSIF. Si tienes múltiples valores, usa CASE.


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.


FOR...DO

Bucle con contador. Sabes de antemano cuántas veces se va a repetir.


FOR i := 1 TO 5 DO
    Motores[i] := TRUE;
END_FOR;

Recorre los 5 motores y los activa uno por uno.


WHILE
Ejecuta el bloque mientras la condición sea verdadera.

WHILE SensorPresion < 5.0 DO
    Contador := Contador +1;
END_WHILE;

Cuidado: si la condición nunca se vuelve falsa, el bucle es infinito. No lo uses sin límite de seguridad.


REPEAT...UNTIL

Hace al menos una ejecución y se repite hasta que se cumpla la condición.


REPEAT
    Temperatura := LeerSensor();
UNTIL Temperatura >= 80
END_REPEAT;

Aquí se sigue leyendo el sensor hasta que se alcance una temperatura crítica.


5. Ejemplos prácticos

Programa de arranque de motor

Este es uno de los programas básicos pero esenciales: controlar el arranque y parada de un motor mediante un pulsador de arranque y otro de paro, con una señal de motor encendido.

VAR_INPUT
    BotonArranque : BOOL; // Pulsador de marcha del motor
    BotonParo : BOOL; // Pulsador de paro del motor
END_VAR

VAR_OUTPUT
    MotorEncendido : BOOL; // Salida que indica si el motor está encendido o apagado.
END_VAR

// Lógica de control
IF BotonArranque THEN
    MotorEncendido := TRUE;
ELSIF BotonParo THEN
    MotorEncendido := FALSE;
END_IF;

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.


// Entradas
VAR_INPUT
    Sensor_lleno : BOOL; // Sensor de tanque lleno
    Sensor_vacio : BOOL; // Sensor de tanque vacío
END_VAR

// Salidas
VAR_OUTPUT
    Valvula_vacio : BOOL; // Control válvula de vaciado
END_VAR

// Variables internas
VAR
    Estado_vaciando : BOOL := FALSE;
END_VAR

// Lógica de control
// Iniciar vaciado si el tanque está lleno
IF Sensor_lleno AND NOT Estado_vaciando THEN
    Estado_vaciando := TRUE;
END_IF

// Detener vaciado si el tanque está vacío
IF Sensor_vacio AND Estado_vaciando THEN
    Estado_vaciando := FALSE;

// Control de la válvula de vaciado
Valvula_vacio := Estado_vaciando

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)

  

Publicar un comentario

0 Comentarios