Galera estou com uma duvida é possível o arduino utilizando a biblioteca Modbus fazer leitura de um sensor de densidade.

no manual ele informa os endereços

poderia utiliza um ci max485 para liga o arduino ao sensor?

na net encontrei um código http://playground.arduino.cc/Code/ModbusMaster

#include <ModbusMaster.h>
// instantiate ModbusMaster object as slave ID 2
// defaults to serial port 0 since no port was specified
ModbusMaster node(2);
void setup()
{
// initialize Modbus communication baud rate
node.begin(19200);
}
void loop()
{
static uint32_t i;
uint8_t j, result;
uint16_t data[6];
i++;
// set word 0 of TX to least-significant word of counter (bits 15..0)
node.TX(0, lowWord(i));
// set word 1 of TX to most-significant word of counter (bits 31..16)
node.TX(1, highWord(i));
// slave 1: write TX to (2) 16-bit registers starting at register 0
result = node.WriteMultipleRegisters(0, 2);
// slave 1: read (6) 16-bit registers starting at register 2 to RX
result = node.ReadHoldingRegisters(2, 6);
// do something with data if read is successful
if (result == node.ku8MBSuccess)
{
for (j = 0; j < 6; j++)
{
data[j] = node.RX(j);
}
}
}

eu estou com duvida é esta parte que faz a leitura do sensor?

// slave 1: read (6) 16-bit registers starting at register 2 to RX
result = node.ReadHoldingRegisters(2, 6);

No local do "6" eu colocaria do endereço que estão no manual?


Obrigado Pessoal.

Exibições: 3172

Responder esta

Respostas a este tópico

Cabecavil,

claro que dá. Ao ver a imagem fiquei doido. Minha rede usa o ScadaBR com uma rede física RS485 usando o protocolo modbus rtu.

Entao, ao ver os dados vejo que dá perfeito.

Tem tudo que precisa. A biblioteca que usou é boa, mas uso outra. Mas é questão de tempo. Se vc colocar um ethernet shield 5100 (oficial do arduino) e abrir o roteador eu leio do meu scadabr.

Conta qual a sua aplicação. Para que você quer usar ele?

Sidney Obrigado pela Ajuda,

A ideia é fazer a leitura da densidade e da temperatura do biodiesel que esta no pequeno tanque.

Cabecavil,

então mãos a obra pois é só configurar.

Coloca o sensor no seu scada, abre a conexão para internet e vamos configurar. Em uns 20 minutos ta funcionando. Arruma uma câmera para eu curtir a emoção também.

 

Amigo Sidney,me desculpe a demora para responder

Como eu sou estagiário o meu supervisor me pedi-o para primeiro faz teste com microcontrolador (fazendo um master e o outro slave) com uma rede modbus.

já fiz o teste utilizando comunicação serial via rede RS-485. agora vou tenta fazer a comunicação modbus master / escravo. apos funcionar tudo eu vou pode testa no sensor.

A ideia do sistema é o atmega328 lê os dados de temperatura, densidade e concentração do sensor e envia para um banco de dados.

O problema agora é lê o sensor.... vou tenta ate o fim desta semana terminar a rede com os  microcontroladores..

Sidney poderia informa qual biblioteca modbus foi utilizada no seu projeto?

Novamente Muito Obrigado pela Ajuda :>)

Cabecavil,

estou estou a disposição. To doido para ver seu sensor funcionar. Eu  uso a biblioteca do JPMZOMETA mas lembre-se que só funciona uma das funções do modbus nela.

Mas o material que ja tem aqui no LDG, especialmente o manual do produto da loja feito por nosso amigo Wiechert vai resolver todas as suas dúvidas.

To aguardando.

Pessoal, desculpem a intromissão na conversa de vocês, mas vocês poderiam me informar o sensor que usaram ou estão usando, por que eu em breve vou começar um projeto parecido e estou realizando algumas pesquisas.

Obrigado.

é uma sensor de medir densidade de óleos 

Sidney, só pode iniciar os teste com o sensor agora utilizando um simulador de um dispositivo modbus no PC o sistema funcionar perfeitamente quando eu tento le o sensor aparece um erro  "0x02 ILLEGAL DATA ADDRESS". eu pesquisei nas ainda não encontrei um solução. o arduino esta utilizando a biblioteca SimpleModbusMaster

ao enviar a solicitação o sensor retornar o erro 0x02

0x02 ILLEGAL DATA ADDRESS + Incorrect data structure address – in an event when any address used in Request message exceeds declared addressing bounds.

na rede que montou ja teve algum erro parecido?

esse erro é pq vc ta tentando ler um endereço que nao consta(não existe) na tabela(e na memórioa)  que vc postou no inicio.

lembrando que vc tem que usar uma função que faça leitura da região input register

Concordo com o Jonas,

quando eu ligo um datapoint que não existe nos slaves ele dá esse erro.

Obrigado Jonas e Sidney... 

eu estou colocando o endereço assim exemplo: temperatura esta no endereço 30104  então o endereço vai se  30104 - 30001 estou colocando o endereço 103... esta maneira esta correta?

Obrigado Novamente

pra começar vc deve utilizar a função 04(leitura de múltiplos registros de entrada) que seria leitura de entradas analógicas. Esses registros se iniciam no endereço 30001 e vai até 39999(de acordo com o protocolo), mas o que interessa a vc é o endereço 104=temperatura, então coloca endereço inicial da leitura =104 e em quantidade coloca 2 words, pois todas as informações em sua tabela ocupam 2 words. isso vale pra todos os dados da tabela diferindo apenas no endereço inicial.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço