[SOLUCIONADO] Modbus RTU Master con Max 485

Buenas tardes:

Normalmente he trabajado con Modbus RTU Slave y Modbus TCP Slave sin problemas. En este proyecto quiero que el arduino UNO sea maestro de un variador de velocidad de motores Schneider ATV 12 con comunicación Modbus RTU.
Algo creo que le falta a mi código o librería equivocada.

#include <ModbusMaster.h>

#define MAX485_DE      2

// instantiate ModbusMaster object

ModbusMaster node;

void preTransmission()
{

  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_DE, OUTPUT);
  
  // Init in receive mode
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 9600 baud
  Serial.begin(9600);

  // Modbus slave ID 1
    node.begin(1, Serial);
  
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  
}

void loop()
{

int Mdelay = 15;   // microdelay
node.readHoldingRegisters(0x2199, 1); 
Serial.print("[2199] ");
Serial.print(node.getResponseBuffer(0));
delay(Mdelay);
node.clearResponseBuffer();


Serial.print("  "); 
node.readHoldingRegisters(0x219A, 1); 
Serial.print("[219A] ");
Serial.print(node.getResponseBuffer(0));
delay(Mdelay);
node.clearResponseBuffer();


Serial.print("  "); 
node.readHoldingRegisters(0x219B, 1);  // Estado variador
Serial.print("[219B] ");
Serial.print(node.getResponseBuffer(0));
delay(Mdelay);
node.clearResponseBuffer();


Serial.print("  ");  

node.readHoldingRegisters(0x219C, 1);  // Velocidad real variador
Serial.print("[219C] ");
Serial.print(node.getResponseBuffer(0));
delay(Mdelay);
node.clearResponseBuffer();

Serial.print("  ");  

 
  node.writeSingleRegister(0x2199, 0xE);  //Poner operativo el variador
  node.writeSingleRegister(0x219A, 1200); //Velocidad variador


  
}

La imagen como referencia de conexión del módulo MAX485

No realiza ningun envio y recepción de datos, pero el variador no da error de comunicación.

Gracias,

Un comentario adicional, no veo en la librería la configuración por ejemplo 8N1 para la paridad y bit de parada. Será una librería inadecuada?

Por defecto esto

 // Modbus slave ID 1
    node.begin(1, Serial);

implica N81

Para mas información mira la librería.

Respecto de tu pregunta inicial no la leí con atención aún.

El error estaba en no poner en hexadecimal el buffer y unos ajustes más

#include <ModbusMaster.h>
#define MAX485_DE      2


// instantiate ModbusMaster object

ModbusMaster node;

void preTransmission()
{

  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_DE, OUTPUT);
  
  // Init in receive mode
  digitalWrite(MAX485_DE, 0);

  // Modbus communication runs at 9600 baud
  Serial.begin(9600);

  // Modbus slave ID 1
    node.begin(1, Serial);
  
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.setTransmitBuffer(00, 0x0E); //Ready
  node.writeMultipleRegisters(0x2199,1);
  }

void loop()
{
 
  delay(500);
  node.setTransmitBuffer(00, 0x0F); //run
  node.setTransmitBuffer(01, 1500); //rpm 
  node.writeMultipleRegisters(0x2199,2);

  int Mdelay = 30;   // microdelay
  node.readHoldingRegisters(0x2199, 4); 
  Serial.println(" ");
  Serial.print("[2199] ");
  Serial.println(node.getResponseBuffer(00));
  delay(Mdelay);
  Serial.print("[219A] ");
  Serial.println(node.getResponseBuffer(01));
  delay(Mdelay);
  Serial.print("[219B] ");
  Serial.println(node.getResponseBuffer(02));
  delay(Mdelay);
  Serial.print("[219C] ");
  Serial.println(node.getResponseBuffer(03));
  delay(Mdelay);
  node.readHoldingRegisters(0x0C84,1); //corriente motor
  Serial.print("[0C84] ");
  Serial.println(node.getResponseBuffer(00));
  delay(500);
  
}

Lo que todavía no funciona bien, es el envío de los paquetes y si uso clearbuffer despues de la lectura de los buffers, el siguiente ciclo del loop los resultados pasan a cero.

Solución final:

Agregar un delay (10) en Void preTransmission y postTransmission y recibe bien la lectura de los buffers.