Boa tarde.
Criamos uma rede Ethernet e usando um Switch para comunicação com o Arduino e o ScadaBR.
Quando pingavamos o Arduino no prompt tudo normal, 100% de resposta.
Mas o Scada exibia “Sem Resposta de Rede”. Por que?
O exemplo que usei foi esse http://blog.usinainfo.com.br/comunicando-o-arduino-com-o-scadabr-atraves-do-protocolo-tcpip/
O Código do Arduino é esse
//Inclusão das bibliotecas do Projeto
#include <SPI.h>
#include <Ethernet.h>
#include <Modbus.h>
#include <ModbusIP.h>
#include <Ultrasonic.h>
//--------------------
//Defines do projeto
#define trig 8
#define echo 9
#define Pi_aprox 3.1415927
#define Num_Medidas_Distanc 100
#define Circulo
#define CirculoRaio 0.069 //[m]
#define Tank_A 0.2065 //[m]
#define TankRaioMenor 0.054 //[m]
//---------------------
//Criação dos Input Register, os offsets ja foram definidos
const int VOLUME_RESTANTE = 0;
const int VOLUME_REDUZIDO = 1;
const int VAZAO_A = 2;
const int VAZAO_B = 3;
//-----------------
//Criação de Objetos;
ModbusIP mb;
Ultrasonic ultrasom(trig,echo);
//------------------
//Variáveis
float AreaPerfilReservatorio;
float VolumeTotalRetirado;
float VolumeRestante;
long tempoinicio = 0;
long intervalo = 1000;
unsigned long tempoatual;
unsigned long cloopTime;
volatile int frequencia_fluxoA;
volatile int frequencia_fluxoB;
unsigned char MedeFrequenciaA = 2;
unsigned char MedeFrequenciaB = 3;
unsigned int litrosPminutoA;
unsigned int litrosPminutoB;
float distanciaT1;
float distanciaT2;
float VariacaoDistancia;
float VariacaoVazao;
float VolumeEmLitros;
//-----------------------
//Funções
float CalculaAreaPerfilReservatorio(void);
float MedeDistanciaEmMetros(void);
float MediaDistancias(void);
//--------------------
float CalculaAreaPerfilReservatorio(void)
{
float AreaCalc;
AreaCalc = Pi_aprox * pow(CirculoRaio,2);
return AreaCalc;
}
float MediaDistancias(void)
{
int i;
float SomaMedidas;
float Media;
SomaMedidas = 0.0;
for(i=0;i< Num_Medidas_Distanc;i++)
{
SomaMedidas = SomaMedidas + MedeDistanciaEmMetros();
return Media;
}
}
float MedeDistanciaEmMetros(void)
{
float cmMsec,DistMetros;
long microsec = ultrasom.timing();
cmMsec = ultrasom.convert(microsec,Ultrasonic::CM);
DistMetros = (cmMsec /100.0);
return DistMetros;
}
void flow()
{
frequencia_fluxoA++;
frequencia_fluxoB++;
}
void setup()
{
//Configura os parametros da Rede
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] ={10, 1, 1 ,2};
mb.config(mac,ip);
//----------------
//Adiciona os Input Registers
mb.addIreg(VOLUME_RESTANTE);
mb.addIreg(VOLUME_REDUZIDO);
mb.addIreg(VAZAO_A);
mb.addIreg(VAZAO_B);
//------------------
AreaPerfilReservatorio = CalculaAreaPerfilReservatorio();
VolumeTotalRetirado = 0.0;
pinMode(MedeFrequenciaA,INPUT);
pinMode(MedeFrequenciaB,INPUT);
attachInterrupt(0,flow,RISING);
attachInterrupt(1,flow,RISING);
sei();
tempoatual = millis();
cloopTime = tempoatual;
}
void loop()
{
mb.task();
tempoatual = millis();
distanciaT1 = MediaDistancias();
if(tempoatual - tempoinicio > intervalo)
{
distanciaT2 = MediaDistancias();
tempoinicio = tempoatual;
}
VariacaoDistancia = ((distanciaT1 - distanciaT2)/100); //[m]
VariacaoVazao = (AreaPerfilReservatorio * VariacaoDistancia);
VolumeTotalRetirado = VolumeTotalRetirado + VariacaoVazao;
VolumeEmLitros = (VolumeTotalRetirado * 1000.0);
VolumeRestante = ((Pi_aprox * (Tank_A - MedeDistanciaEmMetros()))/3)*((pow(TankRaioMenor,2)+ TankRaioMenor * CirculoRaio + pow(CirculoRaio,2)));
if(tempoatual>=(cloopTime +1000))
{
cloopTime = tempoatual;
litrosPminutoA = (frequencia_fluxoA / 7.5);
frequencia_fluxoA = 0;
litrosPminutoB = (frequencia_fluxoB / 7.5);
frequencia_fluxoB = 0;
}
mb.Ireg(VOLUME_RESTANTE,VolumeRestante);
mb.Ireg(VOLUME_REDUZIDO,VolumeEmLitros);
mb.Ireg(VAZAO_A,litrosPminutoA);
mb.Ireg(VAZAO_B,litrosPminutoB);
}