Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como usar o Modbus com Arduino

Componentes e suprimentos

Arduino UNO
× 1
Escudo profissional RS422 / RS485 para Arduino
× 1
Conversor USB para RS485
× 1
Breadboard (genérico)
× 1
LED (genérico)
× 1
Resistor 10k ohm
× 1
Resistor 221 ohm
× 1
Fios de jumpers (genérico)
× 1
SparkFun Botão de pressão 12 mm
× 1

Aplicativos e serviços online

Arduino IDE
Modbustester

Sobre este projeto


O Modbus, um padrão de comunicação serial, tornou-se um protocolo de comunicação padrão de fato e agora é um meio comumente disponível de conectar dispositivos eletrônicos industriais. No Modbus RTU e Modbus ASCII, RS485 é usado como a camada física. É possível usar um Arduino como escravo (e com algumas restrições também como mestre) em aplicações Modbus, mas uma interface RS485 é necessária. Nosso escudo RS422 / RS485 é um escudo de comunicação serial isolado totalmente galvânico projetado para uso com o Arduino UNO e outras placas compatíveis como Arduino 101, STM Nucleo ... Este escudo é a escolha perfeita para esse tipo de aplicação.

O objetivo deste documento é mostrar como criar junto com um Arduino UNO um dispositivo escravo Modbus simples. Usaremos um PC como mestre Modbus.

Ferramentas e materiais
  • Arduino UNO
  • RS485 Shield para Arduino
  • Qualquer adaptador RS485-USB para conexão ao PC (ou mais barato)

Opcional:
  • Placa de ensaio
  • Botão de pressão
  • LED vermelho
  • Resistor de 220 Ohm
  • Resistor de 10k
  • Jumper fios

Software
  • Arduino IDE
  • Modbustester





Fiação RS485:


A fiação é muito simples. Você deve conectar apenas os terminais A e B da blindagem com a linha A e B do sistema Modbus. Os terminais Y e Z não são usados ​​para este tipo de aplicação. Para longas distâncias, é recomendável usar pares trançados para A e B.





Fiação do Arduino (opcional):


Recomenda-se adicionar um LED e um botão ao Arduino para ver alguns efeitos da comunicação Modbus. É opcional e não é necessário.





Configurações do interruptor DIP:


O RS422 / RS485 Shield vem com 3 bancos de chaves DIP. Você deve definir essas chaves DIP para Modbus, conforme mostrado na imagem abaixo.

Chave 1:1-OFF 2-ON 3-ON 4-OFF

Chave 2:1-OFF 2-OFF 3-ON 4-ON

Chave 3:1-OFF ou ON * 2-OFF 3-OFF 4-OFF

* Dependendo da posição da blindagem RS422 / RS485 na linha Modbus, você deve ligar ou desligar o resistor de terminação. Mude o resistor para a posição ON somente se a blindagem estiver em uma extremidade da linha de ônibus. Em todos os outros casos, desligue o resistor de terminação:





Configurações de jumpers:


Você pode encontrar 3 áreas de jumpers diferentes na blindagem. Muito importante é o Jumper JP1 para a tensão de alimentação. O Arduino UNO funciona com 5V internamente. Você deve definir este Jumper para a posição 5 V (para placas de 3,3 V, por exemplo, Arduino 101 para a posição de 3,3 V).

Além disso, defina os jumpers para as portas de comunicação no canto superior esquerdo, como na imagem acima. O UART interno na porta 0 e 1 será conectado neste caso à interface RS485 da blindagem.

Por último, mas não menos importante, temos que definir o Jumper para a porta de controle RX / TX. Não usamos este Jumper, porque a comutação automática RX / TX está configurada.





Instale o software Modbus Tester no PC:


Usaremos neste exemplo o PC como mestre Modbus. Você tem que baixar o Modbustester. Descompacte o arquivo zip em um novo diretório em seu disco rígido. Abra o software e altere os campos marcados conforme a figura abaixo. Você deve conectar o adaptador USB-RS485 antes- Escolha a porta COM correta para este adaptador no Modbustester.





Software Arduino:


Carregue o firmware no IDE do Arduino para compilar e programar.





Teste seu trabalho:


Agora é hora de testar seu trabalho!

Você pode pressionar o botão Ler no Modbustester. Este comando lerá 8 bytes da memória de nosso novo dispositivo escravo. No endereço 400008 você encontra o status do botão. O endereço 400001 - 400006 contém valores das portas ADC.

Com o botão de escrita você pode manipular os registros no escravo. Você pode inserir no endereço 400007 0 ou 1 para ligar ou desligar o LED.


Código

  • Amostra de código para Arduino UNO
Amostra de código para Arduino UNO Arduino
 / * * Programa de teste para Arduino RS422 / RS485 Shield * Versão 1.0 * Copyright (C) 2018 Hartmut Wendt www.zihatec.de * * (baseado em fontes de https://github.com/angeloc/simplemodbusng) * * * Este programa é um software livre:você pode redistribuí-lo e / ou modificá-lo * sob os termos da GNU General Public License conforme publicada * pela Free Software Foundation, seja a versão 3 da Licença, ou * (a sua escolha) qualquer versão posterior. * * Este programa é distribuído na esperança de que seja útil, * mas SEM NENHUMA GARANTIA; sem mesmo a garantia implícita de * COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. Consulte a * GNU General Public License para obter mais detalhes. * * Você deve ter recebido uma cópia da GNU General Public License * junto com este programa. Caso contrário, consulte . * / #Include  #define ledPin 12 // led integrado #define buttonPin 7 // botão de pressão / * Este código de exemplo tem 9 registradores de retenção. 6 entradas analógicas, 1 botão, 1 saída digital e 1 registro para indicar erros encontrados desde o início. A função 5 (write single coil) não está implementada, então estou usando um registrador inteiro e a função 16 para definir o Led integrado no Atmega328P. O método modbus_update () atualiza a matriz de registro holdingRegs e verifica a comunicação. Nota:O buffer de anel serial do Arduino tem 128 bytes ou 64 registros. Na maioria das vezes, você conectará o arduino a um mestre via serial usando um MAX485 ou similar. Em uma solicitação de função 3, o mestre tentará ler de seu escravo e, como 5 bytes já são usados ​​para ID, FUNÇÃO, NO DE BYTES e dois BYTES CRC, o mestre só pode solicitar 122 bytes ou 61 registros. Em uma solicitação de função 16, o mestre tentará escrever em seu escravo e como um 9 bytes já é usado para ID, FUNÇÃO, ENDEREÇO, NÃO DE REGISTROS, NÃO DE BYTES e dois BYTES CRC, o mestre só pode gravar 118 bytes ou 59 registros . Usando o conversor FTDI USB para serial, o máximo de bytes que você pode enviar é limitado ao buffer interno, que é de 60 bytes ou 30 registros internos não assinados. Assim:Em uma solicitação de função 3, o mestre tentará ler de seu escravo e como 5 bytes já são usados ​​para ID, FUNÇÃO, NO OF BYTES e dois BYTES CRC, o mestre só pode solicitar 54 bytes ou 27 registradores. Em uma solicitação de função 16, o mestre tentará escrever em seu escravo e como um 9 bytes já é usado para ID, FUNÇÃO, ENDEREÇO, NÃO DE REGISTROS, NÃO DE BYTES e dois BYTES CRC, o mestre só pode gravar 50 bytes ou 25 registradores . Como é assumido que você usará principalmente o Arduino para se conectar a um mestre sem usar um conversor USB para serial, o buffer interno é definido da mesma forma que o buffer de anel serial do Arduino, que tem 128 bytes. * / // O uso da instrução enum permite para um método fácil de adicionar e // remover registros. Fazendo desta forma você economiza #definir o tamanho // do array de registro de seus escravos cada vez que você deseja adicionar mais registros // e em um relance informa a você sobre o layout de seu registro de escravos./////////// ///// registradores do seu escravo /////////////////// enum {// apenas adicionar ou remover os registradores e pronto ... // O primeiro registro começa no endereço 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // deixe este TOTAL_REGS_SIZE // número total de registros para a função 3 e 16 compartilham a mesma matriz de registro}; sem sinal int holdingRegs [ TOTAL_REGS_SIZE]; // função 3 e 16 register array //////////////////////////////////////////// //////////////////// void setup () {/ * parâmetros (long baudrate, unsigned char ID, unsigned char transmitir habilitar pin, unsigned int holding registers size, unsigned char low latency ) O pino de habilitação de transmissão é usado em comunicação half duplex para ativar um MAX485 ou similar para desativar este modo, use qualquer valor <2 porque 0 e 1 é reservado para Rx e Tx. Atrasos de baixa latência tornam a implementação fora do padrão, mas praticamente funciona com todas as principais implementações de mestre modbus. * / modbus_configure (9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode (ledPin, OUTPUT); pinMode (buttonPin, INPUT); } void loop () {// modbus_update () é o único método usado em loop (). Ele retorna a contagem total de erros // desde que o escravo foi iniciado. Você não precisa usá-lo, mas é útil // para encontrar falhas pelo mestre modbus. holdingRegs [TOTAL_ERRORS] =modbus_update (holdingRegs); para (byte i =0; i <6; i ++) {holdingRegs [i] =analogRead (i); atraso Microssegundos (50); } byte buttonState =digitalRead (buttonPin); // ler estados do botão // atribuir o valor de buttonState ao registrador holding holdingRegs [BUTTON_STATE] =buttonState; // lê o valor do registro LED_STATE e define o LED onboard alto ou baixo com a função 16 byte ledState =holdingRegs [LED_STATE]; if (ledState) // definir led {digitalWrite (ledPin, HIGH); } else if (ledState ==0) // zera o led {// digitalWrite (ledPin, LOW); holdingRegs [LED_STATE] =0; }} 

Esquemas

Fiação de alguns componentes de teste para o Arduino

Processo de manufatura

  1. C# Queue com Exemplos:O que é C# Queue e como usar?
  2. Luzes de dimerização com PWM usando o botão de ação
  3. Jogo Arduino Gyroscope com MPU-6050
  4. Unopad - Controlador Arduino MIDI com Ableton
  5. Sensor de obstáculo simples com Arduino
  6. Encontre-me
  7. Joystick Arduino
  8. Quão fácil é usar um termistor ?!
  9. Como fazer música com um Arduino
  10. Como usar NMEA-0183 com Arduino