Bom dia.
A SITUAÇÂO: Criamos um Data Source, as três telas de testes retornam resultados. A PESQUISA DE NÓS encontra 1 já nos 1% de pesquisa. A LEITURA DE DADOS MODBUS retornam 4 registradores um embaixo do outro. O TESTE DE LOCALIZADOR DE PONTO retorna resultado 0.
O PROBLEMA: fazemos os testes de conexão, quando clicamos para habilitar o Data Source aparece a mensagem “Timer Already Canceled”, o ícone para habilitar continua vermelho, “pisca” e habilita, MAS quando Vamos na WatchList, os Valores estão congelados, Não atualiza nem os valores e nem o tempo.
O CÓDIGO DO ARDUINO:
//Inclusãodas Bibliotecas
#include <SimpleModbusSlave.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 CIRCULO_RAIO 0.069 //[m]
#define Tank_A 0.2065 //[m]
#define Tank_Raio_Menor 0.054 //[m]
//-------------
//Definicção de ponteiros para comunicação ScadaBR
enum
{
VOLUME_RESTANTE,
VOLUME_REDUZIDO,
VAZAO_A,
VAZAO_B,
HOLDING_REGS_SIZE
};
//------------------
//Variáveis,objetos e funções
unsigned int holdingRegs[HOLDING_REGS_SIZE]; //Comunicação c/ScadaBR
Ultrasonic ultrasom(trig,echo); //Objeto do tipo Ultrason
float AreaPerfilReservatorio; //Area do Circulo da parte de cima
float VolumeTotalRetirado; // Volume descrescido do recipiente
float VolumeRestante; // Volume restante no recipiente
long tempoinicio = 0; //Variavel para trabalhar com tempo no substituto do delay()
long intervalo = 1000; // Variavel para trabalhar com tempo no substituto do delay()
unsigned long tempoatual; //Variavel para trabalhar com tempo no substituto do delay()
unsigned long cloopTime; //Variavel para trabalhar com sensores de fluxo de vazao;
volatile int frequencia_fluxoA; //Variavel para trabalhar com sensores de fluxo de vazao;
volatile int frequencia_fluxoB; //Variavel para trabalhar com sensores de fluxo de vazao;
unsigned char medefrequenciaA = 2; //Pinos conectado ao Sensor de fluxo de Vazão A
unsigned char medefrequenciaB = 3; //Pinos conectado ao Sensor de fluxo de Vazão A
unsigned int litrosPminutoA;
unsigned int litrosPminutoB;
float distanciaT1;
float distanciaT2;
float VariacaoVazao;
float VariacaoDistancia;
float VolumeEmLitros;
float CalculaAreaPerfilReservatorio(void);
float MedeDistanciaEmMetros(void);
float MediaDistancias(void);
//---------------------
//Calcula a Area do topo do reservatório
float CalculaAreaPerfilReservatorio(void)
{
float AreaCalc;
AreaCalc = Pi_aprox * pow(CIRCULO_RAIO,2);
return AreaCalc;
}
//------------------------
//Calcula a Média entre as diferentes distancias medidas
float MediaDistancias(void)
{
int i;
float SomaMedidas;
float Media;
SomaMedidas = 0.0;
for(i=0;i<Num_Medidas_distanc;i++)
{
SomaMedidas = SomaMedidas + MedeDistanciaEmMetros();
Media = (SomaMedidas/Num_Medidas_distanc);
return Media;
}
}
//---------
//Sensor Ultrasonico mede a distancia até a superficie da água
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()
{
modbus_configure(&Serial,9600,SERIAL_8N1,1,2,HOLDING_REGS_SIZE,holdingRegs);
modbus_update_comms(9600,SERIAL_8N1,1);
AreaPerfilReservatorio = CalculaAreaPerfilReservatorio();
VolumeTotalRetirado = 0.0;
pinMode(medefrequenciaA,INPUT);
pinMode(medefrequenciaB,INPUT);
attachInterrupt(0,flow,RISING); // Configura a interrupção
attachInterrupt(1,flow,RISING);
sei(); // Habilita a Interrupção
tempoatual = millis();
cloopTime = tempoatual;
}
void loop()
{
modbus_update();
holdingRegs[VOLUME_RESTANTE] = VolumeRestante;
holdingRegs[VOLUME_REDUZIDO] = VolumeEmLitros;
holdingRegs[VAZAO_A] = litrosPminutoA;
holdingRegs[VAZAO_B] = litrosPminutoB;
tempoatual = millis();
distanciaT1 = MediaDistancias();
if(tempoatual - tempoinicio > intervalo) // Substituto do delay()
{
distanciaT2 = MediaDistancias();
tempoinicio = tempoatual;
}
VariacaoDistancia = ((distanciaT1 - distanciaT2)/100); //[m]
VariacaoVazao = (AreaPerfilReservatorio * VariacaoDistancia); //[m]
VolumeTotalRetirado = VolumeTotalRetirado + VariacaoVazao; //[m]
VolumeEmLitros = (VolumeTotalRetirado * 1000.0); //Volume em litros que diminuiu o recipiente
//Mede o volume restante no recipiente
VolumeRestante = ((Pi_aprox*(Tank_A - MedeDistanciaEmMetros()))/3)*((pow(Tank_Raio_Menor,2)+ Tank_Raio_Menor * CIRCULO_RAIO + pow(CIRCULO_RAIO,2)));
//Fluxo de Vazão Sensores YF-S201 <-----------
if(tempoatual>=(cloopTime+1000))
{
cloopTime = tempoatual;
litrosPminutoA = (frequencia_fluxoA/ 7.5);
frequencia_fluxoA = 0;
cloopTime = tempoatual;
litrosPminutoB = ( frequencia_fluxoB/7.5);
frequencia_fluxoB = 0;
}
}
Alguém tem a SOLUÇÃO?