WHILE_DO
Use el lazo WHILE_DO para seguir realizando una acción mientras el valor de ciertas condiciones sea verdadero.
Operandos
WHILE bool_expression DO
<statement>;
Texto estructurado
Operando | Tipo | Formato | Descripción |
|---|---|---|---|
bool_expression | BOOL | etiqueta expresión | Etiqueta o expresión BOOL que evalúa hasta un valor BOOL |
IMPORTANTE:
- No realice demasiadas iteraciones del lazo en un mismo escaneado.
- El controlador no ejecuta otras instrucciones de la rutina hasta que complete 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 WHILE_DO y cómo sale del lazo de forma prematura mediante una instrucción EXIT.
![]() | ![]() |
Mientras bool_expression sea verdadero, el controlador ejecuta únicamente las instrucciones que se encuentren dentro del lazo WHILE_DO. | Para detener el lazo antes de que las condiciones sean verdaderas, 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 WHILE_DO evalúa primero sus condiciones. Si el valor de las condiciones es verdadero, el controlador ejecuta las instrucciones que se encuentren dentro del lazo. Esto es distinto al lazo REPEAT_UNTIL en cuanto a que este ejecuta las declaraciones del construcción y después determina si el valor de las condiciones es verdadero antes de volver a ejecutar las instrucciones. 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 := 0; | |
While ((pos <= 100) & structarray[pos].value <> targetvalue)) do | ||
pos := pos + 2; | ||
String_tag.DATA[pos] := SINT_array[pos]; | ||
end_while; | ||
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). Si el carácter en SINT_array[element_number] = 13 (valor decimal del retorno de carro), parar. Establecer String_tag[element_number] = el carácter en SINT_array[element_number]. Añadir 1 al valor de element_number. Esto deja que el controlador compruebe el siguiente carácter de 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). | element_number := 0; |
SIZE(SINT_array, 0, SINT_array_size); | |
While SINT_array[element_number] <> 13 do | |
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; | |
end_while; |
Entregue su opinión

