Problema libreria SimpleModbus master

Lo que yo veo...

Partiendo del código del primer post:

#include "SimpleModbusMaster.h"

bool m0=0, m_ON=0;


//////////////////// Port information ///////////////////
#define baud 9600
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 5

// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 10 


#define TOTAL_NO_OF_REGISTERS 5

enum
{
  FREQ_CONFECC,
  ARR_CONFECC,
  FREQ_BOB,
  ARR_BOB,
  TOTAL_NO_OF_PACKETS 
};


Packet packets[TOTAL_NO_OF_PACKETS];
unsigned int regs[TOTAL_NO_OF_REGISTERS];


void setup()
{
  delay(2500);
                  // Packet,              id,               function,  addr, data, local
  modbus_construct(&packets[FREQ_CONFECC], 2, PRESET_SINGLE_REGISTER,   269,    0,     0);
  modbus_construct(&packets[ARR_CONFECC],  2, PRESET_SINGLE_REGISTER, 8192,     0,     1);
  modbus_construct(&packets[FREQ_BOB],     3, PRESET_SINGLE_REGISTER,  269,     0,     2);
  modbus_construct(&packets[ARR_BOB],      3, PRESET_SINGLE_REGISTER, 8192,     0,     3);

  // Initialize the Modbus Finite State Machine
  modbus_configure(&Serial, baud, SERIAL_8N2, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);

}

void loop(){

  plc1.actualizacion(); //Actualizar las entradas y salidas
  modbus_update();//actualizar comunicacion modbus



  if (i7 == 1){ 
	  //i7 es marca de la lectura del pulsador
    if (m0==0){ //se ejecuta una sola vez al comienzo
      m0=1;
      packets->connection=1;
      modbus_update();//actualizar comunicacion modbus    
      m_ON=1;
    }
   }

if (m_ON == 1){ //ejecutar si esta en ciclo de encendido
    
    regs[0]=2244;   
    regs[1]=1;
    regs[2]=2244;
    regs[3]=1;
}


}

Independientemente de lo que pretendas hacer te aviso de que la libreria no funciona como tu crees.

ModBus es un protocolo orientado a registros y la libreria SimpleModbusMaster funciona de esta manera.

Por un lado se definen las consultas, creando un array de Packet. En cada packet indicamos la dirección del esclavo, el tipo de consulta, la dirección y los datos y la dirección local

La dirección local es la posición dentro de un array donde se especifican los registros internos del maestro.

Cuando la consulta es una escritura, la libreria busca el dato que se quiere escribir dentro de los registros locales. Por ejemplo: para encender el variador tienes que ir hacer que el registro en el array regs tenga un valor o no.

Si la consulta es una lectura, la libreria guardará el dato que reciba dentro del array regs

Creo que hasta ahí mas o menos lo tienes entendido dentro del código. Pero veo que cometes varios errores.

El primero de ellos es que llamas a la función modbus_update si la entrada está activa. Eso es redundante y puede provocar fallos. Por lo tanto debes eliminar esa llamada y dejar solo una llamada a la función al inicio del loop.

Otro fallo, que no es tuyo si no del compilador es la siguiente linea:

packets->connection = 1;

Aunque el compilador no da error, eso es un error garrafal. Packets es un array que apunta a objetos Packet y no debería colar el apuntador sin direccionar el array.

Veamos lo que te quiero decir. Tu tienes cuatro paquetes, y quiere habilitar o deshabilitar la conexión. Por lo tanto debes acceder a cada paquete de manera independiente:

// Pongo 1, pero también puede ser cero.
packets[FREQ_CONFECC].connection = 1;
packets[ARR_CONFECC].connection = 1;,
packets[FREQ_BOB].connection = 1;
packets[ARR_BOB].conecction = 1;

La variable connection puede usarse de manera que una consulta se ejecute o no, por ejemplo para evitar escrituras todo el rato.

En tu código general, ese error del compilador, puede provocar que no se ejecuten ninguna de las otras consultas.

En lo personal, la libreria SimpleModbusSlave es buena, pero mejorable, de hecho lo hice en su momento y tengo una libreria personalizada que uso en mis proyectos. La libreria SimpleModbusMaster tiene sus defectos y no he llegado a utilizarla. Uno de ellos es la escritura. Con el método polling, no existe manera de que podamos controlar bien que solo queremos escribir un registro una sola vez. Por ejemplo si quieres encender el variador, con que escribas una vez el registro una sola vez el valor 1 sobra, pero cuantas veces se escribirá hasta que puedas controlar que la escritura se ha hecho???.

Espero te sirva de ayuda.