Ir ao conteúdo

Posts recomendados

Postado

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);
}

 

  • mês depois...
Postado

@Wyara Souza ,

 

No protocolo Modbus não é necessário configurar o endereço do Slave ( inversor )  para fazer a comunicação com ele ?

E você conferiu o baudrate para bater com o do inversor ?

 

Paulo

 

  • Curtir 2
Postado

 

@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
Postado

@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.

Postado

@aphawk  Olá, estou usando o conversor TTL pra RS485 (FIGURA 1). Uma coisa que percebi e que não citei aqui é que o erro E0 só aparece quando eu não conecto o GND do driver RS485 do inversor ao do arduino. Se eu conectar passo a receber erro de timeout...

image.png.069ee92e9db12789ed044d4d5e6dada2.png

Postado

@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
Postado

@aphawk Obrigada por responder! Sim, esse módulo já tem um resistor de terminação. Sobre trocar de library já testei todas que consegui encontrar e nada..kkkk

Postado

@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
Postado

@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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!