Operações de Comparação
Lógica de decisão e Intervalos
A comparação de valores é o motor da lógica de decisão industrial. Domine os comparadores padrão, os testes de intervalo e as verificações de validade.
O que são operações de comparação no TIA Portal?
As operações de comparação permitem comparar dois valores do mesmo tipo de dados (Inteiros, Reais, Tempo, etc.) ou verificar se un valor se situa dentro ou fora de um intervalo definido. São fundamentais para criar limiares de alarme, condições de transição e malhas de regulação.
O TIA Portal oferece comparadores padrão (==, <>, >=, etc.), instruções de intervalo (IN_Range, OUT_Range), testes de validade para números de vírgula flutuante e instruções avançadas para tipos de dados Variant e ponteiros DB.
Comparadores Padrão
Avaliação da igualdade e desigualdades entre dois operandos
CMP == — Igual (Equal)
==O que faz
Compara dois operandos (IN1 e IN2). Se IN1 for igual a IN2, a instrução devolve TRUE. Suporta quase todos os tipos de dados simples.
Quando usar
Verificar se um contador atingiu o seu objetivo, se um setpoint HMI corresponde ao valor atual, ou se um estado específico da máquina está ativo.
Dicas Pro
Atenção com os tipos Real: a igualdade estrita pode falhar devido à precisão. Prefira uma margem ou intervalo.
Em SCL: IF value1 = value2 THEN ...
Pode comparar cadeias de caracteres (String) para verificar códigos de identificação.
CMP <> — Diferente (Not equal)
<>O que faz
Devolve TRUE se ambos os operandos IN1 e IN2 forem diferentes. É o inverso da igualdade.
Quando usar
Detetar uma alteração de valor, assegurar que um sensor não devolve 0, ou verificar que um modo de funcionamento não é o proibido.
Dicas Pro
Frequentemente utilizado para disparar uma ação assim que um valor se desvia do seu setpoint.
Em SCL: IF value1 <> value2 THEN ...
Pode ser usado para comparar timestamps (DTL) para ver se uma data mudou.
CMP >= — Maior ou igual
>=O que faz
Devolve TRUE se o primeiro valor (IN1) for maior ou igual ao segundo (IN2).
Quando usar
Disparar um alarme de nível alto, permitir o aquecimento enquanto uma temperatura não for atingida.
Dicas Pro
Ideal para limiares de segurança onde o valor limite deve ser incluído na condição.
Em SCL: IF level >= setpoint THEN ...
Pode ser usado com tipos Time para verificar se decorreu uma duração mínima.
CMP <= — Menor ou igual
<=O que faz
Devolve TRUE se IN1 for menor ou igual a IN2.
Quando usar
Monitorização de baixo nível, paragem de uma bomba, validação de uma pressão mínima.
Dicas Pro
Muitas vezes acoplado a uma histerese para evitar oscilações na saída.
Funciona nativamente com os tipos Date e Time.
Em SCL: IF pressure <= min_limit THEN ...
CMP > — Maior (Greater than)
>O que faz
Devolve TRUE se IN1 for estritamente maior que IN2.
Quando usar
Comparação estrita que não deve incluir o valor alvo.
Dicas Pro
Menos usado que >= em automação, mas útil para algoritmos matemáticos.
Em SCL: IF current > max THEN ...
Preferível para comparações de índices de ciclos (FOR).
CMP < — Menor (Less than)
<O que faz
Devolve TRUE se IN1 for estritamente menor que IN2.
Quando usar
Testes de limites inferiores estritos.
Dicas Pro
Útil para verificar se um valor está 'no negativo' (val < 0).
Em SCL: IF val < 0 THEN ...
Funciona com caracteres (ordem alfabética).
Operações de Intervalo
Verificação de pertença a um intervalo [MIN..MAX]
IN_Range — Dentro do intervalo
IN_RangeO que faz
Verifica se um valor (VAL) se encontra entre um limite mínimo (MIN) e um limite máximo (MAX). O intervalo é fechado: MIN <= VAL <= MAX.
Quando usar
Monitorização de janela de funcionamento (ex: pressão entre 2 e 5 bar), validação de velocidade da máquina.
Dicas Pro
Substitui vantajosamente dois comparadores colocados em série, tornando o segmento mais legível.
Se MIN > MAX, a instrução devolve sempre FALSE.
Muito útil para os 'Ready to Run' que exigem várias condições analógicas.
OUT_Range — Fora do intervalo
OUT_RangeO que faz
Devolve TRUE se o valor (VAL) estiver fora do intervalo definido por MIN e MAX. Ou VAL < MIN, ou VAL > MAX.
Quando usar
Deteção de anomalia ou superação de limiares extremos (alarme de intervalo).
Dicas Pro
É o inverso exato de IN_Range.
Use-o para simplificar a lógica de alarme de processo.
Em SCL: res := (val < min) OR (val > max);
Testes de Validatde
Verificação da integridade dos números de vírgula flutuante
|OK| — Verificar validade
|OK|O que faz
Verifica se um valor flutuante (Real ou LReal) é um número válido. Devolve FALSE se o valor for NaN (Not a Number) ou Inf (Infinito).
Quando usar
Após cálculos complexos (divisões, raízes quadradas, log) para evitar propagar erros matemáticos que poderiam parar o PLC.
Dicas Pro
Indispensável antes de enviar um valor Real para uma saída analógica ou um variador.
Permite detetar uma divisão por zero indireta.
Prático para filtrar os retornos de sensores avariados.
|NOT_OK| — Verificar invalidade
|NOT_OK|O que faz
Devolve TRUE se o valor flutuante for inválido (NaN ou Inf).
Quando usar
Ativar um bit de falha de cálculo ou forçar um valor de segurança.
Dicas Pro
Use-o para colocar a sua máquina em segurança se um cálculo de trajetória falhar.
É o equivalente a IS_NAN noutras linguagens.
Em SCL: IF NOT OK(value) THEN ...
Comparações avançadas (Variant)
Instruções para programação dinâmica e tipos complexos
EQ_Type / NE_Type
O que faz
Compara o tipo de dados de uma variável de tipo Variant com o de outra variável ou de um tipo definido.
Quando usar
Em blocos genéricos que devem processar diferentes tipos de dados (ex: um bloco de log que aceita Int ou Real).
Dicas Pro
Essencial para programação orientada a objetos e bibliotecas reutilizáveis.
Permite assegurar os acessos à memória dinâmicos.
Usado com a instrução VariantGet.
IS_NULL / NOT_NULL
O que faz
Verifica se um ponteiro (Variant ou DB_ANY) é nulo (não aponta para nada).
Quando usar
Evitar erros de acesso ao utilizar DB endereçados indiretamente.
Dicas Pro
Testar sempre NOT_NULL antes de chamar um método ou ler um dado através de um ponteiro.
Equivalente ao objeto 'Nothing' ou 'null' em C#/Java.
Indispensável para a gestão de listas ligadas ou estruturas dinâmicas em PLC.
IS_ARRAY
O que faz
Verifica se uma variável Variant aponta para um array (Array).
Quando usar
Programação de funções de processamento por lotes ou buffers de dados.
Dicas Pro
Acople-o com CountOfElements para conhecer o tamanho do array.
Permite criar funções de ordenação universais.
Funciona também para arrays de estruturas (UDT).
Comparação dos comparadores — Qual usar?
Escolher a instrução certa para a sua lógica PLC
| Você quer... | Use isto | Exemplo |
|---|---|---|
| Testar igualdade exata | CMP == | Código de produto correto |
| Limiar de segurança alto | CMP >= | Pressão > 10 bar |
| Manter numa zona | IN_Range | Temp entre 18 e 24°C |
| Monitorizar erros Real | |OK| | Verificar resultado divisão |
| Verificar ponteiro DB | NOT_NULL | DB de receita carregado |
| Verificar tipo Variant | EQ_Type | A entrada é Int |
Perguntas Frequentes
Porque é que a minha comparação == falha às vezes com números Real?
Os números Real (vírgula flutuante) têm uma precisão limitada. Um cálculo pode dar 10.000001 em vez de 10.0. Use sempre IN_Range com uma pequena tolerância (ex: entre 9.99 e 10.01) para comparar valores flutuantes.
Qual é a diferença entre IN_Range e dois comparadores em série?
Funcionalmente é idêntico. No entanto, IN_Range é graficamente mais compacto, mais fácil de ler e mais eficiente, pois o PLC processa a instrução num único passo.
Para que servem as instruções |OK| e |NOT_OK|?
Servem para detetar erros 'silenciosos' dos cálculos Real. Se fizer uma raiz quadrada de um número negativo, o resultado é NaN. Sem o teste |OK|, esse NaN contaminaria todos os outros cálculos e poderia causar uma paragem do CPU.
Pode-se comparar estruturas completas (UDT)?
A instrução CMP == não permite comparar diretamente duas estruturas. Deve comparar cada membro individualmente ou utilizar um bloco específico que compare as zonas de memória.