[Modbus TCP/IP] Valori degli Holding Register cambiano da soli!!!!

Ciao,
sto usando un Arduino Mega 2560 con Keyestudio W5100 Ethernet Shield per una comunicazione ModBus TCP/IP con un HMI Weintek. Su Arduino ho bisogno di leggere i registri da 0 a 2235. Sono tutti registri di Holdings.
Sto usando la lbreria Mudbus (mudbus/Mudbus at master · luizcantoni/mudbus · GitHub).

Con Serial.print o con un ModBus Master Simulator su PC, leggo valori casuali e immutabili sui registri 189 ÷ 239 e 324, 325.

Perché questo fatto?

Ecco la configurazione e le poche righe di codice in cui vado a leggere i registri:

// LIBRERIE -------------------------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <avr/wdt.h>
#include "Mudbus.h"
#include <AccelStepper.h>


byte mac[]     = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
byte subnet[]  = { 255, 255, 255, 0 };
IPAddress ip(192, 168, 0, 30);  //modifying according your own IP
Mudbus Mb;                      //Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register) signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
                                //Port 502 (defined in Mudbus.h) MB_PORT
                                //Slave ID 1 (default)

Faccio il pool con Mb.Run(); ad inizio loop e poi richiamo la funziona RxModbus:

void RxMB() {
  for (j = 0; j < 15; j++) {
    nome_ricetta[j] = Mb.R[0 + j];
  }
  for (j = 0; j < 20; j++) {
    potenza_on_led_white[j] = Mb.R[15 + j];
    potenza_off_led_white[j] = Mb.R[35 + j];
    ritardo_led_white[j] = ((uint32_t)Mb.R[56 + j] << 16) + uint16_t(Mb.R[55 + j]);
    durata_led_white[j] = ((uint32_t)Mb.R[96 + j] << 16) + uint16_t(Mb.R[95 + j]);
    tempo_on_led_white[j] = ((uint32_t)Mb.R[136 + j] << 16) + uint16_t(Mb.R[135 + j]);
    tempo_off_led_white[j] = ((uint32_t)Mb.R[176 + j] << 16) + uint16_t(Mb.R[175 + j]);
    mod_alt_led_white[j] = Mb.R[215 + j];

    potenza_on_led_purple[j] = Mb.R[235 + j];
    potenza_off_led_purple[j] = Mb.R[255 + j];
    ritardo_led_purple[j] = ((uint32_t)Mb.R[276 + j] << 16) + uint16_t(Mb.R[275 + j]);
    durata_led_purple[j] = ((uint32_t)Mb.R[316 + j] << 16) + uint16_t(Mb.R[315 + j]);
    tempo_on_led_purple[j] = ((uint32_t)Mb.R[356 + j] << 16) + uint16_t(Mb.R[355 + j]);
    tempo_off_led_purple[j] = ((uint32_t)Mb.R[396 + j] << 16) + uint16_t(Mb.R[395 + j]);
    mod_alt_led_purple[j] = Mb.R[435 + j];

    potenza_on_uv[j] = Mb.R[455 + j];
    potenza_off_uv[j] = Mb.R[475 + j];
    ritardo_uv[j] = ((uint32_t)Mb.R[496 + j] << 16) + uint16_t(Mb.R[495 + j]);
    durata_uv[j] = ((uint32_t)Mb.R[536 + j] << 16) + uint16_t(Mb.R[535 + j]);
    tempo_on_uv[j] = ((uint32_t)Mb.R[576 + j] << 16) + uint16_t(Mb.R[575 + j]);
    tempo_off_uv[j] = ((uint32_t)Mb.R[616 + j] << 16) + uint16_t(Mb.R[615 + j]);
    mod_alt_uv[j] = Mb.R[655 + j];

    potenza_on_nebulizzazione[j] = Mb.R[675 + j];
    potenza_off_nebulizzazione[j] = Mb.R[695 + j];
    ritardo_nebulizzazione[j] = ((uint32_t)Mb.R[716 + j] << 16) + uint16_t(Mb.R[715 + j]);
    durata_nebulizzazione[j] = ((uint32_t)Mb.R[756 + j] << 16) + uint16_t(Mb.R[755 + j]);
    tempo_on_nebulizzazione[j] = ((uint32_t)Mb.R[796 + j] << 16) + uint16_t(Mb.R[795 + j]);
    tempo_off_nebulizzazione[j] = ((uint32_t)Mb.R[836 + j] << 16) + uint16_t(Mb.R[835 + j]);
    mod_alt_nebulizzazione[j] = Mb.R[875 + j];

    //potenza_on_umidita[j] = Mb.R[895 + j];
    //potenza_off_umidita[j] = Mb.R[915 + j];
    //ritardo_umidita[j] = ((uint32_t)Mb.R[936 + j] << 16) + uint16_t(Mb.R[935 + j]);
    //durata_umidita[j] = ((uint32_t)Mb.R[976 + j] << 16) + uint16_t(Mb.R[975 + j]);
    //tempo_on_umidita[j] = ((uint32_t)Mb.R[1016 + j] << 16) + uint16_t(Mb.R[1015 + j]);
    //tempo_off_umidita[j] = ((uint32_t)Mb.R[1056 + j] << 16) + uint16_t(Mb.R[1055 + j]);
    //mod_alt_umidita[j] = Mb.R[1095 + j];

    potenza_on_irrigazione[j] = Mb.R[1115 + j];
    potenza_off_irrigazione[j] = Mb.R[1135 + j];
    ritardo_irrigazione[j] = ((uint32_t)Mb.R[1156 + j] << 16) + uint16_t(Mb.R[1155 + j]);
    durata_irrigazione[j] = ((uint32_t)Mb.R[1196 + j] << 16) + uint16_t(Mb.R[1195 + j]);
    tempo_on_irrigazione[j] = ((uint32_t)Mb.R[1236 + j] << 16) + uint16_t(Mb.R[1235 + j]);
    tempo_off_irrigazione[j] = ((uint32_t)Mb.R[1276 + j] << 16) + uint16_t(Mb.R[1275 + j]);
    mod_alt_irrigazione[j] = Mb.R[1315 + j];

    //vuoto1[j] = Mb.R[1335 + j];
    //vuoto2[j] = Mb.R[1355 + j];
    //vuoto3[j] = ((uint32_t)Mb.R[1376 + j] << 16) + uint16_t(Mb.R[1375 + j]);
    //vuoto4[j] = ((uint32_t)Mb.R[1416 + j] << 16) + uint16_t(Mb.R[1415 + j]);
    //vuoto5[j] = ((uint32_t)Mb.R[1456 + j] << 16) + uint16_t(Mb.R[1455 + j]);
    //vuoto6[j] = ((uint32_t)Mb.R[1496 + j] << 16) + uint16_t(Mb.R[1495 + j]);
    //vuoto7[j] = Mb.R[1535 + j];

    potenza_on_riscaldamento[j] = Mb.R[1555 + j];
    potenza_off_riscaldamento[j] = Mb.R[1575 + j];
    ritardo_riscaldamento[j] = ((uint32_t)Mb.R[1596 + j] << 16) + uint16_t(Mb.R[1595 + j]);
    durata_riscaldamento[j] = ((uint32_t)Mb.R[1636 + j] << 16) + uint16_t(Mb.R[1635 + j]);
    tempo_on_riscaldamento[j] = ((uint32_t)Mb.R[1676 + j] << 16) + uint16_t(Mb.R[1675 + j]);
    tempo_off_riscaldamento[j] = ((uint32_t)Mb.R[1716 + j] << 16) + uint16_t(Mb.R[1715 + j]);
    mod_alt_riscaldamento[j] = Mb.R[1755 + j];

    potenza_on_ventilazione[j] = Mb.R[1775 + j];
    potenza_off_ventilazione[j] = Mb.R[1795 + j];
    ritardo_ventilazione[j] = ((uint32_t)Mb.R[1816 + j] << 16) + uint16_t(Mb.R[1815 + j]);
    durata_ventilazione[j] = ((uint32_t)Mb.R[1856 + j] << 16) + uint16_t(Mb.R[1855 + j]);
    tempo_on_ventilazione[j] = ((uint32_t)Mb.R[1896 + j] << 16) + uint16_t(Mb.R[1895 + j]);
    tempo_off_ventilazione[j] = ((uint32_t)Mb.R[1936 + j] << 16) + uint16_t(Mb.R[1935 + j]);
    mod_alt_ventilazione[j] = Mb.R[1975 + j];

    potenza_on_rotazione[j] = Mb.R[1995 + j];
    potenza_off_rotazione[j] = Mb.R[2015 + j];
    ritardo_rotazione[j] = ((uint32_t)Mb.R[2036 + j] << 16) + uint16_t(Mb.R[2035 + j]);
    durata_rotazione[j] = ((uint32_t)Mb.R[2076 + j] << 16) + uint16_t(Mb.R[2075 + j]);
    tempo_on_rotazione[j] = ((uint32_t)Mb.R[2115 + j] << 16) + uint16_t(Mb.R[2115 + j]);
    tempo_off_rotazione[j] = ((uint32_t)Mb.R[2156 + j] << 16) + uint16_t(Mb.R[2155 + j]);
    mod_alt_rotazione[j] = Mb.R[2195 + j];
  }
  //-------------------------------------
  // libero = da Mb.R[2215] a Mb.R[2229];
  //-------------------------------------

  testBIT = Mb.R[2230];
  test_perc_Led_w = Mb.R[2231];
  test_perc_Led_p = Mb.R[2232];
  test_TempBoiler = Mb.R[2233];
  test_TempRadia = Mb.R[2234];
  test_perc_Vel = Mb.R[2235];

}

Per il test, ho impostato tutti i 2236 registri con il valore ‘1234’, tramite un for chiamato una sola volta, e puoi vedere in allegato il risultato:

Ciao

come ti hanno detto QUI la libreria gestisce fino a 125 registri contigui.
devi fare letture multiple partendo da indirizzi diversi...oppure modificare come indicato e vedere se funziona.