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 en 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.
Operador 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 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 sólo 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 sólo 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 sólo 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, entonces 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>, <INT_Var>
se aumenta en <Tamaño del 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. Entonces 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, entonces las <instrucciones> sólo 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, la instrucción CONTINUE
se admite en bucles FOR
, WHILE
y REPEAT
. CONTINUE
permite que la ejecución continúe con el siguiente ciclo de 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.
Puede colocar comentarios en cualquier lugar de la parte de declaración o implementación del editor ST.
Existen dos opciones para escribir comentarios en un objeto de texto estructurado:
Iniciar el comentario con (*
y cerrarlo con *)
. Esto permite insertar comentarios que abarcan varias líneas.
Ejemplo: (*This is a comment.*)
Utilice comentarios de una sola línea como extensión del estándar IEC 61131-3 marcados de dos maneras diferentes:
//
indica el comienzo de un comentario que termina con el final de la línea.
Ejemplo: // This is a comment.
///
indica el comienzo de un comentario que termina con el final de la línea.
Ejemplo: /// This is a comment.
Ejemplo de comentarios para información sobre herramientas y documentación de POU:
A tooltip in the header of a POU is defined by the following comment:
// tooltip text – line 1
// tooltip text – line 2
// tooltip text – line 3
Afterwards the documentation is defined as follows:
/// reStructuredText
Para obtener más información sobre cómo gestionar estos dos tipos de comentarios al crear documentación de bibliotecas mediante la herramienta CODESYS LibDoc Scripting Collection con la propiedad LibDocContent, consulte Propiedades de bibliotecas.
Comentarios intercalados: 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.