Dúvidas na comunicação ScadaBR e Arduino Uno


#1

Boa tarde.
Estou desenvolvendo um projeto em grupo para faculdade que faz uso dos dois. Como não temos aula de nenhum estamos tendo problemas.
Eis o código abaixo. No Scada não esta atualizando os contadores. Tipo, os gráficos atualizam de 30 em 30 segundos, mesmo tendo colocado na criação que era para de ser de 5 em 5. Os gráficos estão estáticos. Ao invés de passar uma porta, posso passar uma variável para preencher os HOLDING? Se não puder, Então tenho como usar mais pinos para o Serial? O uno tem o A0 e A1, mas eu estou utilizando 3 sensores que totalizam 4 pinos para entrada de e saída de informações.
Grato desde já pela atenção.

//Adicionar vazão
//Arrumar a concatenação e pontuação
    #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++;
     }