Capítulo 3 - Texto Estructurado
Capítulo 3 - Texto Estructurado
TEXTO ESTRUCTURADO
(ST)
Introduccin
El texto estructurado es un lenguaje de alto nivel desarrollado puntualmente para aplicaciones de control
industrial, pero con una sintaxis muy similar a los lenguajes tradicionales basados en texto, constituido
por un extenso conjunto de constructores con finalidades particulares.
Un programa en este lenguaje, se compone de un conjunto de sentencias, donde cada una est separada
mediante el delimitador ;, por lo que una sentencia puede ser escrita empleando varias lneas, ya que el
carcter de alimentacin de la lnea ser tratado simplemente como un espacio. Los comentarios se
pueden insertar en cualquier lugar de la sentencia donde se permita la presencia de un espacio.
Las sentencias permiten entre otras labores asignar valores a variables, realizar llamados a funciones y
bloques de funciones, crear expresiones, evaluar sentencias condicionales y crear estructuras de control
de flujo.
Por consiguiente, se hace necesaria la exploracin ms detallada de las partes principales que componen
este tipo de lgica, para as facilitar su interpretacin y desarrollar en el programador las herramientas
que necesita para la creacin de un proyecto.
El principal objetivo de esta seccin, es describir puntualmente las partes principales de este tipo de
lgica apoyndonos con ejemplos que ilustren su funcionamiento apropiado.
PROGRAMACIN EN TEXTO ESTRUCTURADO
El texto estructurado es un lenguaje de programacin textual que usa enunciados para definir lo que se
va a ejecutar, trata indistintamente las maysculas de las minsculas y se puede utilizar la cantidad de
lneas que el programador crea necesarias. El lenguaje se divide en cinco partes principales:
Se utiliza para asignar valores a los tags. Termine la asignacin con un signo de
Asignacin punto y coma ";" Su operador es := para una asignacin retentiva y [:=] para una
asignacin no retentiva.
Expresin
Instruccin
Cuando se ejecuta, se produce uno o ms valores que son parte
de una estructura de datos.
Texto que explica o aclara lo que hace una seccin del texto estructurado. Se
Comentario utiliza para faciliatar la interpretacin del texto estructurado. No tienen
ningn efecto en la ejecucin del texto y pueden aparecer en cualquier lugar
del texto.
ASIGNACIONES
Termina la accin
;
No El tag se establece
como cero, cada vez
tag El tag est obteniendo el nuevo valor. Debe
ser de tipo BOOL, SINT, INT, DINT o REAL
Expresin
1(verdadero) o 0(falso)
Expresin
flotante (punto flotante)
OPERADORES
Componente de texto
estructurado Operadores Aritmticos
Exponente
Modulo-
Operacin Sumar Restar Multiplicar (x a la Dividir
dividir
potencia y)
Operador + - * ** / MOD
INT,
INT, DINT, DINT, INT, DINT, INT, DINT, INT, DINT, INT, DINT,
Tipo de dato REAL REAL REAL REAL REAL
REAL
Comparan dos valores o cadenas para proporcionar un resultado
verdadero o falso.
Verifica si la Verdadera 1
comparacin
es: Falsa 0
Verifica si la Verdadera 1
Operadores
comparacin
Lgicos
es: Falsa 0
Complemento
Operador: NOT Tipo de dato: BOOL
lgico
Operadores Bit
Permiten manipular los bits dentro un valor basado en dos
otros valores y una funcin que los relaciona.
Tipo de dato:
a Bit
NOTA: Observar que los operadores bit a bit y los operadores lgicos son los mismos.
La nica diferencia est en el tipo de dato comparado. Los operadores lgicos realizan
operaciones lgicas con dos tags tipo BOOL (1 o 0), mientras que los operadores bit a
bit realizan operaciones lgicas con cada bit de un tag tipo DINT. Recordar que los
tags DINT son nmeros decimales que el programa guarda en formato binario. El
resultado de la comparacin lgica bit a bit es entonces guardado en un nmero
binario y luego convertido a decimal para guardarlo en formato DINT. Por ejemplo:
Se realizar la operacin:
FUNCIONES
INSTRUCCIN
Las instrucciones se ejecutan cada vez que se escanean y son independientes a menos
que se encuentren dentro de una construccin. Una instruccin dentro de una
construccin se ejecuta cada vez que las condiciones de la construccin sean
verdaderas. Si la construccin es falsa, ninguna instruccin o declaracin dentro de las
mismas se ejecutar. A continuacin se muestra una tabla con las instrucciones ms
comunes. Notar que no se mostrarn todas las instrucciones debido a su enorme
variedad. Una lista de todas las instrucciones disponibles en el programa se puede
encontrar en el Manual de Referencia e Instrucciones Generales de los controladores
Logix5000.
Instruccin Significado
ABS Valor absoluto
ADD Suma
SUB Restar
MUL Multiplicar
DIV Dividir
CLR Borrar
CTUD Conteo progresivo/regresivo
EQU Igual a
JSR Saltar a subrutina
NOT No a nivel de bits
PID Proporcional integral derivativo
RTOR Temporizador retentivo activado con restablecimiento
TONR Temporizador de retardo a la conexin con restablecimiento
CONSTRUCCIN
Las construcciones pueden programarse individualmente o dentro de otras
construcciones. Se debe elegir cuidadosamente qu construccin utilizar en base a lo
que se desea hacer:
Texto Significado
IF condicin1 THEN Si condicin1 es verdadera, ejecutar la sentencia1
sentencia1
ELSIF condicin2 THEN Alternativamente, si la condicin2 es verdadera, ejecutar la
sentencia2 sentencia2
ELSE Si ninguna de las condiciones anteriores es verdadera,
sentencia3 ejecutar la sentencia3
END_IF; Finaliza la construccin
Finaliza la construccin.
2, Construccin CASE...OF
Se utiliza la construccin CASE...OF para seleccionar una serie de sentencias
dependiendo del valor numrico de una variable. Su estructura bsica es:
Texto Significado
CASE state OF Se ejecutar una serie de sentencias dependiendo del valor
numrico de la variable state
0: Si state = 0, se ejecutar la sentencia1
sentencia1
1..3: Si 1 state 3, se ejecutar la sentencia2
sentencia2
ELSE Si el valor de state no cumple con ninguno de los valores o
sentencia3 rangos establecidos anteriormente, se ejecutar la sentencia3.
END_CASE; Finaliza la construccin
Se deben tomar en consideracin las siguientes caractersticas:
La construccin CASE...OF permite desarrollar de forma mucho ms sencilla
programas que deben ejecutar diversas sentencias dependiendo del valor de
una sola variable. En vez de escribir varios IF para cada valor de la variable, se
puede utilizar una sola construccin CASE..OF.
Dentro de cada set de sentencias, pueden ir un nmero infinito de
construcciones adicionales, como IF...THEN, otro CASE...OF, etc.
En caso de ser necesario, se puede utilizar la construccin CASE...OF para
ayudar con el desarrollo de programas cuyo funcionamiento debe ser una
secuencia. Esto es factible debido a que CASE...OF es una construccin
selectiva: solo permitir la ejecucin de un set de sentencias siempre y cuando
el valor de la variable analizada no cambie. Aunque se cumplan otras
condiciones en otras sentencias que pertenecen a otro valor numrico de la
variable analizada, stas no se ejecutarn. De esta manera, uno puede utilizar la
variable de anlisis como seal de que un paso en una secuencia ha finalizado o
iniciado, as controlando el orden en el que se ejecuta el programa. Ms detalles
se presentarn en el Ejemplo #2 de este captulo.
Ahora se presenta un ejemplo del uso de esta construccin:
Finaliza la construccin
3, Construccin FOR...DO
Utilice esta construccin para realizar una serie de acciones una cierta cantidad de
veces antes de pasar a hacer otras acciones en su programa.
Texto Significado
FOR A:=valor_inicial TO Se establece que el valor inicial de A ser valor_inicial. Este FOR
valor_final BY aumento se repetir hasta que A llegu hasta valor_final. Cada vez que el
DO ciclo FOR termine, A tendr un aumento igual a aumento.
Siempre y cuando A no haya llegado hasta valor_final, el FOR se
repetir.
IF condicin1 THEN Esta parte del texto es opcional. Si uno desea salir de la
sentencia1; construccin FOR antes de que A llegue hasta valor_final, es
EXIT; posible lograrlo introduciendo una construccin IF que me
END_IF; establezca una sentencia1 y el comando EXIT. Sentencia1
tambin es opcional, ya que uno puede simplemente introducir
el IF y si se cumple, ejecutar el comando EXIT.
END_FOR; Finaliza la construccin
Un lazo WHILE...DO contina ejecutando una serie de acciones siempre y cuando una
condicin no se cumpla.
Texto Significado
WHILE condicin1 DO Mientras la condicin1 sea verdadera, se seguir ejecutando el
lazo WHILE.
IF condicin2 THEN Esta parte del texto es opcional. Si uno desea salir de la
sentencia2; construccin WHILE cuando se cumple la condicin2, entonces
EXIT; utiliza el comando EXIT dentro del IF. Adicional, se pueden
END_IF; realizar otras sentencias, como lo es sentencia2.
END_WHILE; Finaliza el lazo WHILE.
Texto Significado
REPEAT Se repetir la sentencia1 hasta que se cumpla una condicin
sentencia1; establecida posteriormente.
IF condicin2 THEN Esta parte del texto es opcional. Si uno desea salir de la
sentencia2; construccin REPEAT cuando se cumple la condicin2, entonces
EXIT; utiliza el comando EXIT dentro del IF. Adicional, se pueden
END_IF; realizar otras sentencias, como lo es sentencia2.
UNTIL condicin3 Cuando condicin3 sea cierta, se saldr del lazo REPEAT.
END_REPEAT; Finaliza el lazo REPEAT.
Diferencia clave entre el lazo WHILE y el lazo REPEAT: El lazo WHILE verifica las
condiciones antes de ejecutar las sentencias, mientras que el lazo REPEAT ejecuta las
sentencias y luego verifica si se ha cumplido o no las condiciones de salida. Es decir,
las sentencias del lazo WHILE puede que nunca ocurran si desde un inicio su
condicin no se cumple, mientras que las sentencias del lazo REPEAT siempre se
ejecutarn al menos una vez.
COMENTARIOS
Son lneas de texto utilizadas para explicar o aclarar qu hacen distintas partes del
programa o brindar informacin adicional si el programador lo desea. Se introducen
al texto con "//" y pueden colocarse en cualquier parte del programa sin temor a que
afecten la programacin del mismo.
Se presenta un ejemplo a continuacin:
6. Se debe tener cuidado con las construcciones FOR, WHILE y REPEAT, ya que el
programa no realizar ninguna otra accin hasta haber salido del loop. Esto
puede ser muy til o muy perjudicial, dependiendo de lo que el usuario desee
programar.
EJEMPLO N1
LLENADO DEL TANQUE
Enunciado del problema:
El tanque #1 es llenado a partir de un depsito de suministro y la activacin de 3 bombas, cada bomba
entra en operacin bajo diferentes circunstancias.
Cuando el sensor S1 no detecte que existe bajo suministro de agua, y no exista ninguna proteccin
de sobrecarga activada OL y no se ha presionado el botn de STOP, las bombas pueden entrar en
funcionamiento para llenar el tanque #1.
Si el tanque #1 no est lleno y su nivel de agua, baja de S3, se iniciar el ciclo.
Si es la primera vez que se inicia, se accionar la Pump_1. sta permanecer encendida hasta que
se llegue al nivel alto del tanque, momento en el cual se apagar.
Una vez el nivel del tanque baja de S3 luego de un tiempo, se accionar la Pump_2 hasta que el
tanque se llene nuevamente. En ese instante, se apaga la Pump_2.
La tercera vez que el nivel de agua del tanque baje de S3, se accionar la Pump_3 hasta que el
tanque se llene nuevamente. Cuando se llena el tanque, se apaga Pump_3 y se resetea el contador.
El contador haca posible ir alterando el uso de las bombas a medida que el tanque se llena y vaca
a travs del da.
Si en cualquier momento el tanque de suministro baja de los niveles permitidos, todo el sistema se
apagar y se quedar en espera hasta que se llene el tanque de suministro y el usuario presione
START nuevamente.
STOP o cualquiera de las sobrecargas OL apagan el sistema.
ENTRADAS
S1: Sensor nivel bajo de
suministro
S2: Sensor nivel alto del
tanque.
S3: Sensor nivel bajo del
tanque.
SALIDAS
Pump_1: Activacin de
la bomba 1
Pump_2: Activacin de
la bomba 2
Pump_3: Activacin de
la bomba 3.
Este proceso se ilustra en el siguiente programa realizado en Diagrama de Escalera, el cual se desea
programar en texto estructurado.
Programacin en RSLOGIX5000
1. Ejecutar el software RSLogix5000. Esperar que salga su pantalla de inicio, tal como se muestra a
continuacin:
2. Minimizar la ventana de Quick Start haciendo clic en el botn Start Page en el margen
izquierdo
3. Crear un nuevo Archivo. Para ello, hacer clic al botn File de la barra de men, en el margen
superior y hacer clic sobre New.
4. Entonces, se desplegar una ventana, en el cual se debe editar cada una de las casillas propuestas.
Con el nombre, descripcin del proyecto. Adicional se debe especificar la revisin que se est
trabajando, en este caso la 19.
Nombre del
controlador
Versin a utilizar
Nombre del
Proyecto
Breve descripcin
del proyecto
5. Se crea la nueva rutina en Texto estructurado. Para ello nos dirigimos a Controller Organizer>>
Task>>Main Program>>Clic derecho en Main Program>>New Routine.
6. Se nombra la nueva rutina en texto estructurado como LLENADO_DEL_TANQUE
Verifica que el tanque a llenar contenga agua por debajo del sensor de boya S3, y que no
sobrepase el sensor de boya S2.
Empieza a actuar la primera bomba, una vez se haya cumplido las condiciones mostradas
en el recuadro.
CONTROL DE POSICIN
Nota previa al ejemplo:
El siguiente ejemplo incluye la programacin del problema en texto estructurado, pero tambin incluye un
pequeo tutorial de cmo utilizar variables anlogas y sus valores sensados dentro del programa. Se
utilizar diagrama en escalera para captar la seal del sensor anlogo y luego una nueva instruccin JSR
para cambiar de una subrutina a otra. Adems, como tema adicional, el mismo problema se programar
con la funcin ALARMA en diagrama de bloque de funciones (function block diagram, FBD).
Enunciado del problema:
Se desea utilizar el sensor ultrasnico 873P-DCAV1-D5 para monitorear la posicin de un objeto a travs
de luces indicadoras. Se cuenta con tres luces que se deben encender dependiendo de la distancia a la
cual se encuentre el objeto. Las luces debern indicar cuando el objeto se encuentre a ms de 1800mm,
1000-1400mm, 500-900mm y 300-400mm. En caso contrario, las luces debern apagarse. Para reiniciar
el programa y apagar todas las luces, se utiliza un botn que se tiene que presionar por 5 segundos para
que el reinicio sea efectivo.
Entradas y Salidas:
Sensor Botn de
Ultrasnico reinicio
Entradas
Led indicador
de una
distancia de
300 a 400
mm
Led indicador
de una
distancia de
1000 a 1400
mm
Programacin en RSLOGIX5000
8. Ejecutar el software RSLogix5000. Esperar que salga su pantalla de inicio, tal como se muestra a
continuacin:
9. Minimizar la ventana de Quick Start haciendo clic en el botn Start Page en el margen
izquierdo
10. Hacer un nuevo Archivo. Para ello, hacer clic al botn File de la barra de men, en el margen
superior y hacer clic sobre New.
11. Se desplegar una ventana, la cual debe ser llenada con los datos correspondientes de la aplicacin
a programar y del controlador a emplear. Adicional, en esta misma seccin se nombra el proyecto
y opcionalmente se puede agregar una breve descripcin del proyecto. Dar clic en OK y el
proyecto se habr guardado en la ubicacin seleccionada.
Nombre del
controlador
Versin a utilizar
Nombre del
Proyecto
Breve descripcin
del proyecto
12. Una vez creado el nuevo controlador, se empieza a desarrollar la rutina. Por defecto, la nica
rutina que aparece es en Diagrama Escalera, pero como deseamos programar en Texto
Estructurado, procedemos a crear una nueva rutina. Tal como lo indica el proceso que
desplegaremos a continuacin:
En el Controller Organizer En Main Program, creamos la
Aparece CONTROL DE POSICIN como el nueva rutina
controlador. Al pulsar clic derecho sobre Main Program
Controller
Task Main Task Main Program
Organizer
Colocar el nombre
de la nueva rutina Seleccionar New Clic derecho en
(Texto Routine Main Program
estructurado)
13. Ya creada la nueva rutina en texto estructurado procedemos a ingresar los tags que necesitamos,
asignndoles las direcciones de entradas y salidas mostradas en la tabla inferior. Notar que estos
Alias pueden cambiar dependiendo de la preferencia del programador o del PLC utilizado y no
estn de ninguna manera limitados o restringidos a los mostrados en la siguiente tabla. Adems, se
pueden utilizar los Alias directamente como variables en texto estructurado, por lo cual no es
necesario crear un tag para cada uno.
Tipo de
Descripcin Tag utilizado Alias utilizado
variable
Sensor ultrasnico SENSOR_ANLOGO Local:3.I.Ch0Data
Entradas Botn de reinicio --- Local:2:I.Data.0
Salida del sensor escalada POSICIN_MILMETROS ---
Luz indicadora distancia mayor de
--- Local:2:O.Data.3
1800mm
Luz indicadora distancia entre 1000-
--- Local:2:O.Data.2
1400mm
Salidas Luz indicadora distancia entre 500-
--- Local:2:O.Data.1
900mm
Luz indicadora distancia entre 300-
--- Local:2:O.Data.0
400mm
Temporizador de 5 segundos T1 ---
14. Antes de proceder a desarrollar el programa en ST, es necesario lidiar con la seal enviada por el
sensor anlogo. Como se mencion anteriormente, el sensor es de 16 bits y enviar la informacin
que est recopilando en combinaciones de bits desde 0 hasta 216. Esto puede cambiar segn el
sensor y el PLC utilizado. Por ejemplo, para este problema, ste no es el caso. Observando el
manual del PLC y el manual del sensor, se puede concluir que el procesador no utiliza los 16 bits
para guardar informacin numrica sobre la variable fsica leda. El procesador lee la informacin
enviada por el sensor de la siguiente manera:
Notar el uso de la instruccin JSR: Jump to Subroutine. Se utiliza esta instruccin en diagrama de
escalera para pasar a la subrutina CONTROL_DE_POSICIN en texto estructurado, una vez se haya
finalizado el escalamiento de la informacin enviada por el sensor anlogo. Cada vez que la
informacin del sensor anlogo cambie, as mismo cambiar el valor del tag
POSICION_MILIMETROS y el programa en texto estructurado se ejecutar acorde a dicho valor. Los
tags introducidos al programa por ahora deben ser:
15. La accin que ejecuta cada seccin del programa ser explicada mediante comentarios:
Primera parte:
Segunda parte:
16. DE ESTE PASO EN ADELANTE ES COMPLETAMENTE OPCIONAL. Una vez finalizado el programa,
se podra proceder a construir este programa con otro lenguaje de programacin: FBD, o Function
Block Diagram (diagrama de bloques de funciones). El lenguaje FBD es sumamente intuitivo y
mucho ms sencillo de utilizar en ciertos casos. Sin embargo, detalles sobre su uso no se
proporcionan en este captulo. Se dirige a MainProgram, New Routine, y seleccionamos Function
Block Diagram.
Bsicamente se le asign un aviso luminoso a cada salida del bloque Alarm. Adems se observar
que el tag ALM_01 fue creado automticamente por el programa al momento de aadir el bloque
Alarma.
Nota: lneas continuas significan valores no booleanos y lneas punteadas significan valores
booleanos.
19. Ahora es necesario asignarle los lmites sobre los cuales el bloque Alarm se basar para funcionar.
Este bloque particular requiere cuatro lmites establecidos: LowLow, Low, High, HighHigh. Cuando
la variable de entrada est por debajo de Low, se activar la salida asignada a L_Alarm. Cuando la
variable de entrada est por debajo de LowLow, estarn activadas las salidas L_Alarm y LL_Alarm.
Cuando la variable de entrada est por encima de High, se activar la salida H_Alarm. Se repite el
comportamiento de L_Alarm y LL_Alarm con H_Alarm y HH_Alarm. Para asignar estos valores, no
es necesario asignarle un Input_Reference a cada parmetro. Simplemente es necesario hacer lo
siguiente:
Claro est que para que este FBD funcione, es necesario nuevamente crear un programa en
diagrama en escalera con SCP y un JSR que lleve a la subrutina Alarma. Una vez finalizado este
paso y tomado en cuenta lo anterior, el programa funcionar de la siguiente manera:
Si POSICIN_MILMETROS est por debajo de LLLimit, se activarn las salidas L_Alarm y
LL_Alarm
Si POSICIN_MILMETROS est por debajo de LLimit, se activar la salida L_Alarm
Si POSICIN_MILMETROS est por encima de de HLimit, se activar la salida H_Alarm
Si POSICIN_MILMETROS est por encima de HHLimit, se activarn las salidas H_Alarm y
HH_Alarm.
En cualquier otro caso, las salidas permanecern desactivadas.
El nuevo programa en FBD cumple prcticamente el mismo propsito que el programa anterior en
ST, con mucho menos tiempo invertido y mucho menos esfuerzo.