[Resolvido] Erro "connect time out", Arduino + ETHERNET SHIELD W5100 + ScadaBr

Estou tentando ler um push button no arduino, e o ScadaBr deveria exibir se está ativada ou não.
Ao tentar ler ou criar o DataPoint ocorre o seguinte erro: “‘DataSourceProjeto’: com.serotonin.modbus4j.exception.ModbusTransportException: java.net.SocketTimeoutException: connect timed out”

Essas São as configurações do DataSource e do DataPoint/Teste de Leitura:

Esse é o código do Arduino:

/*
  Modbus-Arduino Example - Switch (Modbus IP)
  Copyright by André Sarmento Barbosa
  http://github.com/andresarmento/modbus-arduino
*/
 
#include <SPI.h>
#include <Ethernet.h>
#include <Modbus.h>
#include <ModbusIP.h>

//Modbus Registers Offsets (0-9999)
const int BTNOFFSET1 =0; //OFFSET DO APARTAMENTO 93 - OFFSET1

//Used Pins
const int ButtonPin = 10;

//ModbusIP object
ModbusIP mb;

void setup() {
    // The media access control (ethernet hardware) address for the shield
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
    // The IP address for the shield
    byte ip[] = { 192, 168, 0, 23 };  
    //Config Modbus IP 
    mb.config(mac, ip);
    //Set ledPin mode
    pinMode(ButtonPin, INPUT);
    // Add BTNOFFSET register - Use addIsts() for digital inputs 
    mb.addIsts(BTNOFFSET1);
}

void loop() {
   //Call once inside loop() - all magic here
   mb.task();
   
   //Attach switchPin to SWITCH_ISTS register     
   mb.Ists(BTNOFFSET1, digitalRead(ButtonPin));
}

Ola,
Seu hardware responde no ping? Já viu a biblioteca MudBus ?

Olá, muito obrigado por responder!!

Sim, eu estava utilizando a biblioteca MODBUS TCP/IP desse video https://www.youtube.com/watch?v=Ql91cKk888s&list=PLbh4Rl3CpRRTS3WfAZF5dciFABuYxpQuj&index=7.
Eu achei um fórum comentando sobre a MudBus e resolvi tentar, só que não acho a documentação e nem sei por que a Faixa do registro só funciona no ‘Status do Coil’.

Se não te incomodar gostaria de saber se você tem a documentação da biblioteca, por que estou usando do jeito que funciona,‘testando’ tudo que é possível… mas tenho interesse em entender o que estou fazendo, sou iniciante nesse negócio de supervisórios.

Olá,

Segue biblioteca: https://github.com/luizcantoni/mudbus

Olá! Nossa, muito obrigado!! Eu tinha conseguido a biblioteca em outro lugar e não sabia onde achar a oficial.

Olá, estou com uma duvida, como vc criou o datapoint, não entendi, vc pode me ajudar?

Olá!

Já que resucitaram esta Thread, vou fazer uns comentários do que vi aqui, de coisas que eu mudaria para um datasource ModBus IP com Arduino:

  • Período de Atualização está muito muito pequeno, melhor deixar maior do que 10 segundos, pelos motivos seguintes…
  • timeout está muito curto (aumentaria para 1000ms a 2500 ms), se a performance da rede for ruim pode dar um falso erro de comunicação;
  • Maxima contagem de leitura de bits tem que ser menor, o arduino não tem tanta memória assim, e a placa de rede dele tem menos buffer ainda, eu deixaria em no máximo 512 bits
  • Maxima contagem de leitura e escrita de registradores, pelo mesmo motivo de que o buffer de memória é pequeno, eu deixaria em 2 registradores, lembrando que modbus o registrador tem 16 bits, mais o overhead do protocolo, já vai dar vários bytes.

Por fim, o que pode estar causando o erro declarado na foto da mensagem original é a tentativa de leitura de um registrador com o Datasource ATIVO e com um intervalo de atualização de 1 segundo, assim o ScadaBR está lendo sem parar o datasource e o arduino provavelmente não está respondendo a mais de uma tentativa simultânea de conexão, pode ser até 5 conexões simultâneas na placa Wiznet5100, mas tem que programar para isso, não sei se a biblioteca escolhida faz isso. Eu uso um código próprio preparado para 5 conexões, nos meus testes não aparece este erro (aparecia quando era limitado a somente 1 conexão)

Daniel

2 curtidas

Bom dia, obrigado pela resposta Daniel, e qual registrador devo usar no datapoint, pois usei o hold, e não leu, ai usei entrada, mas não atualiza quando aperto o botão, pra atualizar tenho que para o datapoint e habilitar novamente, ai ele coleta a novo status do datapoint.