Salve a tutti, conosco il forum ma è la prima volta che pubblico un topic spero di non fare errori
, uso arduino da un pò di anni, ho una conoscenza base di elettronica e ottima di informatica.
Ho scritto un programma per leggere valori dai misuratori di energia (in particolare gli SDM-230 della eastron)
tramite protocollo modbus con un convertitore rs485-ttl, questi dati vengono presi tramite usb da un raspberry pi e caricati in un database; Utilizzo un arduino mega 2560 ed ho usato due seriali diverse, la seriale1 per i misuratori e la seriale normale per il raspberry.
Il problema è che dopo qualche minuto-ora l'arduino incomincia a restituire zeri oppure va in overflow, non avendo molto tempo il programma l'ho scritto molto velocemente, e visto che sono tre giorni che ci sbatto non sapevo dove altro rivolgermi.
Questo è il codice:
#include <avr/wdt.h>
// RS485 control pin
const int RS485_control = 2;
// Receive buffer
byte Buffer[9];
//----
/*union
{
unsigned long a ;
float b ;
} u ;*/
//Comandi per richiedere i valori
//C1
byte VoltageReadCommand[] = {0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xCB };
byte KWhReadCommand[] = {0x01, 0x04, 0x00, 0x048, 0x00, 0x02, 0xF1, 0xDD };
byte FrequencyReadCommand[] = {0x01, 0x04, 0x00, 0x46, 0x00, 0x02, 0x90, 0x1E};
byte CurrentReadCommand[] = {0x01, 0x04, 0x00, 0x06, 0x00, 0x02, 0x91, 0xCA};
byte PowerReadCommand[] = {0x01, 0x04, 0x00, 0x0C, 0x00, 0x02, 0xB1, 0xC8};
//C2
byte VoltageReadCommand2[] = {0x02, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xF8 };
byte KWhReadCommand2[] = {0x02, 0x04, 0x00, 0x048, 0x00, 0x02, 0xF1, 0xEE };
byte FrequencyReadCommand2[] = {0x02, 0x04, 0x00, 0x46, 0x00, 0x02, 0x90, 0x2D};
byte CurrentReadCommand2[] = {0x02, 0x04, 0x00, 0x06, 0x00, 0x02, 0x91, 0xF9};
byte PowerReadCommand2[] = {0x02, 0x04, 0x00, 0x0C, 0x00, 0x02, 0xB1, 0xFB};
//C3
byte VoltageReadCommand3[] = {0x03, 0x04, 0x00, 0x00, 0x00, 0x02, 0x70, 0x29 };
byte KWhReadCommand3[] = {0x03, 0x04, 0x00, 0x048, 0x00, 0x02, 0xF0, 0x3F };
byte FrequencyReadCommand3[] = {0x03, 0x04, 0x00, 0x46, 0x00, 0x02, 0x91, 0xFC};
byte CurrentReadCommand3[] = {0x03, 0x04, 0x00, 0x06, 0x00, 0x02, 0x90, 0x28};
byte PowerReadCommand3[] = {0x03, 0x04, 0x00, 0x0C, 0x00, 0x02, 0xB0, 0x2A};
int j = 0;
int q = 0;
int k = 0;
void setup() {
// Init serial communication
Serial.begin(9600);
Serial1.begin(2400);
// Set RS485 Control pin to OUTPUT
pinMode(RS485_control, OUTPUT);
// Set pin to send data HIGH
digitalWrite(RS485_control, HIGH);
//wdt_enable(WDTO_1S);
}
void loop() {
wdt_reset();
for (int p = 0; p <= 3; p++) {
Conta1();
delay(1000);
}
Serial.flush();
Serial1.flush();
for (int t = 0; t <= 3; t++) {
Conta2();
delay(1000);
}
Serial.flush();
Serial1.flush();
for (int l = 0; l <= 3; l++) {
Conta3();
delay(1000);
}
Serial.flush();
Serial1.flush();
}
////////////////////////////////
float Conta1() {
digitalWrite(RS485_control, LOW);
// Set pin to HIGH > Transmit mode
digitalWrite(RS485_control, HIGH);
switch (j) {
case 0:
for (int i = 0; i < 8; i++) Serial1.write(VoltageReadCommand[i]);
delay(1);
break;
case 1:
for (int i = 0; i < 8; i++) Serial1.write(CurrentReadCommand[i]);
delay(1);
break;
case 2:
for (int i = 0; i < 8; i++) Serial1.write(PowerReadCommand[i]);
delay(1);
break;
case 3:
for (int i = 0; i < 8; i++) Serial1.write(KWhReadCommand[i]);
delay(1);
break;
/*default:
for (int i=0; i < 8; i++) Serial1.write(VoltageReadCommand[i]);
break;*/
}
delay(50);
// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
// Waiting for receive reply
while ( Serial1.available() < 9);
//Serial.println("ciao");
// Read reply in Buffer[];
for (int i = 0; i < 9; i++) Buffer[i] = Serial1.read();
float x;
((byte*)&x)[3] = Buffer[3];
((byte*)&x)[2] = Buffer[4];
((byte*)&x)[1] = Buffer[5];
((byte*)&x)[0] = Buffer[6];
// Serial.println(j);
Serial.print(x, 2);
switch (j) {
case 0:
Serial.println(" V1");
//z=1;
break;
case 1:
Serial.println(" A1");
//z=2;
break;
case 2:
Serial.println(" W1");
//z=3;
break;
case 3:
Serial.println(" KWH1");
j = -1;
break;
/*case 2:
Serial.print(" F1");
break;*/
}
//delay(100);
delay(50);
j++;
return x;
}
///////////////////////////
float Conta2() {
digitalWrite(RS485_control, LOW);
// Set pin to HIGH > Transmit mode
digitalWrite(RS485_control, HIGH);
switch (q) {
case 0:
for (int i = 0; i < 8; i++) Serial1.write(VoltageReadCommand2[i]);
delay(1);
break;
case 1:
for (int i = 0; i < 8; i++) Serial1.write(CurrentReadCommand2[i]);
delay(1);
break;
case 2:
for (int i = 0; i < 8; i++) Serial1.write(PowerReadCommand2[i]);
delay(1);
break;
case 3:
for (int i = 0; i < 8; i++) Serial1.write(KWhReadCommand2[i]);
delay(1);
break;
/*default:
for (int i=0; i < 8; i++) Serial1.write(VoltageReadCommand[i]);
break;*/
}
delay(50);
// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
// Waiting for receive reply
while ( Serial1.available() < 9);
//Serial.println("ciao");
// Read reply in Buffer[];
for (int i = 0; i < 9; i++) Buffer[i] = Serial1.read();
float y;
((byte*)&y)[3] = Buffer[3];
((byte*)&y)[2] = Buffer[4];
((byte*)&y)[1] = Buffer[5];
((byte*)&y)[0] = Buffer[6];
//Serial.println(q);
Serial.print(y, 2);
switch (q) {
case 0:
Serial.println(" V2");
//z=1;
break;
case 1:
Serial.println(" A2");
//z=2;
break;
case 2:
Serial.println(" W2");
//z=3;
break;
case 3:
Serial.println(" KWH2");
q = -1;
break;
/*case 2:
Serial.print(" F1");
break;*/
}
delay(50);
q++;
return y;
}
//////////////////////////////////////
float Conta3() {
digitalWrite(RS485_control, LOW);
// Set pin to HIGH > Transmit mode
digitalWrite(RS485_control, HIGH);
switch (k) {
case 0:
for (int i = 0; i < 8; i++) Serial1.write(VoltageReadCommand3[i]);
delay(1);
break;
case 1:
for (int i = 0; i < 8; i++) Serial1.write(CurrentReadCommand3[i]);
delay(1);
break;
case 2:
for (int i = 0; i < 8; i++) Serial1.write(PowerReadCommand3[i]);
delay(1);
break;
case 3:
for (int i = 0; i < 8; i++) Serial1.write(KWhReadCommand3[i]);
delay(1);
break;
/*default:
for (int i=0; i < 8; i++) Serial1.write(VoltageReadCommand[i]);
break;*/
}
delay(50);
// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
// Waiting for receive reply
while ( Serial1.available() < 9);
//Serial.println("ciao");
// Read reply in Buffer[];
for (int i = 0; i < 9; i++) Buffer[i] = Serial1.read();
float z;
((byte*)&z)[3] = Buffer[3];
((byte*)&z)[2] = Buffer[4];
((byte*)&z)[1] = Buffer[5];
((byte*)&z)[0] = Buffer[6];
//Serial.println(k);
Serial.print(z, 2);
switch (k) {
case 0:
Serial.println(" V3");
//z=1;
break;
case 1:
Serial.println(" A3");
//z=2;
break;
case 2:
Serial.println(" W3");
//z=3;
break;
case 3:
Serial.println(" KWH3");
k = -1;
break;
/*case 2:
Serial.print(" F1");
break;*/
}
delay(50);
k++;
return z;
}
Spero possiate aiutarmi.