Você está na página 1de 9

Lógica Ladder para microcontroladores PIC and AVR

(translated from the English original; thanks to Daniel Corteletti)

Resumo: Escrevi um compilador que permite gerar código nativo para microcontroladores
PIC16 e AVR a partir de um diagrama ladder. Suas características são:

• Entradas e saídas digitais


• Temporizadores (TON, TOF, RTO)
• Contadores (CTU, CTD, 'contadores circulares' para usar como sequenciadores)
• Entradas analógicas e saídas (PWM) analógicas
• Variáveis inteiras e instruções aritméticas
• Comunicação serial facilitada para conexão a PCs, LCDs e outros dispositivos
• Registradores de deslocamento, tabelas "look-up"
• Variáveis em EEPROM (que mantêm os dados quando falta energia elétrica)
• Simulador, para testar seu programa antes de gerar o código PIC ou AVR.

Este programa é livre. O código fonte e executáveis estão disponíveis para download.

Introdução

PLCs (Circuitos Lógicos Programáveis) são geralmente programados em lógica ladder. Isso
porquê os PLCs originalmente substituíram sistemas de controle baseados em lógica de
relés, e quarenta anos depois, ainda permanecemos utilizando esta linguagem. Um PLC,
assim como um microprocessador, executa uma lista de instruções em seqüência.
Ferramentas ladder deixam isso transparente; você pode programar o PLC ligando os
contatos de relés e bobinas na tela, e o interpretador PLC irá simular o circuito que você
desenhou. Alguns contatos de relés podem ser ligados a sinais de entrada reais; Algumas
das bobinas podem ser ligadas a saídas. Desta forma, você pode fazer a simulação de seu
circuito e interagir com outros dispositivos, e até controlar coisas. Este é o objetivo.

Na verdade ele é mais amplo do que isso, porque você pode incorporar temporizadores e
contadores e operações aritméticas que não poderiam ser (facilmente) executados somente
com relês convencionais. O projeto do circuito ainda é útil não só porque ele é intuitivo,
mas também porque abstrai facilmente a concorrência. Isso funciona assim:

|| Xa Xb Yout ||
1 ||-------] [------+-------] [------+-------( )-------||
|| | | ||
|| | Xc | ||
|| +-------]/[------+ ||

Isto é um simples trecho de uma lógica de combinações. Existem os termos de entrada , Xa,
Xb e Xc. Existem termos de saída: Yout. A expressão é Yout := Xa e (Xb ou (não Xc)).
Isso faz mais sentido se você pensar em Xa e Xb como relés de contato NA (normalmente
aberto), Xc como um relé de contato NF (normalmente fechado) e Yout como uma bobina
de um relé ou contactora. Claro que podemos encontrar circuitos mais complexos, como o
que segue:

|| ||
|| Asetpoint ||
1 ||-------------------------------------{READ ADC}----||
|| ||
|| Atemperature ||
||-------------------------------------{READ ADC}----||
|| ||
|| ||
|| ||
|| ||
|| {SUB min_temp :=} ||
2 ||------------------------{ Asetpoint - 20 }--------||
|| ||
|| {ADD max_temp :=} ||
||------------------------{ Asetpoint + 20 }--------||
|| ||
|| ||
|| ||
|| ||
||[Atemperature >] Yheater ||
3 ||[ max_temp ]+------------------------(R)-------||
|| | ||
|| Xenable | ||
||-------]/[------+ ||
|| ||
||[Atemperature <] Xenable Yheater ||
||[ min_temp ]--------] [--------------(S)-------||
|| ||
|| ||
|| ||
|| ||
|| {SUB check_temp :=} ||
4 ||-----------------------{ Asetpoint - 30 }-------||
|| ||
|| ||
|| ||
|| ||
||[Atemperature >] Yis_hot ||
5 ||[ check_temp ]-------------------------( )-------||
|| ||
|| ||
|| ||
||------[END]----------------------------------------||
|| ||
|| ||

Trata-se de um simples termostato. Há duas entradas analógicas; uma delas é para o set
point, para que seja possível, por exemplo, ligar um potenciômetro para o usuário definir a
temperatura desejada. A outra é usada para medições de temperatura, conectado a um
sensor de temperatura baseado em semicondutores, ou um termopar com interface
apropriada. Existe uma saída digital, Yheater. Isso pode ser usado para controlar um
elemento de aquecimento, através de um comutador apropriado (um TRIAC, ou um relé, ou
um relé de estado sólido, ou seja o que for).

O ciclo foi fechado com uma simples histerese. Nos definimos mais ou menos 20 unidades
do ADC para histerese. Isso significa que quando a temperatura cai abaixo (setpoint - 20),
será ligado o aquecimento. e quando isso ultrapassar (setpoint + 20), o aquecimento será
desligado.

Eu ainda acresci algumas coisinhas. Primeiramente, há uma entrada de ativação: o


aquecedor é forçado a desligar quando Xenable está em nível baixo. Eu também adicionei
uma lâmpada indicadora, Yis_hot, para indicar que a temperatura está na faixa pretendida.
Isso é feito de modo a comparar continuamente com o limite imposto (setpoint-20) de
forma que a luz não fique piscando nos ciclos normais do termostato.

Este é um exemplo trivial, mas deve ficar claro que a linguagem é bastante expressiva.
Logica ladder não é uma linguagem de propósito geral, mas é uma linguagem "Turing-
completa", aceita na industria, e, para uma classe limitada de problemas (orientados a
controle), surpreendentemente conveniente.

Um compilador de lógica ladder para PIC16 e AVR

Acredita-se que os microcontroladores modernos de baixo custo (abaixo de US$ 3,00)


passaram a ter o poder computacional de um PLC a partir de 1975. Eles passaram a
processar mais MIPS para rodar uma lógica ladder relativamente complexa com um ciclo
de vida de alguns milisegundos. Eu penso que PLCs normalmente tem uma espécie de
programa do tipo "interpretador" ou "máquina virtual", mas se desejarmos realizar uma
lógica simples em um processador sem muita memória então um compilador pode ser uma
idéia melhor.

Então eu escrevi um compilador. Você começa com um degrau (linha) vazio. Você pode
adicionar contatos (entrada) e bobinas (saídas) e estruturas mais complicadas para construir
seus programas. Temporizadores (TON, TOF, RTO) também são suportados. As durações
máximas e mínimas dependem do ciclo de tempo do 'PLC', o qual é configurável; Os
temporizadores podem contar deste milisegundos até dezenas de minutos. Á contadores e
operações aritméticas (adição, subtração, multiplicação, divisão).

Elementos de circuito podem ser adicionados em série ou em paralelo com outros


elementos existentes. E uma lista de entradas e saídas é construída a partir do diagrama
lógico traçado. Você tem relês internos (Rfoo), que usam posições de memória alocadas
automaticamente, ou entradas (Xfoo) e saídas (Yfoo), para associar a pinos do
microcontrolador. A seleção dos pinos disponíveis depende do microcontrolador. Tentamos
manter suporte para a maioria dos mais populares microcontroladores PICs e AVRs (veja
abaixo).
Você pode editar o programa na forma gráfica:
Então você pode testar o programa simulando-o em tempo real. O programa aparecera na
tela com os elementos ativados (ligados) representados por colchetes em uma cor mais
intensa, o que torna fácil a depuração. O estado das variáveis é mostrado na parte de baixo
da tela, na lista de entradas e saídas (I/O list).
Depois do programa ter funcionado na simulação, você pode associar pinos para as entradas
e saídas, gerar o código PIC ou AVR. A geração do código não é difícil. Para o AVR, um
bom alocador de registradores proverá uma maior velocidade. Se você quer ter uma
otimização de código ainda mais apurada, poderá aplicar algumas regras de redução de
algoritmos, e talvez redução de estados também. Isso seria muito mais difícil.

Mesmo ignorando isso, meu código gerador para os AVRs é muito pobre. O "back end"
AVR ainda gera código PIC... por exemplo, ele não tira vantagem do fato do AVR ter mais
de um registrador. Muitos dos códigos gerados ficam pouco otimizados. O "back end" para
PIC é melhor, e não é muito grande. Mas nada disso importa muito se você estiver tentando
rodar algumas dezenas de degraus de uma lógica ladder com tempo de ciclo rápido.

Há suporte para conversor A/D, unidade PWM e UART nos microcontroladores utilizados.
Isso significa que você pode escrever lógica ladder que leia uma entrada analógica, e que
possa enviar e receber caracteres pela serial (por exemplo, para um PC, se você adicionar
um MAX232, ou um display LCD de caracteres). Isso é possível mandando seqüência de
caracteres através da serial, assim como o valor de variáveis inteiras, como texto ASCII. E
por último, fora adicionado suporte a variáveis em EEPROM; Você pode indicar que uma
variável específica irá ser salva automaticamente em uma área de memória não volátil, que
será mantida ao se desconectar a energia.

Limitações e isenção de responsabilidades

Naturalmente um microcontrolador com este software não pode fazer tudo que um PLC faz.
Muitos PLCs oferecem mais características e blocos predefinidos que minha ferramenta. O
Hardware de um PLC é melhor também; usualmente as entradas e saídas são projetadas
para suportar alterações elétricas. Você pode montar um PIC16F877 em uma protoboard
por alguma dezena de dólares, mas você pagará mais caro por um PLC com as mesmas
capacidades.

Até agora, tenho recebido muito poucos relatos de erros, em comparação com o número de
pessoas com perguntas e dúvidas. Existe ainda uma grande possibilidade de defeitos,
especialmente nos microcontroladores que não tenho fisicamente (e portanto, não podemos
testar). Certamente, não use o LDmicro para alguma aplicação segura ou crítica, ou em algo
que possa se torar caro se isso falhar.

Com citado anteriormente, o código gerado está longe do "otimo". Também, nem toda a
memória RAM nos dispositivos PIC16 está disponível para o programa na lógica ladder.
Isso porque não implementei muito código para suporte a paginação. Eu fiz, no entanto,
suporte para a memória de paginação do programa, para permitir acesso a memória ROM
nos PIC16 acima de 2k.

Download (instalação)

O programa é testado sobre Windows XP. Relatos informais sugerem que ele pode
trabalhar sobre windows 98, a sobre o Wine. O arquivo de download é um arquivo .exe;
não há outro arquivo requerido, e não há arquivo de instalação. Salve-o em algum lugar no
seu computer, e execute-o. O manual está incluído no arquivo .exe, mas você pode realizar
download separadamente se você desejar.

O compilador irá gerar arquivos no formato Intel IHEX. Muitos dos softwares
programadores que eu tenho usam este formato. Naturalmente você irá precisar de um
programador para transferir o programa para a memória do microcontrolador. Para os
AVRs, eu recomendo o tipo STK300, paralelo, como o Olimex. Para os PICs, eu
recomendo o Microchip PICkit 2, como o disponível nesta loja virtual.

Agradecemos relatórios de erros. Os seguintes microcontroladores foram testados e são


suportados:

• PIC16F877
• PIC16F876
• PIC16F628
• ATmega64
• ATmega128

Os microcontroladores abaixo são suportados, mas não foram testados; eles devem
funcionar, mas não há garantia. Se você testar, e isso funcionar adequadamente, entre em
contato comunicando. Nós agradecemos.

• PIC16F88
• PIC16F819
• ATmega162
• ATmega32
• ATmega16
• ATmega8

O arquivo ladder também é possível se gerar código C. Isso é menos conveniente, mas você
pode usar isso em algum processador se você possuir um compilador C.

LDmicro pode gerar um código interpretável. Se estiver escrevendo um interpretador você


pode usa-lo para gerar o código ladder para outro tipo de dispositivo. Não há mita
documentação sobre isso, mas eu construí um interpretador simples em linguagem C
bastante portável.

As compilações são disponíveis em diversas línguas:

• ldmicro.exe (English)
• ldmicro-de.exe (Deutsch; thanks to Heinz Ullrich Noell)
• ldmicro-fr.exe (Français; thanks to Marcel Vaufleury)
• ldmicro-es.exe (Español; thanks to Jose Pascual)
E o código fonte, e vários outros arquivos, também estão disponíveis para download. Este
programa pode ser distribuído sob os termos da GPL Version 3.

• ldmicro-rel1.7.zip (fonte, release 1.7)


• ldmicro.txt (manual)
• características / histórico de erros
• Exemplo: um semáforo simples
• Exemplo: display de 7 segmentos
• Exemplo: ‘hello, world;' enviado pela porta serial

Versões antigas estão disponíveis:

• ldmicro-rel1.6.zip (fonte, release 1.6)

(botão direito para salvar qualquer um destes arquivos.)

Por favor, relate qualquer defeito. Este é um software livre, sem nenhum departamento
responsável pelo controle de qualidade. Eu mesmo não tenho o hardware para testar a
maioria dos dispositivos. Um erro não informado não poderá ser corrigido.

Tenho um tutorial, no qual eu descrevo como gerar um simples diagrama ladder, simulá-lo
e então gerar o arquivo IHEX e programá-lo no PIC. Esta é provavelmente a maneira mais
fácil de começar a usar este software.

Dezembro de 2007, Seattle.

Você também pode gostar