Las instrucciones describen qué se debe hacer con las expresiones especificadas.
En ST se pueden utilizar las instrucciones siguientes:
Instrucción |
Ejemplo |
---|---|
|
|
Llamar a un bloque de funciones y utilizar la salida del bloque de funciones |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
instrucción vacía |
|
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.
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;
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);
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.
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.
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;
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
.
FOR
.
ADVERTENCIA | |
---|---|
Puede utilizar la instrucción CONTINUE
en un bucle FOR
. Se trata de una extensión del estándar IEC 61131-3.
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 | |
---|---|
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
.
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 | |
---|---|
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.
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;
EXIT
La instrucción EXIT
finaliza el bucle FOR
, WHILE
o REPEAT
en el que se encuentra sin tener en cuenta ninguna condició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 | |
---|---|
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.
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.