Scada Monitoriza error sometimes

Excuse my bad english

I have a problem with Scada Monitoriza and Arduino.

Is working OK,

but if I use

#include <LcdBarGraph.h>

and

LcdBarGraph lbg0(&lcd, 18, 0, 0);

Comunication with PC Scada dont work.

Is is working with Arduino UNO and NANO, Leonardo dont compile.

If you need Scada program I will up it.

Thank you so much

Arduino program

// Aqui la inclusion de librerias externas al compilador de Arduino
#include <monitoriza.h>          // libreria de comunicacion con SCADA Monitoriza
#include <LiquidCrystalFast.h>   // libreria para el LCD
#include <LcdBarGraph.h>         // libreria que dibuja barras de medida intermedia en el LCD  

// definicion de pines E/S

#define Entrada0  A3
#define Entrada1  A2
#define Entrada2  A1
#define Entrada3  A0
#define Pulsador1 13
#define Pulsador2 12
#define PulsadorF 11
  
/*REGISTROS DEL SCADA Monitoriza esclavo, mismos en el Maestro en el PC */

enum {
        COMM_BPS = 115200, /* baud rate */
        MB_SLAVE = 1, /* modbus slave id */
        PARITY = 'N' /* even parity */
};

/* se pueden añadir tantos registros a enviar/recibir pero hay 
  que añadirlos identicos en Arduino y SCADA Monitoriza en el PC*/

enum {
    ENT_DIG,
    SAL_DIG,
    ANALOG_0,
    ANALOG_1,
    ANALOG_2,
    ANALOG_3,
    ANALOG_4,
    ANALOG_5,
    ANALOG_6,
    ANALOG_7,
    RPM,
    MB_REGS   /* numero total de registros en el esclavo */
};

int regs[MB_REGS];

// define en que pines y como esta conectado el LCD

LiquidCrystalFast lcd(10, 9, 8, 2, 3, 4, 5);

// crea unas barras de medida para visualizarlas en el LCD, se llamaran despues con sus nombres lbg0....por ejemplo

LcdBarGraph lbg0(&lcd, 18, 0, 0);

//define el numero de columnas del lcd que usamos

byte lcdNumCols = 20;   // -- numero de columnas del LCD

// definicion de variables globales

unsigned long wdog = 0;         /* watchdog de comunicaciones de Arduino/SCADA */
int ajuste_cero; // para medidor de corriente DC Hall

byte Cursor[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
//*********************************************************************************************
// funcion de inicializacion para el arduino, se ejecuta al darle corriente y solo una vez
// ajusta parametros del arduino como si los pines son entradas o salidas....etc
//*********************************************************************************************

void setup()
{
  // escribe los valores iniciales de los registro que nos interese
  // pone a cero los registros antes de que los escriba el PC por modbus    

pinMode(2,OUTPUT);  
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);

pinMode(Pulsador1,INPUT_PULLUP);
pinMode(Pulsador2,INPUT_PULLUP);
pinMode(PulsadorF,INPUT_PULLUP);

  /* configura la comunicacion modbus 
  /* 115200 bps, 8N1, two-device network */
    
  configure_mb_slave(COMM_BPS, PARITY, 0);
  delay(20);
  
  regs[SAL_DIG] = 0B00000000;  // pone el registro para que los reles queden en OFF
}

void loop()
{
   // escribe el estado de las entradas de pulsador en los bits correspondientes del registro ModBus

      bitWrite(regs[ENT_DIG], 0, digitalRead(Pulsador1));
      bitWrite(regs[ENT_DIG], 1, digitalRead(Pulsador2));
      bitWrite(regs[ENT_DIG], 2, digitalRead(PulsadorF));
    
  // Activa la salida correspondiente con el valor que se le envia por el ModBus

//    digitalWrite(Led_1,  bitRead(regs[SAL_DIG], 0));
//    digitalWrite(Led_2,  bitRead(regs[SAL_DIG], 1));
//    digitalWrite(Led_3,  bitRead(regs[SAL_DIG], 2));
//    digitalWrite(Led_4,  bitRead(regs[SAL_DIG], 3));
//    digitalWrite(Led_5,  bitRead(regs[SAL_DIG], 4));

  // Pone el valor de las entradas analogicas en los registros correspondientes del ModBus
 
  //regs[ANALOG_0] = abs(ajuste_cero-analogRead(A0)); // medidor hall de corriente DC
  regs[ANALOG_0] = analogRead(Entrada0);
  regs[ANALOG_1] = analogRead(Entrada1);
  regs[ANALOG_2] = analogRead(Entrada2);
  regs[ANALOG_3] = analogRead(Entrada3);
  regs[ANALOG_4] = 0;
  regs[ANALOG_5] = 0;
  regs[ANALOG_6] = 0;
  regs[ANALOG_7] = 0;
  regs[RPM] = 3300;

/* Comprueba si hay llamada del Monitoriza (master)*/
  delay(10);
  if (update_mb_slave(MB_SLAVE, regs, MB_REGS))
    wdog = millis();            /* memoriza los millis en que hay comunicacion*/
    
  /* no hay respuesta del SCADA en 5seg */
    
  if ((millis() - wdog) > 5000)
    {    
            /* Si no hay comunicacion en 5 sec */
            /*regs[MB_CTRL_1] = 0;   Apaga todo */
            /* aqui todo lo que se quiera que pase si hay fallo de comunicacion*/
    }
}

monitoriza.cpp (20.6 KB)

monitoriza.h (354 Bytes)