5 PLCs e Norma IEC 61131-3
5.4 Linguagens de programação textuais
5.4.1 Instruction List (IL)
IL é uma linguagem de baixo nível semelhante a Assembly. É uma linguagem popular para algoritmos relativamente simples. Apesar de ser considerada por muitos a mais aborrecida de programar, é a mais rápida a executar. Consiste numa sequencia de instruções que são executadas pela ordem por que se encontram. Cada instrução deve começar numa nova linha e deve conter um operador com um ou mais operandos (separados por vírgulas). Esta linguagem possui um acumulador, que guarda um valor a ser usado pelos operadores. A Tabela 5.1 apresenta uma lista de operadores desta linguagem com a respectiva descrição e exemplo de utilização.
Tabela 5.1: Operadores da linguagem IL.
Operador Descrição Exemplo
LD Load: Carrega o valor do operando no acumulador.
LD 5
Acumulador fica com valor 5. ST Store: Armazena o valor do acumulator para a
variável do operando.
LD 5 ST Var
Var fica com o valor 5 AND Realiza a operação AND com o acumulator e
com o operando.
LD true AND false
Acumulador fica com valor
false.
ANDN Realiza a operação AND com o acumulator e com a negação do operando.
LD true ANDN false
Acumulador fica com valor
true.
OR Realiza a operação OR com o acumulator e com o operando.
LD false OR true
PLCs e Norma IEC 61131-3
Acumulador fica com valor
true.
ORN Realiza a operação OR com o acumulator e com a negação do operando.
LD false ORN true
Acumulador fica com valor
false.
NOT O valor actual do acumulador é negado. LD true NOT ST Var
Var fica com valor false. ADD Adição do acumulador e do operando. O
resultado é copiado para o acumulador
LD 6 ADD 2 ST Var
Var fica com o valor 8. SUB Subtracção do acumulator e do operando. O
resultado é copiado para o acumulador.
LD 6 SUB 2 ST Var
Var fica com o valor 4. MUL Multiplicação do acumulator e do operando. O
resultado é copiado para o acumulador.
LD 6 MUL 2 ST Var
Var fica com o valor 12. DIV Divisão do acumulator pelo operando. O
resultado é copiado para o acumulador.
LD 6 DIV 2 ST Var
Var fica com o valor 3. GT Greater than (>): Verifica se o acumulador é
maior que o operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário
false.
LD 2 GT 1
Acumulador fica com valor
true.
GE Greater of equal (>=): Verifica se o acumulador é maior ou igual do que o operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário false.
LD 2 GE 2
Acumulador fica com valor
true.
EQ Equal (=): Verifica se o acumulador é igual ao operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário false.
LD 2 EQ 2
PLCs e Norma IEC 61131-3
true.
NE Not equal (<>): Verifica se o acumulador é diferente do operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário
false.
LD 2 NE 2
Acumulador fica com valor false.
LE Less or equal (<=): Verifica se o acumulador é menor ou igual ao operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário false;
LD 1 LE 2
Acumulador fica com valor
true.
LT Less than(<): Verifica se o acumulador é menor do que o operando. Em caso afirmativo, o acumulador fica com o valor true, caso contrário
false;
LD 1 LE 2
Acumulador fica com valor
true.
JMP Salto incondicional para uma etiqueta JMP FLAG JMPC Salto condicional para uma etiqueta. O salto é
concretizado se o valor do acumulador for true.
LD Var EQ 5
JMPC FLAG
O salto para a eiqueta FLAG é concretizado se a Var possuir o valor 5.
JMPCN Salto condicional para uma etiqueta, after a check if the accumuluator is FALSE
LD Var EQ 5
JMPCN FLAG
O salto para a eiqueta FLAG é concretizado se o valor de Var for diferente de 5.
CAL Faz a chamada a uma Function Block. CALL F_TRIG(Var); RET Retorno incondicional do POU e regresso ao
POU que o chamou.
RETC Retorno condicional do POU e regresso ao POU que o chamou, se o valor do acumulador for true. RETCN Retorno condicional do POU e regresso ao POU
que o chamou, se o valor do acumulador for
false.
5.4.2 Structured Text (ST)
ST é uma linguagem de alto nível que se assemelha a PASCAL. É uma linguagem de grande flexibilidade para algoritmos de controlo.
PLCs e Norma IEC 61131-3
A atribuição de um valor a uma variável é feito colocando “:=” (dois pontos e igual) e o valor de atribuição a seguir ao nome da variável a que se pretende atribuir o valor:
VariavelExemplo := 5;
Neste exemplo, é atribuído o valor 5 a VariavelExemplo. A tabela que se segue, apresenta a lista dos operador desta linguagem.
Tabela 5.2: Operadores da linguagem ST.
Operação Símbolo Exemplo
Negação -, NOT Var1 := -5;
Var2 := NOT Var3;
Exponenciação ** Var := 2**2;
Var fica com o valor 4 (o mesmo que 2 ao quadrado). Multiplicação * ResultadoMultiplicacao := a * b;
Divisão / ResultadoDivisao := a / b;
Adição + ResultadoAdicao := a + b;
Subtracção - ResultadoSubtraccao := a – b; Comparação <, >, <=, >= ResultadoComparação := Var > 3;
É atribuido o valor true à variável ResultadoComparação se Var for maior que 3, ou false em caso contrário.
Igualdade = ResultadoIgualdade := Var = 3;
É atribuido o valor true à variável ResultadoIgualdade se Var for igual a 3, ou false se for diferente.
Desigualdade <> ResultadoDesigualdade := Var <> 3;
É atribuido o valor true à variável ResultadoDesigualdade se Var for diferente de 3, ou false em caso contrário.
Operador 'e' &, AND Var = a AND b; Operador 'ou'
exclusivo
XOR Var = a XOR b;
Operador 'ou'' OR Var = a OR b;
A tabela está ordenada por ordem decrescente de precedência. No entanto, podem ser usados parêntesis para alterar a sua ordem de precedência:
VarResultado := (Var1 + Var2) * Var3; VarResultado2 := Var4 = (Var5 AND Var6);
PLCs e Norma IEC 61131-3
No primeiro exemplo, o uso dos parêntesis faz com que a soma tenha precedência sobre a multiplicação. E no segundo exemplo, o operador 'e' (AND) tem precedência sobre o operador de igualdade ('=') devido aos parêntesis.
As instruções da linguagem ST estão sumarizadas na Tabela 5.3
Tabela 5.3: Instruções da linguagem ST.
Tipo de instrução Exemplos
IF IF a < b THEN
c := 0; ELSE
c := 1; END_IF
CASE CASE var OF
1: c := 1; 2: c := 2; 3: c := 3; ELSE c := 4; END_CASE FOR FOR i := 1 TO 10 DO a[i] := 0; END_FOR
WHILE WHILE var < 10 DO
var := var + 1; END_WHILE REPEAT REPEAT var := var + 1; UNTIL var = 10 END_REPEAT