Comunicacao RS485

Pessoal, boa tarde
Sou iniciante em Arduino, tenho experiencia em CLP, mas o CLP a solução esta pronta, enlatada !! estou sofrendo com a RS485
Possuo 1 arduino UNO, desejo enviar todas as entradas para a rede Modbus RTU, via 485, baixei inúmeras bibliotecas, mas não tive nenhum sucesso.
Consegui ler os sensores, converter, mas tudo no display, não consigo enviar para um endereço reconhecivel via Modbus

Peço a ajuda de voces !!!

Obrigado

O que já tens feito?

Como estás a ligar e a testar?

Toda a parte de sensores e conversões eu já fiz e teste via Display
Já instalei o Max485 nos pinos 0,1 e 2, o modbus poll verifica trafego, mas não consigo ler nada...
Aparentemente eu estou com a parte fisica, ligacoes OK, mas estou com problemas no protocolo.
Nao sei como enviar por ex. a leitura de A3 para o endereço X modbus
Obrigado Bubulindo

Tens a porta usb ligada?

O Uno só ttem uma porta série...

Experimentaste esta?

Sim, estou deixando a USB sempre ligada, alimentando o UNO...
Sera´que é isso ?
Vou estudar o link

Obrigado !!!

Estou usandi o codigo:

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/

modbusDevice regBank;
modbusSlave slave;

word AI0,AI1,AI2,AI3,AI4,AI5;

void setup()
{
//Set Slave ID
regBank.setId(1);

//Add Digital Output registers
regBank.add(8);
regBank.add(9);
regBank.add(12);
regBank.add(13);

//Add Digital Input registers
regBank.add(10002);
regBank.add(10003);
regBank.add(10004);
regBank.add(10005);
regBank.add(10006);
regBank.add(10007);

//Analog Input registers
regBank.add(30001);
regBank.add(30002);
regBank.add(30003);
regBank.add(30004);
regBank.add(30005);
regBank.add(30006);

//Analog Output registers
regBank.add(40010);
regBank.add(40011);

slave._device = &regBank;

//Set BaudRate
//slave.setBaud(9600);

//Configure pins
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
}

void loop(){
while(1){

//Digital Output
byte DO8 = regBank.get(8);
if (DO8 <= 0 && digitalRead(8) == HIGH)digitalWrite(8,LOW);
if (DO8 >= 1 && digitalRead(8) == LOW)digitalWrite(8,HIGH);

byte DO9 = regBank.get(9);
if (DO9 <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
if (DO9 >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);

byte DO12 = regBank.get(12);
if (DO12 <= 0 && digitalRead(12) == HIGH)digitalWrite(12,LOW);
if (DO12 >= 1 && digitalRead(12) == LOW)digitalWrite(12,HIGH);

byte DO13 = regBank.get(13);
if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);

//Digital Input
byte DI2 = digitalRead(2);
if (DI2 >= 1)regBank.set(10002,1);
if (DI2 <= 0)regBank.set(10002,0);

byte DI3 = digitalRead(3);
if (DI3 >= 1)regBank.set(10003,1);
if (DI3 <= 0)regBank.set(10003,0);

byte DI4 = digitalRead(4);
if (DI4 >= 1)regBank.set(10004,1);
if (DI4 <= 0)regBank.set(10004,0);

byte DI5 = digitalRead(5);
if (DI5 >= 1)regBank.set(10005,1);
if (DI5 <= 0)regBank.set(10005,0);

byte DI6 = digitalRead(6);
if (DI6 >= 1 )regBank.set(10006,1);
if (DI6 <= 0)regBank.set(10006,0);

byte DI7 = digitalRead(7);
if (DI7 >= 1)regBank.set(10007,1);
if (DI7 <= 0)regBank.set(10007,0);

//Analog Input
AI0 = analogRead(0);
delay(10);
AI0 = analogRead(0);
regBank.set(30001, (word) AI0);
delay(10);

AI1 = analogRead(1);
delay(10);
AI1 = analogRead(1);
regBank.set(30002, (word) AI1);
delay(10);

AI2 = analogRead(2);
delay(10);
AI2 = analogRead(2);
regBank.set(30003, (word) AI2);
delay(10);

AI3 = analogRead(3);
delay(10);
AI3 = analogRead(3);
regBank.set(30004, (word) AI3);
delay(10);

AI4 = analogRead(4);
delay(10);
AI4 = analogRead(4);
regBank.set(30005, (word) AI4);
delay(10);

AI5 = analogRead(5);
delay(10);
AI5 = analogRead(5);
regBank.set(30006, (word) AI5);
delay(10);

//Analog Output (PWM)
word AO10 = regBank.get(40010);
analogWrite(10,AO10);
delay(10);

word AO11 = regBank.get(40011);
analogWrite(11,AO11);
delay(10);

slave.run();
}
}

Recebo o seguinte report do scaner

[10/15/16 08:23:30] Ready...
[10/15/16 08:23:37] Connect to COM 6:115200,N,8,1.0 timeout: 3
[10/15/16 08:23:37] => Poll: 01 01 00 00 00 64 3D E1
[10/15/16 08:23:38] <= Response: FD F5 FF FB FF FF 27 EB FE
[10/15/16 08:23:49] Recv error - Unknown
[10/15/16 08:23:49] Error, Timeout - No response to poll
[10/15/16 08:23:53] => Poll: 01 05 00 00 00 00 CD CA
[10/15/16 08:23:55] <= Response: FD F7 9D FF FF DF 01 8B FE FD F5 FF FB 01 FF A5 0B FE FD F7 9D FF FF DF 01 8B FE FD F5 FF FB FF FF 27 EB FE FD F7 9D FF FF DF 01 8B FE FD F5 FF FB 01 FF A5 0B FE
[10/15/16 08:23:55] Write task has completed successfully
[10/15/16 08:24:06] Disconnected

Alguem ?

Acho que estás a fazer muita coisa duma vez só... o teu programa inicial mais parece um programa completo e não um teste de comunicação. Com tanta coisa no código pode haver imensa coisa errada e que não consegues focar num passo de cada vez.

O facto de teres apenas uma porta série no UNO e teres o interface USB ligado é um problema... Daí que talvez seja melhor usares um Uno ou talvez uma SoftwareSerial para evitar interferências com a porta USB.

Essa resposta do scanner vem de onde?

O teu Arduino vai ser um master na rede ou um slave? A biblioteca que enviei anteriormente é para implementar o master... não um slave.

Esta biblioteca implementa um slave:

Era esta que estavas a usar?

Porque lês duas vezes a porta série mas apenas usas um dos resultados?

Se vais copiar as coisas da internet sem sequer pensar o que fazem, talvez seja melhor usares só um PLC (ou CLP)...

Obrigado pela ajuda