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;

Exibições: 778

Anexos

Responder esta

Respostas a este tópico

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

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço