Ir ao conteúdo
  • Cadastre-se

Arduino Problema na comunicação entre inversor FV e arduino via RS485(MAX485)


WMAC

Posts recomendados

Olá, estou tentando realizar a aquisição de dados de geração de um inversor FV com um arduino. O Modbus RTU (MAX485) é o protocolo de comunicação aceito pelo inversor. Desta forma, estou usando o MAX485 (RS485---> TTL) e a biblioteca ModbusMaster para realizar essa aquisição. O problema é que não consigo resposta nenhuma por parte do inversor..só aparece o código de erro de timeout..O hardware está conectado da seguinte forma:

 

INVERSOR ---- MAX 485----- ARDUINO MEGA    

A (D+) -----------  A

B (D-) -------------B

GND -------------GND-------------GND

                          RO --------------RX

                          RE ---------------2

                          DE----------------3

                          DI-----------------TX   

                        VCC---------------5V

 

Segue abaixo o código que teste. Já troquei a fiação, os pinos TX/RX por TX1  e RX1, teste RE/DE  por outros pinos mas nada funciona...Se alguém tiver ideia do que pode estar ocorrendo e puder compartilhar, agradeço muito!

 

#include <ModbusMaster.h>

#define MAX485_DE      3
#define MAX485_RE_NEG  2

ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 115200 baud
  Serial.begin(19200);

  node.begin(7,Serial);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

bool state = true;

void loop()
{
  uint8_t result;
  uint16_t data[6];

  result = node.readHoldingRegisters(3, 6);
  Serial.println(result);
   delay(20); 
         if (result == node.ku8MBSuccess) {
        Serial.print("VCC");
        Serial.println(node.getResponseBuffer(0x00)/10); //reg 3
        Serial.print("I de linha");
        Serial.println(node.getResponseBuffer(0x01)/10);//reg 4
        Serial.print("Potencia");
        Serial.println(node.getResponseBuffer(0x04)/10);//reg 6
        Serial.print("Potencia aparente ");
        Serial.println(node.getResponseBuffer(0x03)/10);//reg 7
        Serial.print("Potencia reativa");
        Serial.println(node.getResponseBuffer(0x05)/10);//reg 8       
      } else {
        Serial.println("Falha de comunicacao");
      }

      node.clearResponseBuffer();


delay(1000);
}

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...

 

@Thiago Miotto  obrigada por responder! Já tentei isso e não funcionou.

@aphawk obrigada por responder! Sim, o endereço (slave ID) que estou usando é o ID 7 e ele está especificado em: node.begin(7,Serial) no código. Os parâmetros de comunicação como ID, baud rate, paridade estão todos corretos pois posso conferir no monitor que o inversor tem.

Inclusive usei o software Modbus Poll para simular um mestre e consigo ver o tráfego de dados entre o inversor e o PC usando um conversor RS485/USB, e funciona perfeitamente..

Também já usei o Modbus Slave para testar o código e circuito com arduino e o conversor RS485/TTL e também tenho sucesso na comunicação. Entretanto quando junto o circuito com arduino e o inversor não tenho resposta..

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk  pela minha pesquisa, acredito que o problema tenha relação com polarização e/ou terminação de linha que o inversor pode possuir/precisar. Isso pode estar corrompendo os dados transmitidos, pois o que consta é o erro de código 0xE0 o qual representa diferença entre o ID requisitado e o da resposta...

No manual existem algumas informações mas não o suficiente que indiquem a necessidade de implementar a polarização ou terminação da linha. Estou aguardando mais esclarecimentos por parte do fabricante do inversor. Qualquer avanço, eu posto aqui.

Link para o comentário
Compartilhar em outros sites

@Wyara Souza ,

 

Esse módulo é Half-duplex, e muita gente relata dificuldade de fazer ele funcionar  com os pinos DE e RE separados. Como eles são complementares , junte os dois e ligue ao mesmo pino do Arduino, assim quando quiser transmitir basta apenas colocar esse pino em nível 1; depois volte para 0 para ficar na recepção.

E use um resistor de 120 ohms ligado também  nos terminal A e B, pois o Bus tem de ser terminado senão ocorrem erros de monte, embora alguns falem que só é indispensável em longas distâncias. Mas pode ser que já exista esse resistor em seu módulo...

 

Ah , e tem de ligar o GND do módulo ao Arduíno, além de ser necessário também ligar ao GND do seu inversor FV, pois o RS485 usa 3 fios.

 

Se ainda não funcionar, sugiro trocar de library, pois existem várias , cada uma faltando alguma coisa lkkkk o pessoal fala para experimentar ....

 

Paulo

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Wyara Souza ,

 

Caramba ... é uma coisa tão simples ! 

 

Dá uma olhada aqui :

 

https://www.arduinoecia.com.br/como-usar-comunicacao-rs485-com-arduino

 

Deveria funcionar de primeira ...., será que esse módulo está bom ?

 

Aqui tem bastante informação :

 

http://real2electronics.blogspot.com/2009/09/arduino-and-rs485-english-version.html

 

E o exemplo que tem é SEM BIBLIOTECA ... fica mais fácil de achar onde está o seu problema.

 

Paulo

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@aphawk  obrigada pelas dicas! Realmente deveria ser simples mesmo, até porque eu testei com Modbus Slave e deu tudo certo...inclusive eu retirei o resistor de terminação do módulo para ver se funcionava uma vez, teoricamente, redes de curta distância não precisam dele. Não funcionou...

 

O módulo está bom e funciona mas não com o inversor (como eu disse testei o circuito e o código usando o Modbus Slave)

 

Felizmente, testei a comunicação apenas com o CI MAX485 (nem os resistores de polarização e terminação) e usando a biblioteca ModbusMaster e funcionou perfeitamente (até que enfim....rs). Eu deveria ter feito isso bem antes mas como tudo funcionava com o simulador ficou difícil encontrar o erro..

 

Quero agradecer a todos que deram um pouco de seu tempo pra me ajudar aqui no fórum. Obrigada!

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...