Camino:  Programación > Texto Estructurado > Conceitos >

Bucles

Previous pageReturn to chapter overviewNext page

Bucles compatibles y especificados por IEC-61131-3

wpshelp_common_fig_note

¡NOTA!

 

¡Comprueba si el equipo admite bucles!

 

 

 

Bucle - FOR

 

La sentencia FOR permite ejecutar repetidamente una secuencia de instrucciones mientras se asigna una progresión de valores a su variable de control. La sentencia FOR incrementa o decrementa la variable de control desde un valor inicial hasta un valor final determinado por una expresión. Si se omite la cláusula BY, el valor de incremento por defecto es 1. Tanto el valor inicial como el final deben ser expresiones del mismo tipo entero (por ejemplo, USINT, INT, WORD o DINT).

 

 

 

FOR <contador> := <valor inicial> TO <valor final> {BY <incremento>} DO

   <instrucciones>

 

END_FOR

 

 

La sección dentro de las llaves {} es opcional

 

WPS ejecuta <instrucciones> hasta que el <contador> alcance el <valor final>. Para incrementos positivos, la ejecución continúa hasta que el <contador> supere el <valor final>. Para incrementos negativos, la ejecución continúa hasta que el <contador> sea menor que el <valor final>. Esta condición se verifica antes de ejecutar las <instrucciones>.

 

 

Ejemplo

 

El siguiente ejemplo muestra una forma de utilizar el bucle FOR para encontrar el valor más grande en una ARRAY global de tipo USINT.

 

VAR

   addr : WORD;

   currentValue : USINT;

   maxValue : USINT;

   arr : ARRAY[0..5] OF USINT := [17, 9, 30, 25, 59, 41];

END_VAR

 

currentValue := 0;

maxValue := 0;

 

FOR addr := 0 TO 10 BY 1 DO

   currentValue := arr[addr];

  IF currentValue > maxValue THEN

       maxValue := currentValue;

  END_IF

END_FOR

 

Al final de la ejecución del código de ejemplo, el valor de maxValue debe ser 59.

 

 

 

Bucle - WHILE

 

En una sentencia WHILE, la secuencia de instrucciones encerradas hasta la palabra clave END_WHILE se ejecuta repetidamente mientras la <expresión booleana> se evalúe como verdadera. Si la <expresión booleana> es falsa desde el inicio, las instrucciones no se ejecutan en absoluto.

 

WHILE <expresión booleana> DO

 

   <instrucciones>

 

END_WHILE

 

 

Ejemplo

 

El siguiente ejemplo demuestra un bucle WHILE que se ejecuta diez veces.

 

VAR

   counter : USINT;

END_VAR

 

counter := 0;

 

WHILE counter < 100 DO

   counter := counter + 10;

END_WHILE    

 

Al final de la ejecución del código de ejemplo, el valor del contador debe ser 100.

 

 

Bucle - REPEAT

 

En la sentencia REPEAT, la secuencia de instrucciones (<instrucciones>) agrupadas hasta la palabra clave UNTIL se ejecuta repetidamente al menos una vez, hasta que la condición booleana asociada a ella (<expresión booleana>) sea verdadera.

 

REPEAT

 

   <instrucciones>

 

UNTIL <expresión booleana>

END_REPEAT

 

 

Ejemplo

 

El siguiente ejemplo ilustra el uso de un bucle REPEAT para encontrar el múltiplo más pequeño de 13 que sea diferente de 13.

 

VAR

   number : INT;

   module : INT;

   result : INT;

   found : BOOL;

END_VAR

 

number := 1;

result := 1;

found := FALSE;

 

REPEAT

   module := number MOD 13;

   IF (module = 0) and (module <> 13) THEN

      result := number;

      found := TRUE;

   END_IF

   number := number + 1;

UNTIL found

END_REPEAT    

 

Al final de la ejecución del código de ejemplo, el valor del resultado debe ser 26.

 

 

 

Declaración - CONTINUE

 

La sentencia CONTINUE omite las instrucciones restantes en la iteración actual de un bucle, pasando inmediatamente a la siguiente iteración. Aplica desde la palabra clave CONTINUE hasta la palabra clave de terminación del bucle (END_FOR, END_WHILE o END_REPEAT).

 

Ejemplo

 

El siguiente ejemplo muestra una forma de utilizar la sentencia CONTINUE para encontrar la suma de los números pares del 0 al 9.

 

VAR

   number : INT;

   module : INT;

   result : INT;

END_VAR

 

number := 0;

module := 0;

result := 0;

 

WHILE number < 10 DO

   module := number MOD 2;

   IF module <> 0 THEN

      number := number + 1;

       CONTINUE

   END_IF

   result := result + number;

   number := number + 1;

END_WHILE        

 

Al final de la ejecución del código de ejemplo, el valor del resultado debe ser 20.

 

 

Declaración - EXIT

 

La sentencia EXIT se utiliza en un bucle FOR, WHILE o REPEAT para terminar el bucle, independientemente de otras condiciones de finalización.

 

Cuando se utiliza la sentencia EXIT dentro de bucles anidados, provoca la salida del bucle más interno en el que aparece la palabra clave EXIT. El control se transfiere entonces a la instrucción que sigue al terminador del bucle más cercano (como END_FOR, END_WHILE o END_REPEAT) después de la sentencia EXIT.

 

Ejemplo

 

El siguiente ejemplo demuestra cómo utilizar la sentencia EXIT para salir del bucle FOR cuando se encuentra el índice del array que coincide con el número deseado.

 

VAR

   idx : WORD;

   currentValue : USINT;

   targetValue : USINT;

   found : BOOL;

   arr : ARRAY[0..5] OF USINT := [17, 9, 30, 25, 59, 41];

END_VAR

 

currentValue := 0;

targetValue := 25;

found := FALSE;

 

FOR idx := 0 TO 10 BY 1 DO

   currentValue := arr[idx];

  IF currentValue = targetValue THEN

       found := TRUE;

       EXIT

  END_IF

END_FOR

 

Al final de la ejecución del código, el valor de idx debería ser 3, lo que indica el índice donde se encuentra el número 25 en el array.