REPEAT_UNTIL
Use el lazo REPEAT_UNTIL para seguir ejecutando una acción hasta que las condiciones sean verdaderas.
Operandos
REPEAT
<statement>;
Texto estructurado
Operando | Tipo | Formato | Introducir |
bool_ expresión | BOOL | Expresión de etiqueta | Etiqueta o expresión BOOL que evalúa hasta un valor BOOL (expresión BOOL) |
IMPORTANTE:
- No realice demasiadas iteraciones del lazo en un mismo escaneado.
- El controlador no ejecuta otras instrucciones de la rutina hasta completar el lazo.
- Se produce un fallo grave si la ejecución del lazo supera el temporizador de vigilancia para la tarea.
- Considere la posibilidad de usar otro construción, como IF_THEN.
Descripción
La sintaxis es:

Los siguientes diagramas muestran cómo se ejecuta un lazo REPEAT_UNTIL y cómo sale del lazo de forma prematura una instrucción EXIT.
Mientras el valor de bool_expression sea falso, el controlador ejecutará únicamente las instrucciones que se encuentren dentro del lazo REPEAT_UNTIL.

Para detener el lazo antes de que las condiciones sean falso, use una instrucción EXIT.

Afecta a las marcas de estado matemáticas
No
Condiciones de fallo
Se producirá un fallo mayor si | Tipo de fallo | Código de fallo |
El lazo de la construcción es demasiado largo | 6 | 1 |
Ejemplo 1
Si se lleva a cabo lo siguiente, | Introduzca este texto estructurado |
El lazo REPEAT_UNTIL ejecuta las declaraciones de la construcción y después determina si el valor de las condiciones es verdadero antes de volver a ejecutar las instrucciones. Esto se distingue del lazo WHILE_DO porque este evalúa sus condiciones primero. Si el valor de las condiciones es verdadero, el controlador ejecuta las instrucciones que se encuentren dentro del lazo. Las instrucciones de un lazo REPEAT_UNTIL siempre se ejecutan al menos una vez. Puede que las instrucciones de un lazo WHILE_DO nunca lleguen a ejecutarse. | pos := -1; |
REPEAT | |
pos := pos + 2; | |
UNTIL ((pos = 101) OR (structarray[pos].value = targetvalue)) | |
end_repeat; |
Ejemplo 2
Si se lleva a cabo lo siguiente, | Introduzca este texto estructurado |
Mover caracteres ASCII de una matriz SINT a una etiqueta de cadena. (En una matriz SINT cada elemento tiene un carácter). Detener al alcanzar el retorno de carro. Inicializar Element_number a 0. Cuente el número de elementos en SINT_array (matriz que contiene los caracteres ASCII) y almacene el resultado en SINT_array_size (etiqueta DINT). Establecer String_tag[element_number] = el carácter en SINT_array[element_number]. Añadir 1 al valor de element_number. Esto permite que el controlador compruebe el siguiente carácter en SINT_array. Establecer el miembro Length de String_tag = element_number. (Esto registra el número de carácteres que hay en String_tag hasta el momento). Si element_number = SINT_array_size, a continuacion se detiene. (Se encuentra al final de la matriz y no contiene un retorno de carro). Si el carácter en SINT_array[element_number] = 13 (valor decimal del retorno de carro), parar. | element_number := 0; |
SIZE(SINT_array, 0, SINT_array_size); | |
Repeat | |
String_tag.DATA[element_number] := SINT_array[element_number]; | |
element_number := element_number + 1; | |
String_tag.LEN := element_number; | |
If element_number = SINT_array_size then | |
exit; | |
end_if; | |
Until SINT_array[element_number] = 13 | |
end_repeat; |
Entregue su opinión