Texto estructurado
El texto estructurado, abreviado como ST o STX, es uno de los cinco lenguajes admitidos por el estándar IEC 61131-3, diseñado para Controladores lógicos programables (PLC). Es un lenguaje de alto nivel estructurado en bloques y sintácticamente se parece a Pascal, en el que se basa. Todos los idiomas comparten elementos comunes IEC61131. Las variables y llamadas a funciones están definidas por elementos comunes, por lo que se pueden utilizar diferentes lenguajes dentro del estándar IEC 61131-3 en el mismo programa.
Se admiten declaraciones complejas e instrucciones anidadas:
- Lazos de rotación (REPEAT-UNTIL; WHILE-DO)
- Ejecución condicional (IF-THEN-ELSE; CASE)
- Funciones (SQRT(), SIN())
Programa de muestra
(* máquina de estado simple *)TxtState := ESTADOS[StateMachine];CASE StateMachine OF 1: ClosingValve(); StateMachine := 2; 2: Valor de apertura();ELSE BadCase();END_CASE;
A diferencia de otros lenguajes de programación, no hay ningún método alternativo para la declaración CASE: se ingresa la primera condición coincidente y, después de ejecutar sus declaraciones, el bloque CASE se deja sin verificar otras condiciones.
Ejemplos de programación ST adicionales
// Configuración PLCCONFIGURACIÓN DefaultCfg VAR_GLOBAL b_Start_Stop : BOOL; // Variación global para representar un booleano. B_ON_OFF : BOOL; // Variación global para representar un booleano. Start_Stop AT %IX0.0:BOOL; // Entrada digital del PLC (Address 0.0) ON_OFF AT %QX0.0:BOOL; // Producción digital del PLC (Address 0.0). (Coil) END_VAR // Programar el programa principal para ser ejecutado cada 20 ms TASK Tick()INTERVAL := t#20ms); PROGRAMA Main CON EL CONVENIO Tick : Monitor_Start_Stop;END_CONFIGURATIONPROGRAMA Monitor_Start_Stop / Programa actual VAR_EXTERNAL Start_Stop : BOOL; ON_OFF : BOOL; END_VAR VAR // Variables temporales para el manejo lógico ONS_Trig : BOOL; Rising_ONS : BOOL; END_VAR // Inicio de la lógica // Coge el anillo de la entrada Start_Stop ONS_Trig := Start_Stop Y NO Rising_ONS; // Principal Logic for Run_Contact -- Toggle ON / Toggle OFF --- ON_OFF := ()ONS_Trig Y NO ON_OFF) O ()ON_OFF Y NO ONS_Trig); // Rising One Shot logic Rising_ONS := Start_Stop;END_PROGRAM
Ejemplo de bloque de funciones
================================================================================================================================================================================================================================================================// Función Block Timed Counter: Cuenta adicional del intervalo de tiempo================================================================================================================================================================================================================================================================FUNCTION_BLOCK FB_Timed_Counter VAR_INPUT Ejecutar : BOOL := FALSE; / / La señal del desencadenante para comenzar la cuenta de tiempo Time_Increment : REAL := 1.25; // Ingrese el tiempo del ciclo (Segundos) entre conteos Conde_Cycles : INT := 20; // Número de ciclos de conteo deseados END_VAR VAR_OUTPUT Timer_Done_Bit : BOOL := FALSE; // Un poco de disparo indicando Timer Cycle Done Count_Complete : BOOL := FALSE; / // Profundidad Bit indicando que el Conde está completo Current_Count : INT := 0; // Valor acumulativo de la contraprestación END_VAR VAR CicleTimer : TON; // Timer FB de la Biblioteca del Mando CycleCounter : CTU; // Contrarretro FB de la Biblioteca del Mando TimerPreset : Hora; // Tiempo convertido_Incremento en segundos a MS END_VAR // Inicio de la programación del bloque de funciones TimerPreset := REAL_TO_TIME()dentro := Time_Increment) * 1000; CicleTimer() dentro := Ejecutar Y NO CicleTimer.Q, pt := TimerPreset); Timer_Done_Bit := CicleTimer.Q; CycleCounter() # := CicleTimer.Q, r := NO Ejecutar, pv := Conde_Cycles); Current_Count := CycleCounter.cv; Count_Complete := CycleCounter.q; END_FUNCTION_BLOCK