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)