Arduino Modbus RS485 e PM710


#1

Olá, estou trabalhando no desenvolvimento de um supervisório de um multimedidor elétrico PM710, como sou novo no assunto e tive que aprender a pouco o que é RS485 e Modbus, ainda não está muito claro como farei para fazer as aquisições de dados pelo arduino;
A minha ideia é usar o Arduino uno como Mestre e o PM710 como Escravo, a classe que eu estou querendo usar é a ModbusMaster, gostaria de saber se é possível usar apenas 1 Arduino para isso, ou preciso de um mestre para fazer as requisições e outro para receber os dados e mostrar na serial ?
*primeira dúvida


#2

Se vai ligar seu medidor direto ao scadabr nao precisa de arduino. O scadabr eh master. Basta usar um adaptador usb rs485

Veja o video abaixo do Fernando Simplicio da microgenios sobre o assunto:

Nao importa quantos devices rs485 precise. Cada um deve ter um endereco proprio.

Agora se nao vai usar scadabr e so arduino este deve ser o master


#3

Obrigado pela sugestão, por enquanto não vou usar o ScadaBr, irei utilizar o Arduino como master


#4

Agora uma nova dúvida, estou utilizando o Arduino Uno como master, e utilizando a classe ModbusMaster do github, procurei alguns vídeos e um dos mais próximos que eu encontrei e com áudio em inglês, não que isso importe muito.
https://www.youtube.com/watch?v=HPZrGuBtk_c&t=3s Parte 1
https://www.youtube.com/watch?v=tBw15SfmuwI Parte 2
Com isso, eu gostaria de saber se o código dos endereços que vem no manual do PM710 está em decimal ou já está em hexa, pra eu alterar o código exemplo do modbusMaster


#5


#6

#include <ModbusMaster.h>

/*!
We’re using a MAX485-compatible RS485 Transceiver.
Rx/Tx is hooked up to the hardware serial port at ‘Serial’.
The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE 3
#define MAX485_RE_NEG 2

// instantiate ModbusMaster object
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(115200);

// Modbus slave ID 1
node.begin(1, Serial);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}

bool state = true;

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

// Toggle the coil at address 0x0002 (Manual Load Control)
result = node.writeSingleCoil(0x0002, state);
state = !state;

// Read 16 registers starting at 0x3100)
result = node.readInputRegisters(0x3100, 16);
if (result == node.ku8MBSuccess)
{
Serial.print("Vbatt: ");
Serial.println(node.getResponseBuffer(0x04)/100.0f);
Serial.print("Vload: ");
Serial.println(node.getResponseBuffer(0xC0)/100.0f);
Serial.print("Pload: ");
Serial.println((node.getResponseBuffer(0x0D) +
node.getResponseBuffer(0x0E) << 16)/100.0f);
}

delay(1000);
}
_código exemplo


#7

Boa noite!

Estou me aventurando no mesmo projeto, porém encontrando a dificuldades, pesquisando no site vi essa postagem. @Yagodeleon conseguiu sucesso no seu projeto? Teria alguma dica ou direção a ser tomada?
Obrigado