Escolar Documentos
Profissional Documentos
Cultura Documentos
com
Autor:W. Vala
Versão do software:1.4
https://github.com/wditch/plcLib
1 Conteúdo
1 Conteúdo................................................. ................................................ ......................................... 2
2 Introdução ................................................. ................................................ ......................................... 5
Figura 1.Convertendo um circuito elétrico simples em um diagrama de escada e depois em um programa simples.
Uma ampla variedade de esboços de exemplo também estará disponível depois que você instalar a biblioteca.
O programa acima - que é provavelmente o mais simples que faz algo útil - estará disponível no menu
suspenso do Arduino IDE selecionandoArquivo > Exemplos > plcLib > InputOutput > BareMinimum.
No método de projeto mais conhecido, um circuito elétrico contendo elementos como interruptores e lâmpadas é primeiro
representado em forma gráfica como um diagrama de escada – que deve então ser transformado em um programa Arduino
baseado em texto (ouesboço), antes de ser compilado e baixado normalmente. Você também pode descrever um sistema como um
diagrama de blocos (diagrama de blocos de função) ou um sistema baseado em sequência (gráfico de função sequencial), todos os
quais podem ser combinados com código C/C++ nativo (texto estruturado), portanto, você pode usar livremente a abordagem de
projeto que melhor se adapta ao problema.
O software é fornecido como uma biblioteca Arduino instalável, que éincluídonormalmente no início do seu
programa. Uma gama de comandos de estilo PLC baseados em texto torna-se disponível para uso em seus
programas.
Observação:Ao contrário de um PLC comercial moderno, o software atualmente não oferece suporte a entrada de programa
gráfico, simulação ou monitoramento de tempo de execução. Os programas devem ser inseridos usando o Arduino IDE padrão.
Os diagramas fornecidos no Guia do Usuário destinam-se a ilustrar o processo de design e estão vinculados a esboços de
exemplo fornecidos com a biblioteca.
Os recursos de software suportados pela versão atual do plcLib incluem entradas (digitais/analógicas), saídas (digitais/
PWM/servo), operadores lógicos booleanos, travas, temporizadores e formas de onda repetidas. Avançar
detalhes estão disponíveis nas seguintes seções doGuia de usuario, incluindo instruções de download e
instalação.
Figura 2.Usando uma placa protótipo para conectar um receptor de controle remoto a um Arduino Uno.
Oescudo do motor arduinoé suportado como padrão, permitindo o controle de velocidade e direção de até dois motores CC.
Sistemas modulares de construção e experimentação, comoArvoredopermitem que uma ampla gama de dispositivos
de entrada e saída sejam conectados, sem a necessidade de fiação ou solda de placa de protótipo.
Figura 4.Um shield base Grove e um módulo Bluetooth serial conectado a um Arduino Uno.
A versão 1.2 ou posterior do software é fornecida com uma ampla variedade de configurações de amostra para hardware
comumente disponível, incluindoControllino eescudos industriais CLPs compatíveis com Arduino. Os detalhes do hardware
suportado são fornecidos noDefinindo alocações de ES personalizadas seção.
Personalizadoconfigurações de E/Stambém pode ser desenvolvido para outro hardware, não suportado como padrão. Este
processo é ilustrado mais tarde, usando oEscudo Velleman I/O para Arduino como estudo de caso.
Figura 6. O Velleman Input/Output Shield oferece uma gama útil de entradas e saídas pré-configuradas.
3 Instalando o Software
Siga as instruções apropriadas abaixo, dependendo se você está instalando o software pela
primeira vez ou atualizando uma versão existente.
Os detalhes exatos do processo de instalação dependem da versão do Arduino IDE instalado. Para Arduino 1.6.4 ou
posterior, selecione oEsboço > Incluir biblioteca > Adicionar biblioteca .Zipopção e navegue até o arquivo Zip
baixado anteriormente.
Se você estiver usando a versão 1.0.5 do Arduino IDE, selecioneEsboço > Importar biblioteca... > Adicionar
biblioteca...no menu suspenso, navegue para encontrar o arquivo Zip baixado anteriormente.
# inclui <plcLib.h>
Conexões:
Entrada - interruptor conectado à entrada X0 (pino A0 do Arduino) Saída
- LED conectado à saída Y0 (pino 3 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
fora(Y0); // Envia para Output 0
}
Listagem 1.Bare Minimum (Fonte: Arquivo > Exemplos > plcLib > InputOutput > BareMinimum)
Observação:Todos os exemplos mostrados estão disponíveis noArquivo > Exemplosseção do Arduino IDE.
O esboço acima lê um switch conectado à entrada X0 (pino A0 no Arduino) e envia o estado do switch para a saída
Y0 (pino 3 no Arduino). Para vê-lo funcionando, você pode conectar um protótipo de circuito de placa ou usar
qualquer um dos hardwares suportados, conforme explicado noConfigurando o
hardware seção.
Figura 7.Testando o programa Bare Minimum usando um sistema de experimentação modular.
Novas versões do software plcLib são lançadas periodicamente. O procedimento de atualização recomendado é
primeiro remover a versão existente da biblioteca e depois instalar a nova, conforme descrito abaixo.
1. Identifique a localização dos arquivos da biblioteca em seu computador, que estarão em umbibliotecaspasta abaixo doCaderno
de esboços Arduinolocalização. Os detalhes exatos podem variar, mas normalmente será algo
como[Meus Documentos]/Arduino/libraries, com umplcLibpasta existente abaixo dela se o software tiver sido
instalado anteriormente. Você pode verificar o caminho para a pasta Sketchbook selecionandoArquivo >
Preferênciasda IDE do Arduino.
2. Feche o Arduino IDE e exclua a pasta plcLib identificada acima. (É uma boa ideia fazer uma cópia de backup
de todos os arquivos existentes antes de excluí-los – caso você cometa algum erro.)
Pinos adicionais são alocados para placas Arduino maiores (mega,mega 2560ouDevido), conforme mostrado à
direita, dando 8 entradas e 8 saídas no total.
• Os pinos do Arduino com funções duplicadas foram evitados sempre que possível, para minimizar conflitos de
hardware.
• As direções de dados de entradas e saídas são configuradas automaticamente e as saídas são inicialmente desativadas (com
base na suposição de que 0 = 'desligado' e 1 = 'ligado')
Observação:A maioria dos arquivos de exemplo fornecidos faz uso da configuração de E/S padrão.
Se esse arranjo padrão for inadequado, várias configurações de hardware personalizadas alternativas estão disponíveis – ou
você pode preferir criar a sua própria. por favor veja oDefinindo alocações de ES personalizadas seção para mais detalhes.
Figura 9.Converter um circuito elétrico em um diagrama ladder e depois em um programa de lógica ladder.
O nome 'diagrama de escada' vem da semelhança superficial com uma escada física, com trilhos de energia verticais em
cada lado e ramificações de circuito horizontais chamadasdegrausconectados entre os trilhos. Diagramas de escada mais
complexos têm uma série de degraus, cada um representando um circuito separado.
Os diagramas de escada são uma adaptação de uma tecnologia anterior chamadalógica do relé, em que chaves e relés são
usados para controlar circuitos industriais. Um circuito lógico de relé simples é mostrado abaixo.
Observe o trilho de alimentação positivo à esquerda e o negativo à direita. Os interruptores SW1 e SW2 são do tipo push-tomake e
push-to-break, fazendo com que suas lâmpadas associadas sejam acesas quando os interruptores são pressionados ou liberados,
respectivamente. A chave SW3 é conectada à bobina do relé RL1 e os contatos do relé de comutação são
então ligado às lâmpadas BL3 e BL4. Os contatos do relé são dispostos de forma que apenas uma lâmpada esteja acesa a qualquer momento.
Qualquer programa que faça uso da biblioteca de software plcLib deve ser inserido como um padrão baseado em texto do
Arduino.esboço, que os programadores PLC podem se referir comolista de instruçõesprogramação. Com a prática, o
processo de conversão de um diagrama Ladder em um esboço do Arduino torna-se relativamente simples. Várias
alternativas para a abordagem de projeto de lógica ladder estão disponíveis, incluindobloco de funções programação,
gráficos de funções sequenciais etexto estruturado , cada um dos quais é discutido separadamente.
Observação:Esses cinco métodos de programação (diagrama Ladder, lista de instruções, bloco de função, gráfico de função
sequencial e texto estruturado) são definidos pela Parte 3 do padrão IEC 61131 (IEC 61131-3, também conhecido no Reino
Unido como BS EN 61131-3). , que trata de linguagens de programação para controladores programáveis.
Figura 11.Um diagrama ladder mostrando métodos de leitura de entradas e saídas de controle.
O diagrama de escada pode ser facilmente convertido em um esboço baseado em texto, conforme mostrado abaixo.
# inclui <plcLib.h>
Conexões:
Entrada - chave conectada à entrada X0 (pino A0 do Arduino) Entrada -
chave conectada à entrada X1 (pino A1 do Arduino)
Entrada - switch conectado à entrada X2 (pino A2 do Arduino) Entrada -
switch conectado à entrada X3 (pino A3 do Arduino) Saída - LED
conectado à saída Y0 (pino 3 do Arduino) Saída - LED conectado à saída
Y1 (pino 5 do Arduino) Saída - LED conectado à saída Y2 (pino 6 do
Arduino) Saída - LED conectado à saída Y3 (pino 9 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
fora(Y0); // Envia para Output 0
em(X2); // Lê a entrada 2
outNot(Y2); // Envia para a Saída 2 (invertida)
O software PLC calcula repetidamente cada degrau do diagrama ladder em sequência – da esquerda para a direita e de cima
para baixo – 'varrendo' as entradas, realizando cálculos e exibindo os resultados; um processo conhecido comociclo de
varredura. Cada degrau do diagrama ladder é efetivamente uma tarefa separada, e o computador compartilha seu poder de
processamento entre essas tarefas em uma sequência repetida. A alta velocidade de processamento faz com que pareça
que o PLC está realizando várias atividades ao mesmo tempo.
As entradas podem ser conectadas em série ou paralelo para criar funções simples de lógica booleana (lógica
combinatória), conforme discutido na próxima seção.
As funções lógicas booleanas básicas AND, OR, XOR e NOT podem ser representadas em forma de diagrama ladder usando
combinações série/paralelo de chaves de entrada e contatos de saída, conforme mostrado abaixo.
Figura 13.Funções lógicas em escada lógica booleana e suas funções lógicas equivalentes.
Este arranjo de diagrama de escada pode ser facilmente codificado, conforme mostrado no esboço a seguir.
# inclui <plcLib.h>
Conexões:
Entrada - chave conectada à entrada X0 (pino A0 do Arduino) Entrada -
chave conectada à entrada X1 (pino A1 do Arduino)
Output - ANDed Output - LED conectado à saída Y0 (Arduino pino 3) Output - ORed Output -
LED conectado à saída Y1 (Arduino pino 5) Output - XORed Output - LED conectado à saída Y2
(Arduino pino 6) Output - Inverted Output - LED conectado à saída Y3 (pino 9 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
eBit(X1); // AND com Input 1 // Envia
fora(Y0); resultado para Output 0
em(X0); // Lê a entrada 0
ouBit(X1); // OU com Entrada 1
fora(Y1); // Envia o resultado para Output 1
em(X0); // Lê a entrada 0
xorBit(X1); // XOR com Input 1 // Envia
fora(Y2); resultado para Output 2
em(X0); // Lê a entrada 0
outNot(Y3); // Envia o resultado invertido para a Saída 3
}
Listagem 3.Funções AND, OR, XOR e Not (Fonte: Arquivo > Exemplos > plcLib > Lógica > AndOrXorNot
Se forem necessárias saídas baixas ativas, as funções equivalentes NAND, NOR e XNOR podem ser criadas na
lógica ladder.
Figura 14.Circuitos lógicos ladder NAND, NOR e XNOR e suas funções lógicas equivalentes.
A codificação dessas funções é obtida substituindo ofora()instruções do exemplo anterior com a lógica
negativaoutNot()equivalente, como mostrado abaixo.
# inclui <plcLib.h>
Conexões:
Entrada - chave conectada à entrada X0 (pino A0 do Arduino) Entrada -
chave conectada à entrada X1 (pino A1 do Arduino)
Saída - Saída NAND - LED conectado à saída Y0 (pino 3 do Arduino) Saída - Saída NOR -
LED conectado à saída Y1 (pino 5 do Arduino) Saída - Saída XNOR - LED conectado à saída
Y2 (pino 6 do Arduino)
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
// NAND
em(X0); // Lê a entrada 0
eBit(X1); // E com Entrada 1
outNot(Y0); // Envia o resultado para Output 0 (invertido)
// NEM
em(X0); // Lê a entrada 0
ouBit(X1); // OU com Entrada 1
outNot(Y1); // Envia o resultado para Output 1 (invertido)
// XNOR
em(X0); // Lê a entrada 0
xorBit(X1); // XOR com entrada 1
outNot(Y2); // Envia o resultado para Output 2 (invertido)
}
Listagem 4.Funções NAND, NOR e XNOR. (Fonte: Arquivo > Exemplos > plcLib > Lógica >
NandNorXnor)
As operações lógicas também podem ser realizadas com uma ou mais das entradas invertidas, conforme visto aqui.
# inclui <plcLib.h>
Conexões:
Entrada - chave conectada à entrada X0 (pino A0 do Arduino) Entrada -
chave conectada à entrada X1 (pino A1 do Arduino)
Saída - saída AND - LED conectado à saída Y0 (pino 3 do Arduino) Saída - saída ORed - LED
conectado à saída Y1 (pino 5 do Arduino)
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
eNotBit(X1); // AND com Input 1 (invertido) // Envia
fora(Y0); resultado para Output 0
em(X0); // Lê a entrada 0
ouNotBit(X1); // OU com Input 1 (invertido) // Envia
fora(Y1); resultado para Output 1
}
Listagem 5.Lógica de entrada invertida (Fonte: Arquivo > Exemplos > plcLib > Lógica > InvertedInputLogic)
Também é possível realizar operações lógicas envolvendo o estado dos contatos de saída, que na verdade
aplica realimentação das saídas às entradas. Claro que isso é a baselógica sequencial, sendo o mais simples
oTrava Set-Reset–a ser considerado a seguir.
6 saídas de travamento
Você poderobustouma entrada momentânea, fazendo com que ela permaneça ativa (oudefinir) até que precise ser
cancelado (oureiniciar). Três abordagens diferentes estão disponíveis, conforme descrito nas seções a seguir.
automático usando apenas umretransmissão(um interruptor operado eletromagneticamente) e alguns outros componentes, como visto no
Figura 16.Componentes discretos foram usados aqui para criar um circuito de travamento automático.
Examinando o circuito à esquerda, observe primeiro que os dois interruptores estão conectados em paralelo, o que é obviamente
um arranjo OR lógico. No entanto, para começar, a corrente não flui por nenhum dos caminhos! A ramificação superior está
desligada, pois o botão push-to-make não está pressionado. A chave inferior é do tipo push-to-break, mas este caminho também
está desligado, sendo bloqueado pelos contatos do relé que estão na posição off (para baixo).
Uma pressão momentânea doDefinirO interruptor de entrada permite que a energia alcance a bobina do relé que é ativada,
movendo os contatos do relé para a posição On (para cima). A corrente agora flui através do ramal inferior, então o relé permanece
habilitado, mesmo quando a entrada Set é liberada. O relé permanece ativo até que oReiniciarinterruptor de entrada é
pressionado, desconectando a bobina do relé e retornando os contatos do relé para sua posição desligada.
Observação:As travas Set Reset geralmente têm saídas normais e invertidas. Esta função pode ser facilmente adicionada, se necessário,
ligando uma segunda lâmpada através do conjunto não utilizado de contatos do interruptor, mas com polaridade oposta à saída principal.
# inclui <plcLib.h>
Trava usando componentes discretos - Circuito de travamento automático com saídas Q e Not Q
Conexões:
Entrada - Set - chave conectada na entrada X0 (pino A0 do Arduino) Entrada - Reset
- chave conectada na entrada X1 (pino A1 do Arduino) Saída - Q - LED conectado à
saída Y0 (pino 3 do Arduino) Saída - NotQ - LED conectado à saída Y1 (pino 5 do
Arduino)
Software e documentação: https://
github.com/wditch/plcLib
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Interruptor de leitura conectado à entrada 0 (definir) //
ouBit(Y0); travamento automático usando a saída 0 (Q)
eNotBit(X1); // Redefina a trava usando a Entrada 1
fora(Y0); (Redefinir) // Saída para a Saída 0 (Q)
em(Y0); // Lê a saída Q
outNot(Y1); // Produz saída invertida na Saída 1 (Não Q)
}
Listagem 6.Trava usando componentes discretos (Fonte: Arquivo > Exemplos > plcLib > Trava >
LatchDiscreteComponents)
O circuito de travamento automático acima funciona bem, mas é bastante detalhado. Uma versão simplificada é mostrada na próxima seção.
Figura 17.Defina os símbolos de trava de reinicialização, mostrados com e sem uma saída invertida.
O esboço a seguir mostra uma trava com saídas normais e invertidas, embora as duas últimas linhas usadas
para gerar a saída invertida sejam opcionais.
# inclui <plcLib.h>
Comando Latch - Defina a trava Reset com as saídas Q e NotQ, com base no comando 'latch'
Conexões:
Entrada - Set - chave conectada na entrada X0 (pino A0 do Arduino) Entrada - Reset
- chave conectada na entrada X1 (pino A1 do Arduino) Saída - Q - LED conectado à
saída Y0 (pino 3 do Arduino) Saída - NotQ - LED conectado à saída Y1 (pino 5 do
Arduino)
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Interruptor de leitura conectado à entrada 0 (definir
trava(Y0, X1); entrada) // trava, Q = saída 0, reinicialização = entrada 1
Observe que oDefinira entrada para o latch é retirada do valor anterior do mesmo 'degrau' do diagrama
ladder (lendo a entradaX0nesse caso). O comando recebe dois argumentos que são osQsaída e o
Reiniciarentrada respectivamente.
# inclui <plcLib.h>
Conexões:
Entrada - Set - chave conectada na entrada X0 (pino A0 do Arduino) Entrada - Reset
- chave conectada na entrada X1 (pino A1 do Arduino) Saída - Q - LED conectado à
saída Y0 (pino 3 do Arduino) Saída - NotQ - LED conectado à saída Y1 (pino 5 do
Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Interruptor de leitura conectado à entrada 0 (Definir entrada) // Definir
definir(Y0); Y0 para 1 se X0 = 1, deixar Y0 inalterado caso contrário
Os comandos set() e reset() estão disponíveis na versão 0.7 ou posterior da biblioteca plcLib.
Uma letra é adicionada ao símbolo de saída padrão indicando se a saída é do tipo 'set' ou 'reset', conforme mostrado
no diagrama ladder equivalente.
Figura 18.Uma trava implementada usando as saídas Set e Reset.
Este método permite uma lógica separada para controlar a ativação e desativação de uma saída travada, o que geralmente
é conveniente. Agráfico de função sequencial é uma aplicação típica, na qual esses comandos podem ser usados para
controlar as transições entre as etapas de uma sequência.
7 Pulsos Acionados por Borda
A versão 1.1 do software plcLib apresenta a capacidade de gerar pulsos acionados por borda, cuja saída está ativa
apenas para um único ciclo de varredura.
Isso pode ser útil em uma variedade de cenários, como acionar uma saída apenas uma vez, garantir que uma saída dure
por menos tempo do que uma entrada ou impedir que um sistema baseado em trava seja travado em uma posição
devido a um interruptor externo defeituoso.
Figura 19.Pulsos de saída breves podem ser gerados a partir das bordas ascendentes ou descendentes de uma forma de onda de entrada.
Isso pode ser representado como mostrado no diagrama ladder a seguir, com bordas ascendentes ou descendentes na
entradaX0sendo usado para definir saídas momentaneamenteA0eA1, respectivamente.
Figura 20.Os pulsos de saída em Y0 e Y1 são gerados pelas bordas ascendentes ou descendentes da forma de onda de entrada X0.
# inclui <plcLib.h>
Conexões:
Entrada de clock - switch conectado à entrada X0 (pino A0 do Arduino) Saída de borda
ascendente - LED conectado à saída Y0 (pino 3 do Arduino) Saída de borda descendente
- LED conectado à saída Y1 (pino 5 do Arduino)
*/
loop void() {
em(X0); // Lê o switch conectado à Entrada 0 e // conecta-o à
pulso1.inClock(); entrada do relógio
Examinando a listagem acima, um objeto de pulso chamado 'pulse1' é primeiro criado. Entrada externaX0é então conectado à
entrada de clock do pulso criado anteriormente. Finalmente, os sinais de borda ascendente e descendente são usados para
conduzir as saídasA0eA1respectivamente.
Os pulsos de saída duram apenas um único ciclo de varredura, portanto, um atraso de 50 milissegundos foi adicionado ao esboço
acima para 'esticar' os pulsos de saída por tempo suficiente para serem visíveis quando conectados aos LEDs. Esse atraso deve ser
removido após o teste para evitar a lentidão do ciclo de verificação.
oSaídas de travamento seção. Dado o potencial para interruptores de entrada defeituosos mencionados anteriormente, é
útil considerar o que aconteceria a um circuito baseado em trava se ambos osDefinireReiniciarentradas foram ativadas
simultaneamente, ou se um dos interruptores de entrada externos ficou preso na posição 'On'?
Esses possíveis problemas podem, em grande parte, ser superados usando sinais acionados por borda para acionar as entradas
de trava, conforme mostrado no diagrama de escada a seguir.
Figura 21.Usando entradas acionadas por borda para definir ou redefinir uma saída.
# inclui <plcLib.h>
Conexões:
Definir entrada - switch conectado à entrada X0 (pino A0 do Arduino) Entrada de
reset - switch conectado à entrada X1 (pino A1 do Arduino) Saída travada - LED
conectado à saída Y0 (pino 3 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê o interruptor conectado à Entrada 0 e // conecta-o à
setPulse.inClock(); entrada do pulso de ajuste do relógio
quando teclas específicas são pressionadas. Para ilustrar o conceito, um teclado de membrana padrão será usado, juntamente com
um download gratuitobiblioteca de teclado, para conduzir uma série de saídas de LED travadas.
Figura 22.Um circuito de teste e esboço, com entradas de teclado e saídas de LED travadas.
Observação:Antes de experimentar os exemplos, você precisará baixar e instalar oBiblioteca de teclado do Arduino . Os
arquivos de exemplo de teclado estão disponíveis com a versão 0.6 ou posterior dosoftware plcLib.
8.2 Software
A listagem a seguir usa um programa de entrada de teclado razoavelmente padrão e usa umlatchKey() função para ativar
ou desativar um bit de saída com base em pressionamentos momentâneos das teclas Set e Reset alocadas.
*/
// Cria o teclado
Teclado kpd = Teclado( makeKeymap(teclas), rowPins, colPins, ROWS, COLS );
void setup() {
configuraçãoPLC(); //Define os pinos de entrada/saída
}
laço vazio()
{
keyPress = kpd.getKey(); // Lê a tecla pressionada (se houver)
latchKey('1', '2', Y0); // Trava do teclado, Set = '1', Reset = '2', // saída = Y0 (pino
3)
latchKey('3', '4', Y1); // Trava do teclado, Set = '3', Reset = '4', // saída = Y1 (pino
5)
latchKey('5', '6', Y2); // Trava do teclado, Set = '5', Reset = '6', // saída = Y2 (pino
6)
latchKey('7', '8', Y3); // Trava do teclado, Set = '7', Reset = '8', // saída = Y3 (pino
9)
}
O efeito geral dos quatro comandos latchKey() no esboço acima é ativar os LEDs conectados às saídasA0,A1,
Y2ouY3ao pressionar as teclas '1', '3', '5' ou '7', com as teclas '2', '4', '6' e '8' desligando novamente as saídas
correspondentes.
Uma pequena alteração nas alocações de switch permite que uma única tecla de entrada atue como uma reinicialização principal, conforme
laço vazio()
{
keyPress = kpd.getKey(); // Lê a tecla pressionada (se houver)
latchKey('1', '*', Y0); // Trava do teclado, Set = '1', Reset = '*', // saída = Y0 (pino
3)
latchKey('2', '*', Y1); // Trava do teclado, Set = '2', Reset = '*', // saída = Y1 (pino
5)
latchKey('3', '*', Y2); // Trava do teclado, Set = '3', Reset = '*', // saída = Y2 (pino
6)
latchKey('4', '*', Y3); // Trava do teclado, Set = '4', Reset = '*', // saída = Y3 (pino
9)
}
Listagem 12.Modificação da chave de redefinição mestre (Fonte: Arquivo > Exemplos > plcLib > Teclado > LedStop)
Também é possível armazenar o bit de saída do latch em uma variável definida pelo usuário, em vez de enviá-lo diretamente
para um pino de saída. Um exemplo baseado nesta abordagem é dado noLedVariableesboço de exemplo, enquanto a
abordagem subjacente é discutida noUsando Variáveis em Programas seção.
9 Usando atrasos de tempo
O software plcLib possui comandos para produzir atrasos de tempo com base na ativação ou desativação de um sinal de
entrada (otimerOn()etemporizador off()comandos), e também pode produzir um pulso de saída de duração fixa (o
timerPulse()comando). Todos os comandos aceitam dois parâmetros que são, em primeiro lugar, o nome da variável do
temporizador decorrido e, em segundo lugar, o atraso de tempo necessário em milissegundos.
Evite usar o próprio Arduinoatraso()sempre que possível, pois isso interrompe o ciclo de varredura do PLC
durante o atraso e suporta apenas um único atraso ativo a qualquer momento. Veja oAvançado
Conceitos seção para mais detalhes.
Um sistema baseado em temporizador pode ser convenientemente representado usando umdiagrama de blocooubloco de funções
Figura 27.Um par de temporizadores de atraso produz atrasos separados, controlados por duas entradas diferentes.
Os dois temporizadores de atraso fornecem atrasos de tempo de ativação independentes de 2 segundos e 4 segundos nas
Saídas 0 e 1, respectivamente. A Saída 0 torna-se ativa após um sinal conectado à Entrada 0 ter estado ativo por 2
segundos, enquanto a Saída 1 requer que a Entrada 1 tenha estado ativa por um período de 4 segundos. O esboço
equivalente é mostrado abaixo.
# inclui <plcLib.h>
Atraso de ativação - Atrasa a ativação de uma saída após a aplicação de uma entrada
Conexões:
Entrada - chave conectada à entrada X0 (pino A0 do Arduino) Entrada -
chave conectada à entrada X1 (pino A1 do Arduino)
Saída com atraso de 2 s - LED conectado à saída Y0 (pino 3 do Arduino) Saída com atraso
de 4 s - LED conectado à saída Y1 (pino 5 do Arduino)
*/
longo sem sinal TIMER0 = 0; longo // Variável para reter o tempo decorrido para Timer 0 //
sem sinal TIMER1 = 0; Variável para reter o tempo decorrido para Timer 1
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 2000); // 2 segundos de atraso //
fora(Y0); Saída para Saída 0
em(X1); // Lê a entrada 1
timerOn(TIMER1, 4000); // Atraso de 4 segundos //
fora(Y1); Saída para Saída 1
}
Listagem 13.Atraso na ativação (Fonte: Arquivo > Exemplos > plcLib > TimeDelays > DelayOn)
Observe que cada timer faz uso interno de uma variável de timer decorrido do tipo 'unsigned long', que
deve ser declarada no início do programa.
que os contatos saltem fisicamente várias vezes – durante um período de vários milissegundos – antes de se estabelecerem. Este efeito
mecânico pode ser eliminado usando um temporizador de retardo de ativação com um retardo de tempo adequado, conforme mostrado no
exemplo a seguir.
# inclui <plcLib.h>
Switch Debounce - Atrasa uma entrada de switch em 10 ms para remover o bounce do contato
Conexões:
Entrada - switch conectado à entrada X0 (pino A0 do Arduino)
Saída - saída debounced - LED conectado à saída Y0 (Arduino pino 3)
*/
longo sem sinal TIMER0 = 0; // Define a variável usada para manter o tempo decorrido do timer 0
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 10); // 10 ms de atraso
fora(Y0); // Saída para Saída 0
}
Listagem 14.Switch Debounce (Fonte: Arquivo > Exemplos > plcLib > TimeDelays > SwitchDebounce)
Um temporizador de atraso de desligamento torna-se ativo imediatamente e atrasa o desligamento por um determinado período após a
Figura 28.Um atraso no desligamento faz com que uma saída permaneça ativa por um período fixo após a remoção da entrada.
Uma aplicação do retardo de desligamento é o 'alongamento de pulso', no qual um breve sinal de entrada é expandido para ter uma largura de pulso
mínima. O diagrama de blocos de função a seguir mostra um temporizador de atraso de desligamento com um atraso de desligamento de 2 segundos.
# inclui <plcLib.h>
Turn-off Delay - Atrasa o desligamento de uma saída depois que uma entrada é removida
Conexões:
Entrada - interruptor conectado à entrada X0 (pino A0 do Arduino) Saída
- LED conectado à saída Y0 (pino 3 do Arduino)
*/
longo sem sinal TIMER0 = 0; // Variável para manter o tempo decorrido para Timer 0
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOff(TIMER0, 2000); // 2 segundos de atraso no
fora(Y0); desligamento // Saída para Saída 0
}
Listagem 15.Turn-off Delay (Fonte: Arquivo > Exemplos > plcLib > TimeDelays > DelayOff)
9.4 Criando um pulso de duração fixa
OtimerPulse()O comando (disponível na versão 1.0 ou posterior) cria um pulso de saída de largura fixa quando acionado
por um breve pulso de entrada. Isso é equivalente a um eletrônicomonoestávelo circuito.
# inclui <plcLib.h>
Pulso Fixo - Ativa uma saída por um período fixo após a aplicação de uma entrada momentânea
d
Conexões:
Entrada - switch conectado à entrada X0 (pino A0 do Arduino)
Saída com pulso de 2 s - LED conectado à saída Y0 (pino 3 do Arduino)
*/
longo sem sinal TIMER0 = 0; // Variável para manter o tempo decorrido para Timer 0
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerPulse(TIMER0, 2000); // Pulso de 2 segundos //
fora(Y0); Saída para Saída 0
}
Listagem 16.Pulso de largura fixa (localização da fonte: Arquivo > Exemplos > plcLib > TimeDelays > FixedPulse)
Observação:Na versão 1.1 ou posterior, a operação do comando timerPulse foi modificada para ser acionada por
borda em vez de acionada por nível. Portanto, o temporizador é reativado pela primeira transição baixa para alta da
entrada do acionador após o término do pulso anterior. (Isso agora está de acordo com o comportamento padrão na
norma IEC 61131-3.)
A próxima seção estende os conceitos de atraso de tempo introduzidos aqui para criar formas de onda de repetição
contínua.
10 Produção de formas de onda repetitivas
Um pulso de repetição pode ser definido usando a duração dobaixoealtocomponentes da forma de onda.
Figura 31.Um pulso de repetição pode ser definido em termos das durações das seções baixa e alta.
O tempo necessário para um ciclo completo é chamado detempo periódico(ouperíodo), que é obtido somando
as durações dos componentes baixo e alto (uma duração de 1 segundo no exemplo acima).
Os pulsos repetidos podem ser criados manualmente, a partir de componentes mais simples, ou usando um comando
dedicado.
exemplo a seguir.
# inclui <plcLib.h>
Conexões:
Entrada - interruptor conectado à entrada X0 (pino A0 do Arduino) Saída
- LED conectado à saída Y0 (pino 3 do Arduino)
*/
longo sem sinal TIMER0 = 0; longo // Variável para reter o tempo decorrido para Timer 0 //
sem sinal TIMER1 = 0; Variável para reter o tempo decorrido para Timer 1
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0 (habilita) // E com
eNotBit(Y0); saída invertida // 900 ms (0,9 s) de
timerOn(TIMER0, 900); atraso // Define a saída 0 em time-
definir(Y0); out
Com o programa em execução, você verá que pressionando continuamente o botãohabilitarentrada (X0) causa a saída (
A0) para ligar por 0,1 s, depois desligar por 0,9 s em uma sequência repetida.
O programa faz uso de um par de temporizadores de atraso, além de uma trava de reinicialização baseada na saídaA0. O primeiro
temporizador é inicialmente habilitado, assumindo que a saídaA0é zero e a entrada de habilitação também está ligada. A saída do
primeiro temporizador fica alta após 900 ms, o que, por sua vez, define a saídaA0para 1. Nesse ponto, o segundo temporizador de
retardo de ativação é ativado e começa a contar. Depois de mais 100 ms, a segunda saída do temporizador é definida, o que faz
com que a saídaA0para ser limpo, e todo o ciclo começa novamente.
Este é um exemplo de uma Finite State Machine (FSM) muito simples, que é a base defunção sequencial
gráficos .
Não se preocupe se o exemplo acima parecer bastante complexo, pois essa mesma funcionalidade é fornecida pelo
timerCycle()comando, discutido a seguir.
Figura 32.Um temporizador de ciclo produz uma forma de onda de pulso repetitiva, quando ativado.
O comando requer que quatro parâmetros sejam especificados para cada forma de onda. Os parâmetros 1 e 3
devem ser especificados como variáveis (do tipolongo não assinado) e são usados internamente pelo software
plcLib para medir o tempo decorrido para as seções baixa e alta da forma de onda, respectivamente. Larguras de
pulso baixas e altas associadas são definidas no 2nde 4ºparâmetros. O exemplo a seguir ilustra o processo.
# inclui <plcLib.h>
Conexões:
Entrada - Habilita a entrada conectada à entrada X0 (pino A0 do Arduino) Saída - Forma de
onda de pulso no LED conectado à saída Y0 (pino 3 do Arduino)
*/
// Variáveis:
longo sem sinal AUX0 = 0; // Variável de timer de pulso baixo //
longo sem sinal AUX1 = 0; Variável de timer de pulso alto
void setup() {
configuraçãoPLC(); // Definir entradas e saídas
}
loop void() {
em (X0); // Read Enable input (1 = enable)
timerCycle(AUX0, 900, AUX1, 100); // Pulso repetitivo, baixo = 0,9 s, alto = 0,1 s // (portanto,
período = 1 segundo)
fora(Y0); // Envia forma de onda de pulso para a Saída 0
}
Listagem 18.Saída Pulsada - Criando um pulso repetitivo usando o comando timerCycle (Fonte: Arquivo
> Exemplos > plcLib > Formas de onda > PulsedOutput)
Observação:Uma aplicação típica é a criação de um pulso intermitente repetitivo de 'alarme armado', conforme
demonstrado noArquivo > Exemplos > plcLib > Aplicativos > AlarmWithArmedStatusesboço de exemplo.
11 Contagem e Contadores
A versão 0.8 do software apresentacontadores, que pode ativar uma saída uma vez que um número predeterminado de
eventos tenha ocorrido. Um 'objeto' contador pode ser configurado para contaracima,abaixo, ou uma combinação de
ambos.
Figura 33.Um objeto contador pode ser configurado para contagem crescente, regressiva ou ambas.
Cada contador tem quatro entradas e quatro saídas, mostradas à esquerda e à direita do diagrama acima,
respectivamente. Na prática, apenas um subconjunto destes pode ser necessário, dependendo do tipo de contador
requerido.
Na sua forma mais simples, um contador crescente conta os pulsos recebidos em seucontagem crescenteentrada, ativando
o 'concluído' ouQ superiorsaída quando o número necessário de pulsos de entrada for detectado. Para ilustrar o processo, o
exemplo a seguir cria um contador crescente que conta de 0 a 10, acionado por pressionamentos de chave aplicados à
entradaX0.
# inclui <plcLib.h>
Conexões:
Entrada de contagem - chave conectada à entrada X0 (pino A0 do Arduino)
Entrada limpa - chave conectada à entrada X1 (pino A1 do Arduino) Entrada
predefinida - chave conectada à entrada X2 (pino A2 do Arduino) Saída Q inferior -
LED conectado à saída Y0 (Arduino pino 3) Saída Q superior - LED conectado à
saída Y1 (pino 5 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 10); // 10 ms de retardo do debounce do switch //
ctr.contagem crescente(); Contagem crescente
em(X1); // Lê a entrada X1
ctr.claro(); // Limpa contador (contador no limite inferior)
em(X2); // Lê a entrada X2
ctr.predefinido(); // Preset counter (contador no limite superior)
Examinando a listagem acima, o primeiro passo é usar oContadorcomando para criar um objeto contadorctr, ao
mesmo tempo definindo o valor final para 10, que é equivalente aovalor predefinidopropriedade do contador. O
contador padrão é umacimacontador, então o internocontarvalor é inicialmente zero, fazendo com queQ inferior
saída a ser ativada. Pulsos aplicados aoX0entrada estão ligados aocontagem crescenteentrada, fazendo com que o
internocontarvalor a ser incrementado a cada transição de 0 para 1. Após 10 pulsos,
ocontartorna-se igual ao limite superior ouvalor predefinido, causando oQ superiorsaída a ser habilitada.
Um problema comumente encontrado com circuitos contadores éinterruptor de salto, onde os contatos do comutador 'pulam' várias vezes
(durante um período de alguns milissegundos) antes de se estabelecerem. Isso, por sua vez, pode fazer com que um único
pressionamento do botão atualize o contador várias vezes em rápida sucessão. Para evitar esse efeito, observe que um temporizador de
atraso de ativação de 10 milissegundos foi vinculado em série com oX0interruptor conectado aocontagem crescenteentrada.
Também pode ser necessário forçar manualmente o contador a voltar ao início, o que é obtido no exemplo acima
conectando a entrada do interruptorX1para oclaroentrada do contador. Opredefinidoentrada (ligada à entrada do
comutadorX2) executa uma função semelhante, mas desta vez definindo a contagem interna para o valor final ou
predefinido. Portanto, pressionando os interruptores conectados às entradasX1ouX2vai causar oQ inferiorouQ superior
saídas a serem acionadas imediatamente, respectivamente.
A criação de umcontador para baixoé bastante semelhante, conforme mostrado na listagem a seguir.
# inclui <plcLib.h>
Conexões:
Entrada de contagem - chave conectada à entrada X0 (pino A0 do Arduino)
Entrada limpa - chave conectada à entrada X1 (pino A1 do Arduino) Entrada
predefinida - chave conectada à entrada X2 (pino A2 do Arduino) Saída Q inferior -
LED conectado à saída Y0 (Arduino pino 3) Saída Q superior - LED conectado à
saída Y1 (pino 5 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 10); // 10 ms de retardo do debounce do switch //
ctr.contagem regressiva(); Contagem regressiva
em(X1); // Lê a entrada X1
ctr.claro(); // Limpa contador (contador no limite inferior)
em(X2); // Lê a entrada X2
ctr.predefinido(); // Preset counter (contador no limite superior)
A primeira diferença está na criação do objeto Contadorctr, usando oContador ctr(5, 1);comando. Além de definir o valor
predefinido para 5, o segundo parâmetro opcional tem o valor 1, fazendo com que o valor inicial da contagem seja definido
igual ao limite superior, o que é adequado para um contador decrescente. (Omitir o segundo parâmetro ou defini-lo como
zero inicializa a contagem para zero). EntradaX0é então conectado aocontagem regressivaentrada, enquanto saídaA0é
dirigido porQ inferior. Por issoA0ficará alto após 5 pulsos terem sido recebidos na entradaX0.
# inclui <plcLib.h>
Conexões:
Entrada de contagem crescente - chave conectada à entrada X0 (pino A0 do Arduino)
Entrada de contagem regressiva - chave conectada à entrada X1 (pino A1 do Arduino)
Entrada limpa - chave conectada à entrada X2 (pino A2 do Arduino) Entrada predefinida
- chave conectada à entrada X3 ( Pino A3 do Arduino) Saída Q inferior - LED conectado à
saída Y0 (pino 3 do Arduino) Saída Q superior - LED conectado à saída Y1 (pino 5 do
Arduino)
*/
Contador ctr(10); // Conta para cima ou para baixo no intervalo de 0-10, começando em
longo sem sinal TIMER0 = 0; longo zero // Define a variável usada para manter o tempo decorrido do timer 0 //
sem sinal TIMER1 = 0; Define a variável usada para manter o tempo decorrido do timer 1
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 10); // 10 ms de retardo do debounce do switch //
ctr.contagem crescente(); Contagem crescente
em(X1); // Lê a entrada 1
timerOn(TIMER1, 10); // 10 ms de retardo do debounce do switch
ctr.contagem regressiva(); // Contagem regressiva
em(X2); // Lê a entrada X1
ctr.claro(); // Limpa contador (contador no limite inferior)
em(X3); // Lê a entrada X2
ctr.predefinido(); // Preset counter (contador no limite superior)
O contador acima tem entradas separadas de contagem progressiva e regressiva vinculadas aos interruptores de entradaX0e
X1respectivamente, e cada entrada do contador tem sua própria entrada de chave debounced.
A saída de um contador é ativada uma vez que o número definido de pulsos foi detectado, mas o valor da contagem
interna normalmente não é visível para o usuário. Com efeito, o contador está 'concluído' ou 'não concluído'. Às
vezes, pode ser útil exibir a contagem interna para fins de depuração, conforme mostrado no exemplo a seguir.
# inclui <plcLib.h>
Conexões:
Entrada de contagem crescente - chave conectada à entrada X0 (pino A0 do Arduino)
Entrada de contagem regressiva - chave conectada à entrada X1 (pino A1 do Arduino)
Entrada limpa - chave conectada à entrada X2 (pino A2 do Arduino) Entrada predefinida
- chave conectada à entrada X3 ( Pino A3 do Arduino) Saída Q inferior - LED conectado à
saída Y0 (pino 3 do Arduino) Saída Q superior - LED conectado à saída Y1 (pino 5 do
Arduino)
*/
Contador ctr(10); // Conta para cima ou para baixo no intervalo de 0-10, começando em
longo sem sinal TIMER0 = 0; longo zero // Define a variável usada para manter o tempo decorrido do timer 0 //
sem sinal TIMER1 = 0; Define a variável usada para manter o tempo decorrido do timer 1
void setup() {
configuraçãoPLC(); // Configura entradas e saídas // Abre conexão
Serial.begin(9600); serial via USB
}
loop void() {
em(X0); // Lê a entrada 0
timerOn(TIMER0, 10); // 10 ms de retardo do debounce do switch //
ctr.contagem crescente(); Contagem crescente
em(X1); // Lê a entrada 1
timerOn(TIMER1, 10); // 10 ms de retardo do debounce do switch //
ctr.contagem regressiva(); Contagem regressiva
em(X2); // Lê a entrada X1
ctr.claro(); // Limpa contador (contador no limite inferior)
em(X3); // Lê a entrada X2
ctr.predefinido(); // Preset counter (contador no limite superior)
}
Listagem 22.Contador up-down com depuração. (Fonte: Arquivo > Exemplos > plcLib > Contadores >
CountUpDownDebug)
Para depurar o aplicativo, basta abrir oMonitor Serialenquanto o esboço está sendo executado. Isso exibirá repetidamente o
valor da contagem interna, com o intervalo de repetição controlado pelo comando de atraso no final da listagem. (No
entanto, não se esqueça de remover o código de depuração, uma vez que seu aplicativo esteja funcionando conforme o
esperado.)
12 Deslocamento e rotação de dados binários
A versão 0.9 do software apresentaregistradores de deslocamentoque pode ser usado para deslocar dados binários para a esquerda ou
Figura 34.Um registrador de deslocamento simples move os dados uma casa para a direita em cada borda ascendente do Clock.
O exemplo acima mostra um registrador de deslocamento simples de 8 bits, que desloca os dados uma posição para a direita
em cada borda de subida da entrada Clock. Novos dados são deslocados no lado esquerdo, enquanto os dados são descartados
quando saem do lado direito. O conteúdo de bits individuais pode ser lido das conexões de saída na parte superior.
Considerando o conteúdo numérico do registrador de deslocamento, deslocar os dados para a direita equivale a uma
divisão por dois, pois o bit mais significativo está à esquerda. Por outro lado, deslocar para a esquerda seria equivalente a
multiplicar por dois.
O primeiro passo é usar oMudançacomando para criar um registrador de deslocamentoobjeto, que tem uma largura de
dados fixa de 16 bits. O conteúdo inicial do registro pode opcionalmente ser definido na criação. Por exemplo, o comando
Shift shift1(0x8888);cria um objeto registrador de deslocamento chamadoturno1com um conteúdo hexadecimal inicial de
0x8888, que é equivalente a 1000 1000 1000 1000 em binário.
Várias outras tarefas de configuração também são necessárias, incluindo a definição doentrada de dados seriais,entrada do
relógio(deslocando dados para a direita neste caso),redefinir entradae qualquersaída paralelaconexões, conforme ilustrado
pelo símbolo do bloco de função a seguir.
# inclui <plcLib.h>
Conexões:
Entrada serial - switch conectado à entrada X0 (pino A0 do Arduino) Entrada de
relógio - switch conectado à entrada X1 (pino A1 do Arduino)
Redefinir Entrada - switch conectado à entrada X2 (pino A2 do Arduino) Saída -
LED conectado à saída Y0 (pino 3 do Arduino)
Saída - LED conectado à saída Y1 (pino 5 do Arduino) Saída - LED
conectado à saída Y2 (pino 6 do Arduino) Saída - LED conectado à
saída Y3 (pino 9 do Arduino)
*/
Shift shift1(0x8888); // Cria um registrador de deslocamento de 16 bits com valor inicial 0x8888
// Pedaço 1111 11
// Posições 5432 1098 7654 3210
// |||| |||| |||| ||||
// X0 -> -> -> -> 1 0 0 0 -> 1 0 0 0 -> 1 0 0 0 -> 1 0 0 0 ->
// ||||
// X1 -> Relógio ||||
// ||||
// X2 -> Reiniciar ||||
//
// AAAA
// Saídas 3210
longo sem sinal TIMER0 = 0; // Define a variável usada para debounce do switch
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
Os dados são deslocados para a direita pela borda de subida da entrada do relógio obtida de um switch conectado à entradaX1, com
novos dados deslocados à esquerda retirados do interruptor de entradaX0. (Observe que o problema potencial desalto de contatona
entrada do relógio é evitada pelo uso de um atraso de debounce do switch de 10 ms.) Entrada
swicthX2fornece uma entrada de reinicialização, limpando o registrador de deslocamento para zero quando pressionado. As saídas paralelas
são obtidas dos bits 15–12, permitindo que qualquer dado serial recém-introduzido seja imediatamente visível nas saídas.
É fácil modificar o esboço acima para deslocar os dados para a esquerda, conforme mostrado abaixo.
# inclui <plcLib.h>
Conexões:
Entrada Serial - switch conectado à entrada X0 (pino A0 do Arduino) Entrada de
Clock - switch conectado à entrada X1 (pino A1 do Arduino) Entrada Reset - switch
conectado à entrada X2 (pino A2 do Arduino) Saída - LED conectado à saída Y0
(pino 3 do Arduino )
Saída - LED conectado à saída Y1 (pino 5 do Arduino) Saída - LED
conectado à saída Y2 (pino 6 do Arduino) Saída - LED conectado à
saída Y3 (pino 9 do Arduino)
*/
Shift shift1(0x1111); // Cria um registrador de deslocamento de 16 bits com valor inicial 0x1111
// Pedaço 1111 11
// Posições 5432 1098 7654 3210
// |||| |||| |||| ||||
// <- 0 0 0 1 <- 0 0 0 1 <- 0 0 0 1 <- 0 0 0 1 <-
X0
// ||||
// X1 -> Relógio ||||
// ||||
// X2 -> Reiniciar ||||
//
// AAAA
// Saídas 3210
longo sem sinal TIMER0 = 0; // Define a variável usada para debounce do switch
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
ShiftEsquerda)
As principais diferenças são em primeiro lugar a conexão do relógio (interruptorX1) para oshiftEsquerdaentrada e, em segundo
lugar, a conexão de saídas paralelas aos bits 3–0 do registrador de deslocamento. (O último permite que os dados deslocados à
direita sejam imediatamente visíveis nas saídas, à medida que se movem para a esquerda).
Figura 36.Adicionar uma conexão de realimentação faz com que os dados sejam girados para a direita ou para a esquerda em um loop contínuo.
De fato, a conexão de realimentação pode ser obtida de qualquer bit de saída conveniente, criando assim um padrão de bit
circulante de qualquer largura desejada. Como exemplo, o esboço a seguir usa o bit 12 do registrador de deslocamento como a
conexão de realimentação para a entrada serial (ou seja, o 4ºbit da esquerda), para girar uma palavra de dados de 4 bits para a
direita.
# inclui <plcLib.h>
Conexões:
Entrada Clock - switch conectado à entrada X0 (pino A0 do Arduino) Entrada
Reset - switch conectado à entrada X1 (pino A1 do Arduino) Saída - LED
conectado à saída Y0 (pino 3 do Arduino)
Saída - LED conectado à saída Y1 (pino 5 do Arduino) Saída - LED
conectado à saída Y2 (pino 6 do Arduino) Saída - LED conectado à
saída Y3 (pino 9 do Arduino)
*/
Shift shift1(0x8000); // Cria um registrador de deslocamento com valor inicial 0x8000 // (os
4 bits mais à esquerda são girados para a direita)
// Saídas AAAA
// 3210
//
// Pedaço 1111
// Posições 5432
// ||||
// -> 1 0 0 0 ->
// | |
// | |
// X0 -> Relógio - <--<--<--<--
//
// X1 -> Reiniciar
longo sem sinal TIMER0 = 0; // Define a variável usada para debounce do switch
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
Um esboço equivalente para girar uma palavra de dados de 4 bits para a esquerda usaria o bit 3 (o 4ºbit da direita) como a
conexão de realimentação, conforme mostrado no exemplo a seguir.
# inclui <plcLib.h>
Conexões:
Entrada Clock - switch conectado à entrada X0 (pino A0 do Arduino) Entrada
Reset - switch conectado à entrada X1 (pino A1 do Arduino) Saída - LED
conectado à saída Y0 (pino 3 do Arduino)
Saída - LED conectado à saída Y1 (pino 5 do Arduino) Saída - LED
conectado à saída Y2 (pino 6 do Arduino) Saída - LED conectado à
saída Y3 (pino 9 do Arduino)
*/
Shift shift1(0x0001); // Cria um registrador de deslocamento com valor inicial 0x0001 // (os
4 bits mais à direita são girados para a esquerda)
// Saídas AAAA
// 3210
// Pedaço
// Posições 3210
// ||||
// <- 0 0 0 1 <-
// | |
// | |
// X0 -> Relógio ->-->-->-->--
//
// X1 -> Reiniciar
longo sem sinal TIMER0 = 0; // Define a variável usada para debounce do switch
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
OscanValuevariável global contém o valor inserido, que está no intervalo 0-1023 para uma entrada analógica. Isso é
escalado automaticamente na faixa de 0-255 ou 0-179 quando usado para controlar uma saída PWM ou servo,
respectivamente.
# inclui <plcLib.h>
Conexões:
Entrada - potenciômetro conectado à entrada X0 (pino A0 do Arduino) Saída - LED
conectado à saída Y0 (pino 3 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
emAnalógico(X0); // Lê a entrada analógica 0
outPWM(Y0); // Envia para a Saída 0 como forma de onda PWM
}
Listagem 27.Controle analógico de uma saída PWM (Fonte: Arquivo > Exemplos > plcLib > EntradaSaída >
PWM)
Dois canais de motor estão disponíveis -Canal AeCanal B–e o shield também suporta um pequeno número de conectores de
entrada e saída compatíveis com Tinkerkit (mais duas interfaces TWI/I2C não consideradas aqui). A imagem acima mostra
um potenciômetro linear conectado ao pinoX2(A2), usado para controlar a velocidade do motor via PWM, e um interruptor
de inclinação que controla a direção do motor, ligado ao pinoX3(A3).
# inclui <plcLib.h>
Conexões:
Entrada - Velocidade - potenciômetro conectado à entrada X2 (pino A2 do Arduino) Entrada -
Direção - chave conectada à entrada X3 (pino A3 do Arduino) Saída - Direção do canal A
(DIRA) - pino 12 do Arduino
Saída - Canal A PWM (PWMA) - Arduino pino 3 Saída - Canal A Freio
(BRAKEA) - Arduino pino 9
*/
// Variáveis
unsigned int RUN = 0; // Desabilita o freio
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
loop void() {
// Direção de controle do motor // Interruptor
em(X3); de leitura conectado à entrada 3 // Saída para
fora(DIRA); DIRA (direção do motor)
Observe que várias variáveis predefinidas estão disponíveis para simplificar ao máximo a codificação do software
de controle do motor, conforme resumido abaixo:
# inclui <servo.h>
# inclui <plcLib.h>
Conexões:
Entrada - potenciômetro conectado à entrada X0 (pino A0 do Arduino) Saída -
servo conectado à saída Y0 (pino 3 do Arduino)
*/
externo int scanValue; // Link para scanValue definido no arquivo da biblioteca PLC
void setup() {
configuraçãoPLC(); // Configura entradas e saídas // Conecta o
servo1.attach(Y0); Servo 1 à Saída 0
}
loop void() {
emAnalógico(X0); // Potenciômetro de leitura conectado à entrada 0 // Saída
outServo(servo1); para Servo 1 (conectado à Saída 0)
}
Observação:Veja oEntradaSaídaseção dos arquivos de exemplo para um esboço de controle de servo duplo.
15 Comparando Valores Analógicos
Comandos de comparação analógica fornecem funcionalidade equivalente a umcomparadorcircuito, dando um
verdadeiro/falsoresultado com base em qual dos dois sinais analógicos testados é o maior.
O símbolo do circuito para um comparador eletrônico é triangular, com duas entradas analógicas à esquerda e
uma única saída digital à esquerda. Aaltosaída é produzida se a tensão aplicada à parte superiorV+, o terminal de
entrada é maior do que o conectado ao inferior,V–entrada (chamada deentrada não inversorae aentrada inversora,
respectivamente). Caso contrário, umbaixosaída é produzida.
O exemplo a seguir testa se a tensão analógica na entradaX0é maior do que na entradaX1, definindo a
saídaA0se isso é verdade.
# inclui <plcLib.h>
Conexões:
Entrada Analógica - potenciômetro conectado à entrada X0 (pino A0 do Arduino) Entrada
Analógica - potenciômetro conectado à entrada X1 (pino A1 do Arduino) Saída Digital - LED
conectado à saída Y0 (pino 3 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
emAnalógico(X0); // Ler entrada analógica 0 // X0 >
compareGT(X1); X1 ?
fora(Y0); // Y0 = 1 se X0 > X1, Y0 = 0 caso contrário
}
Listagem 30.Maior que teste entre dois pinos de entrada usando um comparador (Fonte: Arquivo > Exemplos >
plcLib > AnalogCompare > GreaterThan)
Também é possível comparar uma entrada analógica com uma referência fixa, conforme mostrado no exemplo a
seguir.
# inclui <plcLib.h>
Conexões:
Entrada Analógica - potenciômetro conectado à entrada X0 (pino A0 do Arduino) Saída Digital -
LED conectado à saída Y0 (pino 3 do Arduino)
*/
void setup() {
configuraçãoPLC(); //Configura entradas e saídas
}
loop void() {
emAnalógico(X0); // Ler entrada analógica 0 // X0 <
compareLT(limiar); 500?
fora(Y0); // Y0 = 1 se X0 < 500, Y0 = 0 caso contrário
}
Listagem 31.Menor que o teste do comparador entre uma entrada e um limite fixo (Fonte: Arquivo >
Exemplos > plcLib > AnalogCompare > LessThanThreshold)
Figura 39.Um comparador de limite duplo indica se a entrada está acima ou abaixo de uma 'janela' permitida.
O comparador superior faz com que seu LED associado acenda se a tensão de entrada,V1é maior que um limite fixo de 3,5
V. Por outro lado, o comparador inferior fornece uma saída se sua tensão de entrada for menor que sua tensão limite de
1,5 V. (Observe cuidadosamente a polaridade de cada conexão de entrada do comparador para entender como 'maior
que' ou testes 'menos que' são alcançados.)