Las instrucciones describen qué se debe hacer con las expresiones especificadas.
En ST se pueden utilizar las instrucciones siguientes:
Instrucción |
Ejemplo |
---|---|
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); |
RETURN; |
|
D:=B*B; |
|
CASE INT1 OF |
|
J:=101; |
|
J:=1; |
|
J:=-1; |
|
EXIT; |
|
CONTINUE; |
|
label1: i:=i+1; |
|
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.
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
REF= <variable>
Ejemplo
A : 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);
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.
Con la instrucción IF se puede probar una condición y, en función de esta condición, 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.
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:
oSi la variable de <Var1> tiene el valor <Valor I>, se ejecutará la instrucción <Instrucción I>.
oSi <Var 1> no tiene ninguno de los valores indicados, se ejecutará la <Instrucción ELSE>.
oSi 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.
oSi 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;
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, entonces 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.
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.
|
BUCLE INFINITO QUE PROVOCA UN FUNCIONAMIENTO IMPREVISTO DEL EQUIPO |
Asegúrese de que el tipo de variable utilizado en las instrucciones FOR tenga suficiente capacidad (tenga un límite superior suficientemente elevado) para ajustarse al <VALOR_FINAL> + 1. |
El incumplimiento de estas instrucciones puede causar la muerte, lesiones serias o daño al equipo. |
Puede utilizar la instrucción CONTINUE en un bucle FOR. Se trata de una extensión del estándar IEC 61131-3.
Una alternativa al bucle FOR es el bucle WHILE, que ejecuta el bucle si, y mientras, una condición booleana tenga, y siga teniendo, el valor 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.
|
BUCLE INFINITO QUE PROVOCA UN FUNCIONAMIENTO IMPREVISTO DEL EQUIPO |
Asegúrese de que el bucle WHILE finalice en las instrucciones del bucle creando una condición FALSE de la expresión booleana. |
El incumplimiento de estas instrucciones puede causar la muerte, lesiones serias o daño al 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
La instrucción REPEAT aún no se ha introducido, por lo que se mueve el párrafo (con modificación) a la parte inferior.
Puede utilizar la instrucción CONTINUE en un bucle WHILE.
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 sólo 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.
|
BUCLE INFINITO QUE PROVOCA UN FUNCIONAMIENTO IMPREVISTO DEL EQUIPO |
Asegúrese de que el bucle REPEAT finalice en las instrucciones del bucle creando una condición TRUE de la expresión booleana. |
El incumplimiento de estas instrucciones puede causar la muerte, lesiones serias o daño al 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.
En cierto sentido, los bucles WHILE y REPEAT son más potentes que el bucle FOR, ya que no es necesario conocer el número de ciclos antes de ejecutar el bucle. En algunos casos, sólo podrá trabajar con estos dos tipos de bucle. Sin embargo, si la cantidad de ciclos de bucles está clara, es preferible un bucle FOR, ya que, en la mayoría de los casos, excluye de forma inherente los bucles infinitos (consulte el mensaje de peligro en el párrafo sobre el bucle FOR).
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;
La instrucción EXIT finaliza el bucle FOR, WHILE o REPEAT en el que se encuentra sin tener en cuenta ninguna condición.
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.
|
BUCLE INFINITO QUE PROVOCA UN FUNCIONAMIENTO IMPREVISTO DEL EQUIPO |
Asegúrese de que el uso de la instrucción JMP sea condicional de modo que no tenga como resultado un bucle infinito. |
El incumplimiento de estas instrucciones puede causar la muerte, lesiones serias o daño al 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.
Existen 2 posibilidades para escribir comentarios en un objeto de texto estructurado:
oInicie el comentario con (* y ciérrelo con *). Esto permite insertar comentarios que abarcan varias líneas. Ejemplo: (*Esto es un comentario.*)
oComentarios 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.