EcoStruxure Machine Expert versión 1.1 no soporta los controladores M258, LMC058 y LMC078.

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 restableci­miento 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);

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, 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 <instruccio­nes_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.

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:

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;

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, 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.

Warning_Color.gifADVERTENCIA

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.

Bucle WHILE

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.

Warning_Color.gifADVERTENCIA

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.

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 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.

Warning_Color.gifADVERTENCIA

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).

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.

Warning_Color.gifADVERTENCIA

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.

Comentarios en ST

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.