Bucles compatibles y especificados por IEC-61131-3
|
¡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.