Laços de Repetição suportados e especificados pela IEC-61131-3
|
NOTA!
Verificar se equipamento possui suporte a laços de repetição!
|
Laço de Repetição - FOR
A instrução FOR possibilita que uma sequência de instruções seja executada repetidamente, enquanto uma progressão de valores é atribuída a sua variável de controle. A instrução FOR incrementa ou decrementa a variável de controle de um valor inicial até um valor final determinado pelo valor de uma expressão. Se a construção BY for omitida, o valor de incremento será padronizado para 1. O valor inicial e o valor final da variável de controle devem ser expressões do mesmo tipo de número inteiro (por exemplo, USINT, INT, WORD e DINT).
FOR <contador> := <valor inicial> TO <valor final> {BY <incremento>} DO
<instruções>
END_FOR
|
|---|
A seção dentro das chaves {} é opcional.
O WPS executa as <instruções> enquanto o <contador> não atingir o <valor final>. Para incrementos positivos, a execução ocorre até o <contador> ser maior que o <valor final>. Para incrementos negativos, a execução ocorre até o <contador> ser menor que o <valor final>. Essa verificação é realizada antes da execução das <instruções>.
Exemplo
O exemplo abaixo exibe uma forma de usar o laço de repetição FOR para encontrar o maior valor em um array global do 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 |
|---|
Ao final da execução do código exemplo, o valor de maxValue será 59.
Laço de Repetição - WHILE
Na instrução WHILE, a sequência de instruções agrupadas até a palavra-chave END_WHILE é executada repetidamente até que a <expressão booleana> seja falsa. Se inicialmente a <expressão booleana> for falsa, o grupo de instruções não será executado.
WHILE <expressão booleana> DO
<instruções>
END_WHILE
|
|---|
Exemplo
O exemplo abaixo exibe um laço de repetição WHILE que se repete dez vezes.
VAR counter : USINT; END_VAR
counter := 0; WHILE counter < 100 DO counter := counter + 10; END_WHILE |
|---|
Ao final da execução do código exemplo, o valor de counter será 100.
Laço de Repetição - REPEAT
Na instrução REPEAT, a sequência de instruções (<instruções>) agrupada até a palavra-chave UNTIL é executada repetidamente pelo menos uma vez, até que a condição booleana associada a ela (<expressão booleana>) seja verdadeira.
REPEAT
<instruções>
UNTIL <expressão booleana> END_REPEAT
|
|---|
Exemplo
O exemplo abaixo exibe uma forma de usar o laço de repetição REPEAT para encontrar o menor número divisível por 13 que seja diferente dele mesmo.
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 |
|---|
Ao final da execução do código exemplo, o valor de result será 26.
Instrução - CONTINUE
A instrução é utilizada para ignorar as instruções restantes da iteração atual do laço de repetição, a partir da palavra-chave CONTINUE até o terminador do laço (END_FOR, END_WHILE ou END_REPEAT).
Exemplo
O exemplo abaixo exibe uma forma de usar a instrução CONTINUE para encontrar a soma dos números pares de 0 a 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 |
Ao final da execução do código exemplo, o valor de result será 20.
Instrução - EXIT
A instrução EXIT é usada em um loop FOR, WHILE ou REPEAT para encerrar o loop independentemente de outras condições de término.
Quando a instrução EXIT está localizada dentro de iterações aninhadas, a saída ocorre do laço mais interno onde a palavra-chave EXIT está presente. Ou seja, o controle é transferido para a instrução seguinte ao primeiro terminador de loop (como END_FOR, END_WHILE ou END_REPEAT) após a declaração EXIT.
O exemplo abaixo demonstra como usar a instrução EXIT para sair do loop FOR ao encontrar o índice do array que corresponde ao número desejado.
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 |
Ao final da execução do código, o valor de idx será 3, indicando o índice onde o número 25 está localizado no array.
.