Bom dia, sei que existem muitas perguntas sobre esse tópico mas eu acredito que meu conhecimento de Modbus e RS485 estejam bem consolidados, por isso acredito que seja problema na forma de como eu estou fazendo as requisições pelo Arduino, vou começar a descrever meu problema:
Foi me passado uma série de equipamentos que se comunicam via RS485, utilizando o protocolo Modbus RTU, mas para facilitar primeiramente o teste está sendo feito com um Sensor de fluxo ultrassônico, o manual do equipamento está em: https://images-na.ssl-images-amazon.com/images/I/91CvZHsNYBL.pdf
Pois bem, seguindo o manual verifiquei que as funções admitidas pelo equipamento são as funções:
0x03 Read Holding Registers;
0x06 Write Single Registers;
um dos passos para configuração também é o ajuste dos parâmetros, nas funções chave:
M52 - Envia dados RS485 - no display - Send to RS485;
M62 - RS232/RS485 setup, que é onde ajusto as configurações de Baud Rate, Stop Bit e paridade;
M63 - Seleciona Protocolo de Comunicação - Modbus RTU only ou MODBUS ASCII+TDS7;
M46 - indico o endereço do equipamento.
Uma função adicional que o equipamento possui é a M49 que eu tenho a possibilidade de ver os dados que estão sendo passados via RS485; por exemplo : 02 02 0001 0002 95F8;
Nesse caso eu estava Setando endereço 2, função 0x02(ReadHoldingRegisters), Registro inicial 0001 e leitura de 2 registros;
pois bem, quando eu tento receber a resposta via Serial do Arduino não retorna nenhum valor e ainda aparece uns símbolos na serial , que são um pouco estranhos;
Tags:
Vou encaminhar o código que eu propus alterando o exemplo do RS485 HALFduplex:
#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(9600);
// 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;
result = node.readHoldingRegisters(0x00, 2);
if (result == node.ku8MBSuccess)
{
Serial.print("flow meter");
Serial.println(node.getResponseBuffer(0x00)/1.0f);
}
delay(1000);
}
uma das minhas observações do manual indicou que os dados do registrador são do tipo int4, mas acredito que por algum motivo o programa não entra no loop de resposta;
No manual existe um exemplo para comunicação , o exemplo usado é :
01 03 00 00 00 0A C5 CD, para leitura dos registros de 0001 até 0010 em decimal gostaria de saber se o CRC diferente pode causar esse problema, ou se é outra coisa como falta de entendimento na classe e nas funções
UMA última informação, verifiquei pelo osciloscópio que o equipamento respondeu, porém creio que o problema esteja na forma de como eu esteja fazendo a aquisição para mostrar na serial do arduino
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por