Operações lógicas de bits
Contactos, Bobinas e Deteção de Flancos
O coração da programação de PLCs. As instruções lógicas de bits lidam com todas as operações booleanas — desde simples contactos e bobinas até flip-flops e deteção de flancos. Domine-as e poderá construir qualquer lógica de automação.
O que são operações lógicas de bits?
As operações lógicas de bits são as instruções mais fundamentais na programação de PLCs. Elas trabalham com sinais booleanos (TRUE/FALSE, 1/0) — lendo estados de entrada, combinando condições com lógica AND/OR e controlando saídas. No LAD, estas aparecem como contactos e bobinas em linhas (rungs). No FBD, aparecem como caixas de portas AND/OR/NOT.
Todos os programas de PLC utilizam extensivamente instruções lógicas de bits. Um circuito de partida/parada de motor, uma condição de alarme, um intertravamento de válvula — todos começam com contactos lendo estados de sensores e terminam com bobinas acionando atuadores.
Contactos — Leitura de estados de entrada
Os contactos leem o estado booleano de uma tag e transmitem-no ao longo da cadeia lógica
Contacto Normalmente Aberto
—| |—O que faz
Lê uma tag booleana (BOOL). Se a tag for TRUE (1), o contacto fecha e passa a energia (RLO = TRUE) para o elemento seguinte. Se a tag for FALSE (0), o contacto está aberto e bloqueia o fluxo de energia. Esta é a instrução mais utilizada na programação LAD.
Quando usar
Sempre que precisar de verificar se uma condição é TRUE: um botão está pressionado? Um sensor está ativo? Um flag está definido? Coloque um contacto normalmente aberto e atribua a sua tag a ele.
Dicas profissionais
O nome 'Normalmente Aberto' vem da lógica de relés — o contacto está aberto (não passa corrente) no seu estado normal/repouso. Fecha quando energizado.
Múltiplos contactos NA em série criam uma lógica AND. Múltiplos contactos NA em ramos paralelos criam uma lógica OR.
No FBD, o equivalente é simplesmente ligar uma variável BOOL a uma entrada de caixa AND/OR — não é necessário um símbolo de contacto explícito.
Contacto Normalmente Fechado
—|/|—O que faz
O inverso de um contacto normalmente aberto. Se a tag for FALSE (0), o contacto está fechado e passa energia. Se a tag for TRUE (1), o contacto abre e bloqueia a energia. Atua como uma operação NOT no valor da tag.
Quando usar
Quando precisar de verificar se uma condição NÃO é verdadeira: paragem de emergência não pressionada, nenhum erro ativo, interruptor de limite não atingido. Muito comum para intertravamentos de segurança e condições de alarme.
Dicas profissionais
Use contactos NF para paragens de emergência e circuitos de segurança — eles são seguros contra falhas. Se o fio quebrar, o contacto NF abre e para a máquina.
No FBD, o equivalente é uma entrada negada (pequeno círculo no pino de entrada de uma caixa AND/OR).
Não confunda a instrução de contacto NF com um botão de pressão fisicamente NF. São conceitos independentes.
Inverter RLO
—|NOT|—O que faz
Inverte (nega) o atual Resultado da Operação Lógica (RLO). Se a cadeia lógica até este ponto avaliar como TRUE, o NOT torna-a FALSE, e vice-versa. Opera no resultado lógico acumulado, não numa tag específica.
Quando usar
Quando precisar de inverter uma expressão lógica complexa em vez de uma única tag. Em vez de reescrever toda a condição com contactos invertidos, coloque NOT no final para inverter o resultado.
Dicas profissionais
O NOT inverte todo o RLO nesse ponto da cadeia — é diferente de um contacto NF que inverte apenas uma tag.
No FBD, use a caixa NOT ou negue a saída de uma porta lógica.
Use com moderação — o uso excessivo de NOT torna a lógica difícil de ler. Frequentemente, a reestruturação da lógica é mais clara.
Bobinas — Controle de saídas
As bobinas escrevem o resultado da cadeia lógica numa tag de saída
Atribuição
—( )—O que faz
Escreve o atual RLO (Resultado da Operação Lógica) numa tag booleana. Se a cadeia lógica for TRUE, a tag torna-se TRUE. Se for FALSE, a tag torna-se FALSE. Esta é a bobina de saída padrão — reflete diretamente a lógica de entrada em cada ciclo de varredura (scan).
Quando usar
Para qualquer saída que deva seguir diretamente as suas condições de entrada. Uma lâmpada piloto que está ligada quando um motor funciona, uma válvula que abre quando as condições são cumpridas. A saída segue a entrada — quando as condições se tornam FALSE, a saída também se torna FALSE.
Dicas profissionais
A bobina de atribuição é 'não retentiva' — escreve a cada varredura. Se a lógica se tornar FALSE, a saída torna-se imediatamente FALSE.
Uma tag deve ser atribuída apenas numa rede (network). Múltiplas atribuições à mesma tag fazem com que a última prevaleça, levando a comportamentos imprevisíveis.
No FBD, a atribuição é simplesmente ligar a saída de uma porta lógica a uma tag BOOL.
Atribuição Negada
—(/)—O que faz
Escreve o RLO invertido numa tag booleana. Se a cadeia lógica for TRUE, a tag torna-se FALSE. Se a cadeia lógica for FALSE, a tag torna-se TRUE. Combina Atribuição + NOT numa única instrução.
Quando usar
Quando uma saída deve estar ativa na condição oposta. Por exemplo, uma lâmpada 'sistema OK' que se desliga quando uma falha é detetada. Em vez de inverter toda a cadeia lógica, use a bobina negada.
Dicas profissionais
Equivalente a colocar um NOT antes de uma bobina de atribuição regular, mas mais compacto.
Use com cuidado — bobinas negadas podem ser confusas de ler. Às vezes é mais claro reestruturar a lógica.
No FBD, esta é uma ligação de saída negada.
Reset de Saída
—(R)—O que faz
Quando o RLO é TRUE, a tag é definida como FALSE (0). Quando o RLO é FALSE, a tag não é alterada (mantém o seu valor atual). Esta é uma operação unidirecional — só pode desligar coisas, nunca ligar.
Quando usar
Em circuitos Set/Reset: uma rede faz o Set da saída (liga), outra faz o Reset (desliga). Use Reset para condições de paragem, limpeza de falhas e reconhecimento de alarmes. O Reset tem tipicamente prioridade na lógica de segurança.
Dicas profissionais
O Reset só atua quando o seu RLO é TRUE. Quando o RLO é FALSE, a saída permanece inalterada — NÃO a define como TRUE.
Num par S/R, a instrução que aparece por ÚLTIMO no programa tem prioridade (se ambas as condições forem TRUE simultaneamente).
O Reset é retentivo — após um Reset, a saída permanece FALSE até ser explicitamente feito um Set novamente.
Set de Saída
—(S)—O que faz
Quando o RLO is TRUE, a tag é definida como TRUE (1). Quando o RLO é FALSE, a tag não è alterada (mantém o seu valor atual). Esta é uma operação unidirecional — só pode ligar coisas, nunca desligar.
Quando usar
Em circuitos Set/Reset: use Set para condições de partida, sinais de selo e flags de primeira execução. Uma vez feito o Set, a saída permanece TRUE até ser explicitamente feito o Reset — tornando-a 'auto-retentiva' sem precisar de um contacto de selo.
Dicas profissionais
O Set só atua quando o seu RLO é TRUE. Quando o RLO é FALSE, a saída permanece inalterada — NÃO a reseta.
Controle de motor clássico: Rede 1 = Botão Start → Set Motor. Rede 2 = Botão Stop OU Falha → Reset Motor.
Tenha cuidado com tags retentivas em circuitos de segurança — após um ciclo de energia, as saídas em Set podem manter o seu último estado dependendo das configurações do DB.
Operações de Campo de Bits
Definir ou resetar um intervalo de bits numa única operação
SET_BF — Set Campo de Bits
O que faz
Define um grupo contíguo de bits como TRUE a partir de um endereço especificado. Define o bit inicial e o número de bits a definir. Quando o RLO é TRUE, todos os bits especificados são definidos como 1.
Quando usar
Quando precisar de ativar múltiplas saídas relacionadas simultaneamente — por exemplo, definindo todos os bits de uma palavra de status, inicializando um grupo de flags ou ativando um banco de saídas de uma só vez.
Dicas profissionais
Útil para operações em lote em vez de escrever instruções Set individuais para cada bit.
O parâmetro do número de bits determina quantos bits consecutivos são afetados.
Tal como o Set, este só atua quando o RLO é TRUE — os bits não são alterados quando o RLO é FALSE.
RESET_BF — Reset Campo de Bits
O que faz
Reseta um grupo contíguo de bits para FALSE a partir de um endereço especificado. Define o bit inicial e o número de bits a resetar. Quando o RLO é TRUE, todos os bits especificados são limpos para 0.
Quando usar
Quando precisar de limpar múltiplos flags ou saídas de uma só vez — por exemplo, limpando todos os bits de alarme numa palavra de status, resetando um grupo de saídas durante o desligamento ou inicializando uma área de dados.
Dicas profissionais
A contraparte do SET_BF — use-os juntos para operações de Set/Reset ao nível de grupo.
Particularmente útil para limpar palavras de alarme ou registos de status numa única operação.
Tal como o Reset, este só atua quando o RLO é TRUE — os bits não são alterados quando o RLO é FALSE.
Flip-Flops — Circuitos de Selo
Elementos bistáveis que lembram o seu estado até serem explicitamente alterados
SR — Flip-Flop Set/Reset
O que faz
Um flip-flop bistável com prioridade ao Set. Tem duas entradas: S (Set) e R (Reset), e uma saída Q. Quando S=TRUE, Q torna-se TRUE. Quando R=TRUE, Q torna-se FALSE. Quando ambos S e R são TRUE simultaneamente, Q é TRUE (o Set domina).
Quando usar
Para circuitos de selo onde a condição de Set deve ter prioridade. Num flip-flop SR, se ambos start e stop forem pressionados ao mesmo tempo, a saída permanece ligada. Use isto quando a 'prioridade de partida' for aceitável.
Dicas profissionais
SR = Prioridade ao Set. Se S=1 e R=1 → Q=1. Use quando iniciar for mais importante do que parar.
Em aplicações críticas de segurança, prefira RS (prioridade ao Reset) — é mais seguro se ambas as condições ocorrerem simultaneamente.
O flip-flop é uma caixa única tanto em LAD como em FBD com entradas S, R e saída Q.
RS — Flip-Flop Reset/Set
O que faz
Um flip-flop bistável com prioridade ao Reset. Tem duas entradas: R (Reset) e S (Set), e uma saída Q. Quando S=TRUE, Q torna-se TRUE. Quando R=TRUE, Q torna-se FALSE. Quando ambos R e S são TRUE simultaneamente, Q é FALSE (o Reset domina).
Quando usar
Para circuitos de selo onde a segurança é primordial. A condição de Reset (paragem) tem prioridade — se ambos start e stop estiverem ativos, a saída está desligada. Esta é a escolha padrão para controle de motor e intertravamentos de segurança.
Dicas profissionais
RS = Prioridade ao Reset. Se S=1 e R=1 → Q=0. A escolha mais segura para a maioria das aplicações industriais.
Padrão clássico de controle de motor: S = Botão_Start AND NOT Falha, R = Botão_Stop OR Paragem_Emergência OR Falha.
A saída Q é retentiva dentro do ciclo de varredura — mantém o seu valor até que o flip-flop seja avaliado novamente.
Deteção de Flanco — Detetar alterações de sinal
Detetar quando um sinal transita de FALSE→TRUE ou TRUE→FALSE
Varrer operando para flanco positivo
—|P|—O que faz
Deteta um flanco de subida (transição FALSE→TRUE) num operando específico. A instrução compara o valor atual com o valor da varredura anterior. Se o valor mudou de 0 para 1, o RLO é TRUE por exatamente um ciclo de varredura. Requer um bit de memória de flanco (bit M) para armazenar o estado anterior.
Quando usar
Quando precisar de um pulso único a partir de um sinal sustentado: contar pressões de botão, disparar uma única ação numa mudança de nível, incrementar um contador em cada ativação. Sem deteção de flanco, um botão pressionado dispararia a cada ciclo de varredura.
Dicas profissionais
DEVE atribuir um bit de memória de flanco único (bit M) — NÃO reutilize o mesmo bit M para múltiplas deteções de flanco, ou eles interferirão entre si.
A saída é TRUE por exatamente um ciclo de varredura do PLC (tipicamente 1-50ms). Se precisar de um pulso mais longo, use um temporizador.
No LAD, isto aparece como um contacto com a marcação 'P'. A tag do bit M é mostrada acima/abaixo do contacto.
Varrer operando para flanco negativo
—|N|—O que faz
Deteta um flanco de descida (transição TRUE→FALSE) num operando específico. A instrução compara o valor atual com o valor da varredura anterior. Se o valor mudou de 1 para 0, o RLO è TRUE por exatamente um ciclo de varredura. Requer um bit de memória de flanco.
Quando usar
Quando precisar de reagir ao desligamento de um sinal: detetar quando um botão é solto, disparar na desativação de um sensor, ou capturar o momento em que um passo do processo termina.
Dicas profissionais
Mesmas regras que o flanco positivo — cada deteção de flanco negativo precisa do seu próprio bit M único.
Útil para ações de 'libertação de botão': iniciar um temporizador quando um botão é solto, não quando é pressionado.
Numa sequência de desligamento, use flancos negativos para detetar quando cada passo termina (a saída passa de ON para OFF).
Definir operando em flanco positivo
—(P)—O que faz
Define (escreve TRUE em) um operando especificado por um ciclo de varredura quando um flanco positivo (FALSE→TRUE) é detetado no RLO. Combina deteção de flanco e atribuição de saída numa única instrução.
Quando usar
Quando quiser definir um flag ou saída por exatamente uma varredura num flanco de subida, sem precisar de um contacto de deteção de flanco separado seguido por uma bobina.
Dicas profissionais
Esta é uma instrução do tipo bobina — vai no final de uma linha (rung), não no meio.
Requer um bit de memória de flanco tal como a versão de contacto.
O operando é TRUE por apenas uma varredura e depois regressa automaticamente a FALSE.
Definir operando em flanco negativo
—(N)—O que faz
Define (escreve TRUE em) um operando especificado por um ciclo de varredura quando um flanco negativo (TRUE→FALSE) é detetado no RLO. Combina deteção de flanco de descida e atribuição de saída numa única instrução.
Quando usar
Quando quiser definir um flag ou saída por exatamente uma varredura num flanco de descida. Útil para disparar ações pós-desativação.
Dicas profissionais
Instrução do tipo bobina — coloque no final de uma linha.
Requer o seu próprio bit de memória de flanco único.
Frequentemente usada para ações de 'limpeza' que devem acontecer uma vez quando um processo para.
P_TRIG — Varrer RLO para flanco positivo
O que faz
Deteta um flanco de subida no RLO (Resultado da Operação Lógica) em vez de num operando específico. Quando o resultado da lógica combinada transita de FALSE para TRUE, a saída é TRUE por um ciclo de varredura. A memória de flanco é armazenada dentro da instância da instrução.
Quando usar
Quando quiser detetar um flanco de subida numa combinação lógica complexa, não apenas numa única tag. Por exemplo: detetar quando (Sensor1 AND Sensor2 AND NOT Falha) se torna TRUE pela primeira vez.
Dicas profissionais
O P_TRIG opera no RLO acumulado — deteta o flanco de toda a cadeia lógica anterior.
A memória de flanco está incorporada na instrução — não é necessário um bit M separado.
No FBD, o P_TRIG é uma caixa com entrada CLK e saída Q.
N_TRIG — Varrer RLO para flanco negativo
O que faz
Deteta um flanco de descida no RLO. Quando o resultado da lógica combinada transita de TRUE para FALSE, a saída é TRUE por um ciclo de varredura. A memória de flanco é armazenada dentro da instância da instrução.
Quando usar
Quando quiser detetar quando uma condição complexa deixa de ser verdadeira. Por exemplo: detetar o momento em que (Modo_Auto AND Tudo_Limpo) passa de TRUE para FALSE.
Dicas profissionais
O N_TRIG é a contraparte de flanco de descida do P_TRIG.
Não é necessário um bit M separado — a memória de flanco é interna.
Útil para detetar o fim de uma condição combinada em vez de um único sinal.
R_TRIG — Detetar flanco de sinal positivo
O que faz
Um bloco funcional detector de flanco de subida em conformidade com a norma IEC 61131-3. Tem uma entrada CLK e uma saída Q. Quando o CLK transita de FALSE para TRUE, o Q é TRUE por um ciclo de varredura. A memória de flanco é armazenada nos dados de instância do FB.
Quando usar
Quando quiser uma deteção de flanco padrão IEC com os seus próprios dados de instância. O R_TRIG é um bloco funcional — cada instância mantém a sua própria memória de flanco automaticamente. Preferido em código estruturado e reutilizável.
Dicas profissionais
O R_TRIG é um FB — precisa de dados de instância (seja o seu próprio DB ou como multi-instância num FB pai). Isto torna-o autocontido e reutilizável.
Disponível desde a V1.0 nos S7-1200/1500. Esta é a forma padrão IEC 61131-3 de deteção de flancos.
No SCL: meuRTRIG(CLK := meuSinal); IF meuRTRIG.Q THEN ... END_IF;
F_TRIG — Detetar flanco de sinal negativo
O que faz
Um bloco funcional detector de flanco de descida em conformidade com a norma IEC 61131-3. Tem uma entrada CLK e uma saída Q. Quando o CLK transita de TRUE para FALSE, o Q é TRUE por um ciclo de varredura. A memória de flanco é armazenada nos dados de instância do FB.
Quando usar
Quando quiser uma deteção de flanco de descida padrão IEC com os seus próprios dados de instância. O F_TRIG é a contraparte de flanco de descida do R_TRIG.
Dicas profissionais
O F_TRIG é um FB com a sua própria instância — tal como o R_TRIG, é autocontido e compatível com a norma IEC 61131-3.
No SCL: meuFTRIG(CLK := meuSinal); IF meuFTRIG.Q THEN ... END_IF;
Prefira contactos R_TRIG/F_TRIG em vez de |P|/|N| ao escrever código de biblioteca reutilizável, pois não requerem bits M externos.
Referência Rápida — Todas as 20 Instruções Lógicas de Bits
| # | Instrução | Símbolo LAD | Atalho | Descrição |
|---|---|---|---|---|
| 1 | Contacto Normalmente Aberto | —| |— | F9 | Passa energia quando a tag é TRUE |
| 2 | Contacto Normalmente Fechado | —|/|— | F10 | Passa energia quando a tag è FALSE |
| 3 | Inverter RLO | —|NOT|— | — | Inverte o Resultado da Operação Lógica |
| 4 | Atribuição | —( )— | Shift + F7 | Escreve o RLO na tag de saída |
| 5 | Atribuição Negada | —(/)— | — | Escreve o RLO invertido na tag de saída |
| 6 | Reset de Saída | —(R)— | — | Define a tag como FALSE quando o RLO è TRUE |
| 7 | Set de Saída | —(S)— | — | Define a tag como TRUE quando o RLO è TRUE |
| 8 | SET_BF — Set Campo de Bits | — | — | Define um intervalo de bits como TRUE |
| 9 | RESET_BF — Reset Campo de Bits | — | — | Reseta um intervalo de bits para FALSE |
| 10 | SR — Flip-Flop Set/Reset | — | — | Flip-flop com prioridade ao Set (S=1,R=1 → Q=1) |
| 11 | RS — Flip-Flop Reset/Set | — | — | Flip-flop com prioridade ao Reset (S=1,R=1 → Q=0) |
| 12 | Varrer operando para flanco positivo | —|P|— | — | Deteta flanco de subida num operando |
| 13 | Varrer operando para flanco negativo | —|N|— | — | Deteta flanco de descida num operando |
| 14 | Definir operando em flanco positivo | —(P)— | — | Define operando por 1 varredura no flanco de subida |
| 15 | Definir operando em flanco negativo | —(N)— | — | Define operando por 1 varredura no flanco de descida |
| 16 | P_TRIG — Varrer RLO para flanco positivo | — | — | Deteta flanco de subida no RLO |
| 17 | N_TRIG — Varrer RLO para flanco negativo | — | — | Deteta flanco de descida no RLO |
| 18 | R_TRIG — Detetar flanco de sinal positivo | — | — | Detector de flanco de subida IEC (FB) |
| 19 | F_TRIG — Detetar flanco de sinal negativo | — | — | Detector de flanco de descida IEC (FB) |
Perguntas Frequentes
Qual é a diferença entre bobinas Set/Reset e flip-flops SR/RS?
As bobinas Set (S) e Reset (R) são instruções individuais colocadas em redes separadas — você controla a prioridade pela rede que vier por último. Os flip-flops SR/RS são caixas únicas com ambas as entradas — a prioridade é incorporada (SR = prioridade ao Set, RS = prioridade ao Reset). Os flip-flops são mais compactos e tornam a prioridade explícita.
Qual deteção de flanco devo usar: |P|/|N|, (P)/(N), P_TRIG/N_TRIG, ou R_TRIG/F_TRIG?
Os contactos |P|/|N| detetam flancos numa tag específica e precisam de um bit M externo. As bobinas (P)/(N) combinam deteção de flanco com atribuição de saída. P_TRIG/N_TRIG detetam flancos no RLO (lógica combinada). R_TRIG/F_TRIG são FBs padrão IEC com memória incorporada. Para código de biblioteca reutilizável, prefira R_TRIG/F_TRIG. Para lógica inline simples, os contactos |P|/|N| são adequados.
Porque é que o meu circuito Set/Reset se comporta de forma inesperada?
A causa mais comum é ambas as condições de Set e Reset serem TRUE simultaneamente. Nesse caso, a última instrução no programa vence. Se a sua rede de Reset estiver antes da rede de Set, a saída será Set. Solução: use um flip-flop RS (prioridade ao Reset) para circuitos críticos de segurança, ou garanta que as suas condições sejam mutuamente exclusivas.
A deteção de flanco pode funcionar em valores analógicos ou apenas em BOOL?
As instruções de deteção de flanco (|P|, |N|, R_TRIG, F_TRIG) funcionam apenas em sinais booleanos. Para valores analógicos, é necessário criar uma comparação (ex: valor > limite) que produza um resultado BOOL, e depois aplicar a deteção de flanco a esse BOOL.