ARDUINO Y EASTRON DCM230 (protocolo MODBUS)

Hola a todos, hace poco configuré un EASTRON SDM230 y perfecto, leo tensiones, intensidad, potencia... compré un DCM230 que funciona exactamente igual, pero es para medidas en continua. Por ejemplo, para medir tensiones en los comandos MODBUS son exactamente iguales que para medir tensiones en el SDM230. Pues no se lo que estaré haciendo mal que funciona a veces, tras pulsar reset muchas veces me da la medida, 2 o 3 veces seguidas hasta que se queda pillado, tengo el perro guardián configurado a los 8 segundos porque se queda en un bucle esperando... este es el código:

// RS485 Control pin
const int RS485_control = 3;
#include <avr/wdt.h>
// Receive buffer
int Buffer[9];

int contador = 0;

union
{ 
 unsigned long a ;
 float b ;
} u ;


void setup()
{
  wdt_disable();

 // Init serial communication
 Serial2.begin(2400); 
 Serial.begin(9600); 
 
 // Set RS485 Control pin to OUTPUT
 pinMode(RS485_control, OUTPUT); 
 
 // Set pin to send data HIGH
 digitalWrite(RS485_control, HIGH);
wdt_enable(WDTO_8S);
}

void loop()
{
 wdt_reset();
 contador = contador +1 ;

 Serial.print(leeAC(6),4);
 Serial.println(" V");
 delay(1000);

}



float leeAC(int valor)
{
// MEDIDOR DE ALTERNA
// This command is to read 2 registers (4 bytes) form meter 
// with ID:01 where is Active power value
int PowerReadCommand[] ={0x01, 0x04, 0x00, 0x0C, 0x00, 0x02, 0xB1, 0xC8};
// with ID:01 where is Frequency value
int FrequencyReadCommand[] ={0x01, 0x04, 0x00, 0x46, 0x00, 0x02, 0x90, 0x1E};
// with ID:01 where is Current value
int CurrentReadCommand[] ={0x01, 0x04, 0x00, 0x06, 0x00, 0x02, 0x91, 0xCA};
// with ID:01 where is Voltage value
int VoltageReadCommand[] ={0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xCB};
// with ID:01 where is Voltage value
int EnergyReadCommand[] ={0x01, 0x04, 0x00, 0x48, 0x00, 0x02, 0xF1, 0xDD};

// MEDIDORES DE CONTINUA

// BATERIA LITIO
// with ID:02 where is Active power value
int VoltageReadCommand2[] ={0x02, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xF8};

// CONDENSADORES
// with ID:03 where is Active power value
int VoltageReadCommand3[] ={0x03, 0x04, 0x00, 0x00, 0x00, 0x02, 0x70, 0x29};


// ENTRADA INVERSOR
// with ID:04 where is Active power value
int VoltageReadCommand4[] ={0x04, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0x9E};

// PANELES SOLARES
// with ID:05 where is Active power value
int VoltageReadCommand5[] ={0x05, 0x04, 0x00, 0x00, 0x00, 0x02, 0x70, 0x4F};



 // Set pin to HIGH > Transmit mode
 digitalWrite(RS485_control, HIGH); 


switch (valor) {
  case 0:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand[i]);
    break;
  case 1:
 for (int i=0; i < 8; i++) Serial2.write(CurrentReadCommand[i]);
    break;
  case 2:
 for (int i=0; i < 8; i++) Serial2.write(FrequencyReadCommand[i]);
    break;
  case 3:
 for (int i=0; i < 8; i++) Serial2.write(PowerReadCommand[i]);
    break;
  case 4:
 for (int i=0; i < 8; i++) Serial2.write(EnergyReadCommand[i]);
    break;
  case 5:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand2[i]);
    break;  
  case 6:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand3[i]);
    break;   
  case 7:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand4[i]);
    break; 
  case 8:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand5[i]);
    break; 
  default:
 for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand[i]);
    break;
}

 delay(50);

// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
 
// Waiting for receive reply
while ( Serial2.available()<9); 
 
// Read reply in Buffer[];
for (int i=0; i < 9; i++) Buffer[i] = Serial2.read();

 float x;
 ((byte*)&x)[3]= Buffer[3];
 ((byte*)&x)[2]= Buffer[4];
 ((byte*)&x)[1]= Buffer[5];
 ((byte*)&x)[0]= Buffer[6];
 
 return x;
 
}