ScadaBr não encontra nenhum nó

Boa tarde.
Estou tentando iniciar a comunicação de Arduino Uno com o Scadabr, mas não esta encontrando nenhum nó.
No print podem ver que setei a porta COM3 que é que o Arduino esta.

Esse Código ele encontra um nó rapidamente
#include <SimpleModbusSlave.h>

enum
{     
  VOLUME,     
  VAZAO,        
  HOLDING_REGS_SIZE 
};
 
unsigned int holdingRegs[HOLDING_REGS_SIZE]; 

void setup() {
  modbus_configure(&Serial, 9600, SERIAL_8N1, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
  modbus_update_comms(9600, SERIAL_8N1, 1);
}

void loop() {
  modbus_update();
  holdingRegs[VAZAO] = analogRead(A0); 
  holdingRegs[VOLUME] = analogRead(A1);   
}

Com esse ele não encontra nada

#include <SimpleModbusSlave.h>

#define trig 9 //Saída de Trigger
#define echo  8 //Entrada de Echo
#define buzz 13 //Pino do Buzz

//Definição das medidas do tanque
#define tank_a 20.65
#define tank_r 5.4
#define tank_R 6.9

//Definição das variáveis que passa comunicação para o ScadaBR
enum
{     
  VOLUME,     
  VAZAO,        
  HOLDING_REGS_SIZE 
};
 
unsigned int holdingRegs[HOLDING_REGS_SIZE];
 
//Variáveis globais
volatile int flow_frequency;
volatile int flow_frequencyB;
unsigned int l_hora; // Litros p/Hora
unsigned int l_horaB; // Litros p/Hora segundo sensor
unsigned char flowmeter = 2;
unsigned char flowmeterB = 3;// numero do pino do arduino conectado a saida do segundo sensor
unsigned long currentTime;
unsigned cloopTime;
char tempo_h;
char tempo_l;
char distancia_cm;
/*char distancia_mm;*/
unsigned int periodo;
long int volume_ml;
void trigPulse(); // Função que gera o Pulso

float pulse;
float dist_cm;

void setup() { 
  // put your setup code here, to run once:
  
  pinMode(trig, OUTPUT); // Pino de trigger sera saida digital
  pinMode(echo, INPUT); // pino do echo sera entrada digital
  pinMode(buzz,OUTPUT);
  pinMode(flowmeter,INPUT);
  digitalWrite(trig, LOW); //Saida inicia em nivel baixo

  //Parametros de comuniação com o ScadaBR
  modbus_configure(&Serial, 9600, SERIAL_8N1, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
  modbus_update_comms(9600, SERIAL_8N1, 1);
  
  Serial.begin(9600); //Inicia comunicação serial
  attachInterrupt(0,flow,RISING); //Configura a interrupção externa pelo pino de entrada
  attachInterrupt(1,flow,RISING);
  sei();
  currentTime = millis();
  cloopTime = currentTime;
}
void loop() {
  // put your main code here, to run repeatedly:
  //Transferência dos valores trasmitidos pelo Arduíno
  modbus_update();
  holdingRegs[VAZAO] = analogRead(A0); 
  holdingRegs[VOLUME] = analogRead(A1);
    
  trigPulse(); //Aciona o trigger do modulo ultrassonico

  pulse = pulseIn(echo,HIGH); //Mede o tempo que o pulso echo fica em nivel alto

  dist_cm = pulse/58.82; //Valor de distancia em centimetros

/*Se a distancia medida for menor que a altura do recipiente, faz o processo normal,
  se for igual a altura do recipiente considera a caixa como vazia
  e se for maior notifica erro no sensor*/
  if((dist_cm > tank_a && dist_cm <= tank_a + 0.1) || (dist_cm < tank_a && dist_cm >= tank_a - 0.1) || (dist_cm == tank_a))
  {

      Serial.println(dist_cm);
      Serial.println("A Caixa d'Agua esta vazia");
      digitalWrite(buzz,HIGH); //Coloca o Buzzer em nível alto
      tone(13,262,200); // Parametros do buzzer (pino,frequencia em Hz, duração)

    //Serial.println("Testando");
  }
  else if((dist_cm > tank_a))
  {
      Serial.println(dist_cm);
      Serial.println("Verificar a distancia do Sensor");      
  }
  else
  {
    //Volume Tronco de Cone
    volume_ml = ((3.14 *( tank_a - dist_cm))/3)*((pow(tank_r,2) + tank_r * tank_R + pow(tank_R,2)));
    //Gambiarra!
    volume_ml = volume_ml-16;
    //Volume Cilindro
    //volume_ml = 3.14 *(tank_r*tank_r)*(tank_a - dist_cm);
    Serial.println("Mililitros:  ");
    Serial.println(volume_ml);
    Serial.println(dist_cm);
    //---> VAZÃO <----
    currentTime = millis();
    //A cada segundo, calcula e mostra na serial o valor litros por hora
    if(currentTime >= (cloopTime+1000))
      {
        cloopTime = currentTime;
        //Frequencia dos pulsos (Hz) = 7.5Q, Q é o fluxo em L/min. (Resulta em +/- #% de precisão
        l_hora= (flow_frequency * 60 / 7.5); // (Frequencia dos pulsos * 60 min) /7.5q = Fluxo em L/hora
        flow_frequency = 0; //Reinicia o contador
        Serial.print(l_hora,DEC); //Envia pela porta serial o valor
        Serial.println(" L/hora");
        //Sensor B
        cloopTime = currentTime;
        l_horaB = (flow_frequencyB * 60);
        flow_frequencyB = 0;
        Serial.print(l_horaB,DEC);
        Serial.println(" L/hora");
    
        }
        else
        {
            Serial.println("Verificar os sensores");           
        }
   }
  
}
void trigPulse(){
  digitalWrite(trig, HIGH); //Pulso de trigger em nivel alto
  delay(3000); //duração de 10 micro segundos
  digitalWrite(trig, LOW); // Pulso de trigger em nivel baixo
}
void flow() // Interrupção p/calculo dos litros por hora
{
  flow_frequency++;
 }

Sou um completo novato. Se tiver algo de errado no código alguém pode me dizer?

Olá amigo,

Quando você utiliza a porta serial default para algum protocolo de comm, tu não pode escrever nela como você fez no exemplo acima, vc tem que usar a biblioteca software serial para comm e usa a default para debugar, porém você terá que usar um conversor ttl->232 ou 485, e tbem você não pode parar o processamento utilizando delay, você deve utilizar a função millis(); e não o delay();
Veja aí se consegue caminhar com o teu projeto realizando essas pequenas mudanças no código.

1 curtida

Bom Dia .
Desculpe voltar ao assunto mas ainda to travado. Quando você diz “(…)vc tem que usar a biblioteca software serial para comm e usa a default para debugar, porém você terá que usar um conversor ttl->232 ou 485(…)” . Eu tenho que usar isso se eu quiser manter os Printla da vida, ou preciso disso de qualquer forma? Se sim, por quê? Nos exemplos que vi (https://portal.vidadesilicio.com.br/scadabr-com-arduino/ - http://blog.usinainfo.com.br/comunicando-o-arduino-com-o-scadabr-atraves-do-protocolo-modbus-rtu-serial/) não tinha isso…

Exatamente, você deve usar a biblioteca software serial caso queira escrever da porta default. Caso contrário você pode utilizar a default e logo utilizar USB, pois embaixo do arduíno tem um conversor

1 curtida