Mudbus ip arduino

Olá a todos, estou iniciando alguns projetos de comnunicação com arduino, no código do arduino abaixo, estou tentando escrever um 0 e 1 na porta digital 5 utilizando o MUDIBUS IP (Arduino) e TCP IP Modbus (ScadaBR), mas ocorre o erro de comunicação ao tentar.

#include <SPI.h>
#include <Ethernet.h>

#include "Mudbus.h"
#include "M0dbus.h"

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT

void setup()
{
  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 1, 8 };
  uint8_t gateway[] = { 192, 168, 1, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Avoid pins 4,10,11,12,13 when using ethernet shield

  delay(5000);
  Serial.begin(9600);
 
  pinMode(7, INPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  Mb.Run();
 
  //Analog inputs 0-1023
  Mb.R[0] = analogRead(A0); //pin A0 to Mb.R[0]
  Mb.R[1] = analogRead(A1);
  Mb.R[2] = analogRead(A2);
  Mb.R[3] = analogRead(A3);
  Mb.R[4] = analogRead(A4);
  Mb.R[5] = analogRead(A5);

  //Analog outputs 0-255
  analogWrite(6, Mb.R[6]); //pin ~6 from Mb.R[6]

  //Digital inputs
  Mb.C[7] = digitalRead(7); //pin 7 to Mb.C[7]

  //Digital outputs
  digitalWrite(5, Mb.C[50]); //pin 5 from Mb.C[50]
}

 

Coloco como Registrador Holding, officet 50, Binario, mas não vai...

'arduino': digital pin5: com.serotonin.messaging.TimeoutException: request=com.serotonin.modbus4j.ip.xa.XaMessageRequest@5aa5c0bAdicionar mensagem

Essa mensagem dá só na primeira tentativa, depois não dá mais

 

Alguma dica de como fazer essa escrita? ou de repente alguma outra forma de eu fazer escritas, enviar comandos para Arduino+Shield TCPIP+ScadaBR

 

Desde já obrigado

 Tive este mesmo problema. 

para este funcionar, na configuração do data point, não deve ver do tipo binario mesmo que a saida seja binaria ou seja porta digital do MC. 

configure a data point como inteiro, ai escreva no registro um numero diferente de 0, comigo funcinou assim, acho que a biblioteca modbus do arduino tem um bug na função modbus de escrita saida digital. 

/MODBUS PROTOCOLO DE COMUNICAÇÃO.  
//Este Codigo é a implementação do Protocolo, Modbus Escravo
//         principais funções Modbus 
//Função 1(read coils), leitura de um bit ; 
//Função 3(read registers);leitura de uma palavra Word 2 bytes;
//Função 5(write coil), escrita de um bit ;
//Função 6(write register), escrita de palavra word 2 bytes; 
//Função Porta 502, (defined in Mudbus.h) MB_PORT;
//Segmento tipo int Mb.R[0 até 125] e bool Mb.C[0 até 128] MB_N_R MB_N_C;
 
#include <SPI.h>
#include <Ethernet.h>
#include "Mudbus.h"
 
Mudbus Mb;
void setup()
{
  uint8_t mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
  uint8_t ip[]      = { 192, 168, 1, 8 };
  uint8_t gateway[] = { 192, 168, 1, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Pinos utilizados pelo adaptador ethernet  4,10,11,12,13
  //delay(1000);
 
//^^^^^^^^^^^^^^^^^Set de primeiro Ciclo^^^^^^^^^^^^^^ 
//Se o valor fica dentro da função Setup, quando iniciar, ou reiniciado é reescrito o valor do setup.
  Mb.R[31] = 1500;
  
 
 // definição de Entradas e Saídas.  
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(41,OUTPUT);
}
 
void loop()
{
  Mb.Run();
  
  //Leitura de Entranas analogicas, as entradas são repassadas para uma memoria Word no caso para as MW0 a MW5. 
  Mb.R[0] = analogRead(A0); //pin A0 para -> Mb.R[0], ou seja a MW0 recebe a Entrada 0. 
  Mb.R[1] = analogRead(A1);
  Mb.R[2] = analogRead(A2);
  Mb.R[3] = analogRead(A3);
  Mb.R[4] = analogRead(A4);
  Mb.R[5] = analogRead(A5);
 
  //Escrita em saida analogicas
  analogWrite(6, Mb.R[60]); //pin ~6 from Mb.R[6]
 
  //Leitura de Entradas Digitais 
  Mb.C[7] = digitalRead(7); //pin 7 to Mb.C[7]
 
  //Escrita da Saidas digitais nas memorias tipos boleanoas
  digitalWrite(41, Mb.R[30]);
  digitalWrite(40, Mb.R[40]); 
  
 
}

Tadeu, problema solucionado, meu muito obrigados pela sua ajuda, eu já havia feito outras mil manobras para ter esse controle, utilizando HTML, tudo para não deixar de utilizar a interface do ScadaBR com o arduino, isso vai me ajudar bastante mesmo. Muito Obrigado!

Utilizei esse script:

 

 

var s = ""; 
var mask =1;
var arvo = ""; 
 
if (value & mask) 

arvo = value - mask; 
arvo = arvo +""; 
s += "<img style='cursor:pointer;' src='graphics/LightBulb/light_on.gif' onclick='mango.view.setPoint("+ point.id +", \""+ pointComponent.id +"\","+ arvo+");return 0;'/>"; 

else 

arvo = value + mask; 
arvo = arvo +""; 
s += "<img style='cursor:pointer;' src='graphics/LightBulb/light_off.gif' onclick='mango.view.setPoint("+ point.id +", \""+ pointComponent.id +"\","+ arvo+");return 1;'/>"; 

return s;

Funcionou 100%
 

Para ler a porta A0 devo configurar o SCADABR como?

Qual o valor da "faixa de registro" (status do coil, ...)

E offset?

Estou iniciando. Poderiam me ajudar?

aqui um link explicativo sobre o scadbr e redes rs485, com muita explicação do garagista Wiechert do Laboratorio de garagem:

http://www.labdegaragem.com.br/loja/ManualdoUsu%C3%A1rio.2RS485.pdf

http://www.labdegaragem.org/loja/48-ldg/kit-rs485-conversor-usb-rs485-shield-rs485.html

caso trabalhe com modbus ip alguns detalhes vc pode ver aqui, mas do resto é tudo igual a apostila anterior

http://www.youtube.com/watch?v=KnxxqPRBHzA (parte 1)

http://www.youtube.com/watch?v=o-x-glPJ6vU (parte 2)

http://www.youtube.com/watch?v=XnmCQUZzKEw (parte 3)