Instrucciones

Descripción general

Las instrucciones describen qué se debe hacer con las expresiones especificadas.

En ST se pueden utilizar las instrucciones siguientes:

Instrucción

Ejemplo

asignación

A:=B; CV := CV + 1; C:=SIN(X);

Llamar a un bloque de funciones y utilizar la salida del bloque de funciones

CMD_TMR(IN := %IX5, PT := 300);
A:=CMD_TMR.Q

RETURN

RETURN;

IF

D:=B*B;
IF D<0.0 THEN
C:=A;
ELSIF D=0.0 THEN
C:=B;
ELSE
C:=D;
END_IF;

CASE

CASE INT1 OF
1: BOOL1 := TRUE;
2: BOOL2 := TRUE;
ELSE
 BOOL1 := FALSE;
 BOOL2 := FALSE;
END_CASE;

FOR

J:=101;
FOR I:=1 TO 100 BY 2 DO
IF ARR[I] = 70 THEN
J:=I;
'EXIT;
END_IF;
END_FOR;

WHILE

J:=1;
WHILE J<= 100 AND ARR[J] <> 70 DO
J:=J+2;
END_WHILE;

REPEAT

J:=-1;
REPEAT
J:=J+2;
UNTIL J= 101 OR ARR[J] = 70
END_REPEAT;

EXIT

EXIT;

CONTINUE

CONTINUE;

JMP

label1: i:=i+1;
IF i=10 THEN
    JMP label2;
END_IF
JMP label1;
label2:

instrucción vacía

;

Operadores de asignación

Asignación predeterminada

En la parte izquierda de una asignación, hay un operando (variable, dirección) al que se asigna el valor de la expresión de la derecha mediante el operador de asignación :=.

Consulte también la descripción del operador MOVE, que tiene la misma función.

Para obtener un ejemplo con asignación, consulte el apartado Ejemplo de llamada con asignaciones del capítulo Llamada de un bloque de funciones.

Ejemplo

a:= b;

a obtiene el valor de b.

Operador de establecimiento S=

El valor se establecerá: si se establece una vez como TRUE, seguirá siendo TRUE.

Ejemplo

a S= b;

a se establece en TRUE si b es TRUE al procesar la asignación.

Si b es FALSE al procesar la asignación, el valor de a no se modificará.

Operador de restablecimiento R=

El valor se restablecerá: si se establece una vez como FALSE, seguirá siendo FALSE.

Ejemplo

a R= b;

a se establece como FALSE en cuanto b = TRUE.

NOTA: En caso de una asignación múltiple, las asignaciones de establecimiento y restablecimiento hacen referencia al último miembro de la asignación.

Ejemplo

a S= b R= fun1(par1,par2)

En este caso, b será el valor de salida restablecido de fun1. Sin embargo, a no obtiene el valor establecido de b, sino que obtiene el valor de salida establecido de fun1.

Tenga en cuenta que una asignación se puede utilizar como una expresión. Se trata de una extensión del estándar IEC 61131-3.

Operación de asignación REF

Este operador genera una referencia a un valor.

Sintaxis

<variable name> REF= <variablename> ;

Ejemplo

refA : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;

Llamada a bloques de funciones en ST

La llamada a un bloque de funciones (FB, por sus siglas en inglés) se realiza en texto estructurado, de acuerdo con la sintaxis siguiente:

<nombre de instancia de FB>(variable de entrada de FB:=<valor o dirección>|, <variable de entrada de FB adicional:=<valor o dirección>|...variables de entrada de FB adicionales);

Ejemplo

En este ejemplo, se llama a un bloque de funciones de temporizador (TON) con asignaciones para los parámetros IN y PT. A continuación, la variable resultante Q se asigna a la variable A. El bloque de funciones de temporizador se instancia mediante TMR:TON;. La variable resultante, como en IL, se direcciona de acuerdo con la sintaxis <nombre de instancia de FB>.<variable de FB>:

TMR(IN := %IX5, PT := 300);
A:=TMR.Q;

También hay otra sintaxis disponible para las salidas:

fb(in1:=myvar, out1=>myvar2);

Instrucción RETURN

Puede utilizar la instrucción RETURN para salir de una POU.

Sintaxis

RETURN;

Ejemplo

IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;

Si b es TRUE, la instrucción a:=a+1; no se ejecutará. Como resultado, se saldrá de la POU inmediatamente.

Instrucción IF

Con la instrucción IF se puede probar una condición y, en función de esta condición, se pueden ejecutar instrucciones.

Sintaxis

IF <expresión booleana1> > THEN

<instrucciones IF>

{ELSIF <expresión booleana2> THEN

<instrucciones ELSIF1>

..

..

ELSIF <expresión booleana n> THEN

<instrucciones ELSIF-1>

ELSE

<instrucciones ELSE>}

END_IF;

El segmento entre llaves {} es opcional.

Si la <expresión_booleana1> devuelve el valor TRUE, entonces solo se ejecutan las <instrucciones_IF> y, como resultado, no se ejecuta ninguna de las otras instrucciones. De lo contrario, las expresiones booleanas, que empiezan por <expresión_booleana2>, se evalúan una tras otra hasta que 1 de las expresiones devuelve el valor TRUE. Entonces solo se evalúan las instrucciones posteriores a esta expresión booleana y anteriores a la siguiente expresión ELSE o ELSIF. Si ninguna de las expresiones booleanas da como resultado el valor TRUE, entonces solo se evalúan las <instrucciones_ELSE>.

Ejemplo

IF temp<17
THEN heating_on := TRUE;
ELSE heating_on := FALSE;
END_IF;

Aquí, la calefacción se enciende cuando la temperatura baja de los 17 grados. De lo contrario, permanece apagada.

Instrucción CASE

Con la instrucción CASE, puede combinar varias instrucciones condicionadas con la misma variable de condición en una sola construcción.

Sintaxis

CASE <Var1> OF

<valor1>: <instrucción 1>

<valor2>: <instrucción 2>

<valor3, valor4, valor5>: <instrucción 3>

<valor6..valor10>: <instrucción 4>

..

..

<valor n>: <instrucción n>

ELSE <instrucción ELSE>

END_CASE;

Las instrucciones CASE se procesan según el modelo siguiente:

  • Si la variable de <Var1> tiene el valor <Valor I>, se ejecutará la instrucción <Instrucción I>.

  • Si <Var 1> no tiene ninguno de los valores indicados, se ejecutará la <Instrucción ELSE>.

  • Si la misma instrucción se debe ejecutar para varios valores de las variables, puede escribir estos valores uno después del otro, separados por comas, y, de este modo, condicionar la ejecución común.

  • Si la misma instrucción se debe ejecutar para un rango de valores de una variable, puede escribir el valor inicial y el valor final separados por 2 puntos. Por lo tanto, puede condicionar la condición común.

Ejemplo

CASE INT1 OF
1, 5: BOOL1 := TRUE;
      BOOL3 := FALSE;
2: BOOL2 := FALSE;
      BOOL3 := TRUE;
10..20: BOOL1 := TRUE;
      BOOL3:= TRUE;
ELSE
    BOOL1 := NOT BOOL1;
    BOOL2 := BOOL1 OR BOOL2;
END_CASE;

Bucle FOR

Con el bucle FOR, puede programar procesos repetitivos.

Sintaxis

INT_Var:INT;

FOR <INT_Var> := <VALOR_INI> TO <VALOR_FINAL> {BY <tamaño paso>} DO

<instrucciones>

END_FOR;

El segmento entre llaves {} es opcional.

Las <instrucciones> se ejecutan siempre que el contador <INT_Var> no tenga un valor superior a <VALOR_FINAL>. Esto se comprueba antes de ejecutar las <instrucciones> de modo que las <instrucciones> no se ejecuten si <VALOR_INI> es superior a <VALOR_FINAL>.

Cuando se ejecutan <instrucciones>, el valor de <INT_Var> se incrementa con el valor de <tamaño de paso>. El tamaño de paso puede tener cualquier valor entero. Si falta, se establecerá en 1. El bucle finalizará cuando el valor de <INT_Var> sea superior a <VALOR_FINAL>.

Ejemplo

FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;

Suponiendo que el valor predeterminado de Var1 sea 1. Tendrá el valor 32 después del bucle FOR.

NOTA: Si <VALOR_FINAL> es igual al valor límite para el tipo de datos de <INT_Var> (contador en el ejemplo anterior), se producirá un bucle infinito. Si el contador es de tipo SINT, por ejemplo, y el <VALOR_FINAL> es 127 (el máximo valor positivo para una variable de tipo SINT), el bucle no podrá terminar nunca porque al añadir 1 a este valor máximo la variable resultaría negativa y nunca superaría los límites impuestos por la instrucción FOR.
 ADVERTENCIA
BUCLE INFINITO
Asegúrese de que el tipo de variable utilizado en las instrucciones FOR tenga suficiente capacidad para ajustarse al <VALOR_FINAL> + 1.
Si no se siguen estas instrucciones, pueden producirse lesiones graves, muerte o daños en el equipo.

Puede utilizar la instrucción CONTINUE en un bucle FOR. Se trata de una extensión del estándar IEC 61131-3.

Bucle WHILE

Una alternativa al bucle FOR es el bucle WHILE, que ejecuta el bucle si una condición booleana es TRUE y mientras siga siendo TRUE. Si la condición no tiene inicialmente el valor TRUE, el bucle no se ejecuta. Si la condición que inicialmente tenía el valor TRUE pasa a tener el valor FALSE, el bucle finaliza.

Sintaxis

WHILE <expresión booleana> DO

<instrucciones>

END_WHILE;

Evidentemente, la expresión booleana inicial y en curso debe asumir un valor FALSE en algún momento en las instrucciones del bucle. De lo contario, el bucle no finalizará, lo que provocará una condición de bucle infinito.

 ADVERTENCIA
BUCLE INFINITO
Asegúrese de que el bucle WHILE finalice en las instrucciones del bucle creando una condición FALSE de la expresión booleana que controla el bucle WHILE.
Si no se siguen estas instrucciones, pueden producirse lesiones graves, muerte o daños en el equipo.

A continuación, se ofrece un ejemplo de instrucciones del bucle que hacen que el bucle finalice:

WHILE Counter>0 DO
 Var1 := Var1*2;
 Counter := Counter-1;
END_WHILE

Puede utilizar la instrucción CONTINUE en un bucle WHILE.

Bucle REPEAT

El bucle REPEAT es otra alternativa al bucle FOR, y también al bucle WHILE. El bucle REPEAT se diferencia del bucle WHILE en que la condición de salida solo se evalúa después de que el bucle se haya ejecutado como mínimo una vez, al final del bucle.

Sintaxis

REPEAT

<instrucciones>

UNTIL <expresión booleana>

END_REPEAT;

Las <instrucciones> se llevan a cabo repetidamente mientras la <expresión booleana> devuelva el valor TRUE. Si la <expresión booleana> ya se produce en la primera evaluación UNTIL, las <instrucciones> solo se ejecutan una vez. Evidentemente, la <expresión booleana> debe asumir un valor TRUE en algún momento en las instrucciones del bucle. De lo contario, el bucle no finalizará, lo que provocará una condición de bucle infinito.

 ADVERTENCIA
BUCLE INFINITO
Asegúrese de que el bucle REPEAT finalice en las instrucciones del bucle creando una condición TRUE de la expresión booleana.
Si no se siguen estas instrucciones, pueden producirse lesiones graves, muerte o daños en el equipo.

A continuación, se ofrece un ejemplo de instrucciones del bucle que hacen que el bucle finalice:

REPEAT
 Var1 := Var1*2;
 Counter := Counter-1;
UNTIL
 Counter<=0
END_REPEAT;

Puede utilizar la instrucción CONTINUE en un bucle REPEAT. Se trata de una extensión del estándar IEC 61131-3.

Instrucción CONTINUE

Como extensión del estándar IEC 61131-3, se admite la instrucción CONTINUE en los bucles FOR, WHILE y REPEAT. CONTINUE hace que la ejecución continúe con el siguiente ciclo del bucle.

Ejemplo

FOR Counter:=1 TO 5 BY 1 DO
INT1:=INT1/2;
IF INT1=0 THEN
CONTINUE; (* to avoid division by zero *)
END_IF
Var1:=Var1/INT1; (* only executed, if INT1 is not "0" *)
END_FOR;
Erg:=Var1;

Instrucción EXIT

La instrucción EXIT finaliza el bucle FOR, WHILE o REPEAT en el que se encuentra sin tener en cuenta ninguna condición.

Instrucción JMP

Puede utilizar la instrucción JMP para realizar un salto incondicional a una línea de código marcada con una etiqueta de salto.

Sintaxis

JMP <etiqueta>;

La <etiqueta> es un identificador arbitrario pero exclusivo que se coloca al principio de una línea de programa. La instrucción JMP debe ir seguida de la indicación del destino del salto, que tiene que ser igual a una etiqueta predefinida.

 ADVERTENCIA
BUCLE INFINITO
Asegúrese de que el uso de la instrucción JMP sea condicional.
Si no se siguen estas instrucciones, pueden producirse lesiones graves, muerte o daños en el equipo.

A continuación, se ofrece un ejemplo de instrucciones que crean condiciones lógicas que evitan un bucle infinito entre el salto y su destino:

aaa:=0;
_label1: aaa:=aaa+1;
(*instructions*)
IF (aaa < 10) THEN
JMP _label1;
END_IF;

Mientras la variable i, que se inicializa con 0, tenga un valor inferior a 10, la instrucción de salto del ejemplo anterior afectará a un retorno repetido de la línea de programa definida por la etiqueta _label1. Por lo tanto, afectará a un procesamiento repetido de las instrucciones comprendido entre la etiqueta y la instrucción JMP. Puesto que estas instrucciones también incluyen el incremento de la variable i, la condición de salto se infringirá (en la novena comprobación) y el flujo del programa continuará.

También puede conseguir esta funcionalidad mediante un bucle WHILE o REPEAT en el ejemplo. Por lo general, el uso de instrucciones de salto reduce la legibilidad del código.

Comentarios en ST

Existen 2 posibilidades para escribir comentarios en un objeto de texto estructurado:

  • Inicie el comentario con (* y ciérrelo con *). Esto permite insertar comentarios que abarcan varias líneas. Ejemplo: (*Esto es un comentario.*)

  • Comentarios de una sola línea como extensión al estándar IEC 61131-3: // indica el inicio de un comentario que finaliza al final de la línea. Ejemplo: // Esto es un comentario.

Puede colocar los comentarios en cualquier lugar de la parte de declaración o implementación del editor ST.

Comentarios anidados: puede colocar comentarios dentro de otros comentarios.

Ejemplo

(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)

En este ejemplo, el comentario que empieza con el primer paréntesis no se cierra con el paréntesis a continuación de checked, sino con el último paréntesis.