Olá pessoal tudo bem,

minha primeira duvida aqui.

Tenho que ler mais de um sensor com a conexão RS485 em um arduino, esse tipo de rede de  comunicação é novo para min. consegui ler um por vez isso para min não é viável.

Estou usando um arduino UNO e um modulo RS485 para TTL.

Os sensores usam o protocolo de comunicação MODBUS RTU com a taxa de transmissão em 4800.

Quem puder ajudar fico muito grato, abraços

Exibições: 464

Responder esta

Respostas a este tópico

Boa noite.

Pode explicar melhor esta sua dificuldade?

Vc tem um arduino com um modulo RS485(master), e quer se comunicar com vários dispositivos que também

tem saídas RS485(Slaves).

Correto?

Ou vários Arduinos com RS485(Slaves) para comunicar com um dispositivo com RS485(Master)?

RV mineirin

Boa tarde, 

você vem aqui, pede ajuda.

Perguntamos mais detalhes do seu projeto para poder ajuda-lo melhor,

e voce não se tem a atenção (talvez até educação) em responder.

Será que gostaria de ser tratado como se trata usuários em outros fóruns, para que voce responda?

RV mineirin

Desculpa, andei meio adoentado e sem ações na internet, retomando as atividades agora.

Agradeço pela atenção.

Minha aplicação é similar a figura a baixo, mas tenho que ligar mais de um sensor no mesmo protocolo.

O código que  utilizei para ligar um sensor foi esse.

#include <Wire.h>
#include <SoftwareSerial.h> //Library to convert Digital Output pins of the board to transmitter as well as receiver
#define RE 6
#define DE 5
const byte inq[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xCB};
byte values[13];
//byte values2[11];
SoftwareSerial mod(7,4); // RX, TX ( Creates a new SoftwareSerial object )
void setup(){
Serial.begin(9600);
mod.begin(4800);
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
}
void loop(){
double val1,val2,val3,val4,val5;
Hum();
val1 =double((values[3]*256)+values[4])/1000;
val2= double((values[5]*256)+values[6])/10;
val3 =double((values[7]*256)+values[8])/1000;
//val4=double(val1*0,00121-0,02266);
Serial.print(" Sinal de umidade : ");
Serial.print(val1,6);
Serial.println(" cm³ cm-³");
Serial.print(" Temperatura : ");
Serial.print(val2,2);
Serial.println(" ºC");
delay(2000);

}

float Hum(){
digitalWrite(DE,HIGH);
digitalWrite(RE,HIGH);
delay(10);
if(mod.write(inq,sizeof(inq))==8){
digitalWrite(DE,LOW);
digitalWrite(RE,LOW);

for(byte i=0;i<13;i++){
values[i] = mod.read();
Serial.print(values[i],HEX);
Serial.print(" ");
}
Serial.println();
}
}

Olá Francisco!

   O protocolo Modbus RTU é um protocolo do tipo Mestre-Escravo, em que um dispositivo, o Mestre, sempre inicia uma transferência de dados, fazendo uma consulta ou pedido ( query ) a um Escravo.

   Sugiro que você leia o documento Modbus over the serial line para se familiarizar com este protocolo.

   No teu caso, o Arduino será o Mestre e os sensores serão os Escravos.

   Cada vez que o Mestre quer um dado de um Escravo, ou quer enviar uma informação a este Escravo, ele emite uma mensagem no barramento como a da figura a seguir, que é a mensagem que está no teu código:

   O primeiro byte é o endereço do Escravo. Cada Escravo conectado na rede RS485 do Modbus RTU deve ter um endereço único, diferente de todos os outros.

   Note que todos os escravos "pendurados" no barramento vão receber a mensagem, porém, só o Escravo cujo endereço coincidir com o primeiro byte da mensagem responderá.

   Isto evita que mais de um Escravo responda, causando um problema conhecido como "Bus Contention", em que a mensagem se torna ininteligível.

   Assim sendo, você terá que enviar uma mensagem para cada Escravo com que quiser se comunicar, contendo o seu endereço.

   Depois deste Escravo responder, ou estourando o limite de tempo para a resposta sem que esta chegue, o Mestre poderá inquirir novo Escravo.

   Desta forma, todos os escravos podem ser inquiridos.

   Espero ter ajudado.

D. T. Ribeiro.

Obrigado, então para colocar um segundo sensor O const byte inq []={0x02,0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xCB}. seria isso?

Na ligação física, usaria um outro conversor ttl para RS485, ligado a mesma protocolo sofware serial? e teria um novo RE, DE no código?

Olá, Francisco.

   Sobre o inq[] seria quase isto. Quando você muda o endereço do escravo, os dois últimos bytes, o CRC ( Cyclic Redundancy Check ), que é uma espécie de verificador da integridade da mensagem deverá ser diferente.

   Uma forma fácil de calculá-lo é usar o site CRC Calculation. Use o resultado da caixa CRC-16 (Modbus) que, no caso da mensagem com endereço 0x02 daria 0xF805, que deve ser enviado em ordem inversa, i. e., inq[] = {0x02,0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xF8}. Experimente.

Quanto a usar outro conversor RS485, não é necessário, pois a interface RS485 é do tipo multidrop, ou seja, pode-se conectar vários equipamentos nas mesmas linhas. Aliás, esta é a razaão pela qual existe o endreço do escravo, para evitar interferências causadas por mais de um equipamento transmitindo ao mesmo tempo. Isto está bem claro no documento "Modbus over the serial line" que sugeri.

Uma outra alternativa é o uso da biblioteca Modbus do próprio Arduino, que facilita bastante, pois ela já calcula o CRC e ainda dá conta da temporização necessária.

   Sugiro ver o exemplo ModbusRTUTemperatureSensor, que pode ser carregado na IDE do arduino em File->Examples->ArduinoModbus->RTU->ModbusRTUTemperatureSensor, se a biblioteca Arduino Modbus estiver instalada.

   Bom divertimento.

D. T. Ribeiro.



   

Obrigado pela resposta, então o registrador do final também muda, vou testar

Esse é o quadro de resposta do sensor:

Olá, Francisco!

   A resposta está perfeita. Os dados de escravo e função da resposta são necessários para o Mestre saber quem foi que respondeu e o que foi que respondeu, para conferir se era a resposta que estava esperando.

   Escravo 0x01

   Função 0x03 - Reading Holding Registers

   Quantidade de bytes de informação da resposta: 06 ( 3 registradores de 2 bytes cada ).

   Informação útil, conforme já está decodificado na figura e repetido aqui apenas por comodidade:

   Valor da umidade: 0x0292 ( 658, 65.8% RH )
   Valor da Temperatura: 0xFF9B ( -101 em sinal complemento de 2 de 16 bits, -10.1ºC )

   Valor da condutividade: 0x03E8 ( 1000, 1000 µS/cm )

   Se todos os sensores forem iguais, pode-se utilizar a mesma interpretação para todos eles.

Abração!

D. T. Ribeiro.

Ótimo e a parte física da ligação, vão todos no mesmo barramento RS485?

Olá, Francisco:

   A ligação fica como mostra a pg 22 do documento Modbus over the serial line:

   No caso dos equipamentos que estás utilizando, provavelmente a linha externa de controle de sentido dos drivers não será necessária, pois eles devem ter este controle, que se chama controle de fluxo, internamente.


RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço