ModBus su MAX485

Salve a tutti.
Avrei bisogno di un aiuto per un semplice esempio.
Devo visualizzare dei messaggi che mi arrivano in Modbus ad arduino, tramite un modulo MAX485 come quello in figura allegata.
Mi arriveranno dei dati sui registri dal 400000 al 400009 e li devo solo visualizzare o su un display o su seriale.
Purtroppo non sono un esperto, mi sono ritrovato questa cosa tra capo e collo.

Grazie per chi vorrà aiutarmi.

ciao...parti proprio da zero o qualche cosa hai fato?...nel senso...conosci un po' il protocollo modbus?...hai scelto la libreria da usare?...hai buttato giù due righe di codice?
ancora...sei sicuro che i due indirizzi abbiano proprio il valore da te indicato (400000 e 400009)?
hai il documento di scambio dati dello strumento a cui ti collegherai?

Grazie per la risposta.
Non parto proprio da zero, sono uno sviluppatore C# e su arduino ho messo le mani solo per gioco (accensione led ed altre cose elementari).
In questo caso dovrei semplicemente intercettare tutto quello che arriva da un generatore ModBus e stamparlo a video.
Mi hanno dato quei registri perchè i test li faranno su quel set.
Ho già l'hardware configurato e testato (usando un tester modubus, quando metto a 1 il registro 400007, il led si accende.)
Ora dovrei solo stampare a video tutti gli altri.

ciao...da quel che so io tutte le librerie modbus per arduino trattano i registri in un range di una unsigned int (2 byte)...quindi da 0 a a 65535.
detto questo ho visto dei programmi che per trattare i dati come, per esempio, int32 o 64...oppure float etc...al loro interno li gestiscono con dei "numeroni"...quelli che però contano come veri indirizzi sono quelli che dicevo prima...quindi...con cosa stai testando (programma ed hardware)?

Praticamente ho comprato questo hw e funziona tutto come in questo esempio:

Riesco solo a lavorare con gli indirizzi 400007 e 400008 (come riportato sul sito), vorrei intercettare tutti quelli dal 400001 al 400009 e stamparli sul display.

Nulla di più.

Grazie.

ciao...visto un po' il sito da te indicato...tu ce l'hai il programma modbustester?...se si prova a cambiare scelta nella funzione da "read holding registers" ad una delle altre funzioni disponibili...secndo me ti cambia il 400000 in altro mantenendo gli ultimi numeri riferiti al registro vero e proprio...infatti lui anche ti dice di inserire il valore del registro nel range di una INT.
detto questo in allegato un documento (un po' datato ma sempre valido) che ti da una spiegazione del protocollo modbus RTU...in questo modo vedrai come sono costruite le stringhe di richiesta e di risposta delle varie funzioni possibili.
quando ti è chiaro questo possiamo determinare cosa utilizzare come libreria per arduino...che penso farà da slave...

Modbus RTU.pdf (230 KB)

e comunque...se hai la libreria da loro usata...e come scritto nell'esempio...ti basta modificare, aggiungendo i "registri" che t'interessano, nella ENUM all'inizio:

// Using the enum instruction allows for an easy method for adding and 
// removing registers. Doing it this way saves you #defining the size 
// of your slaves register array each time you want to add more registers
// and at a glimpse informs you of your slaves register layout.

//////////////// registers of your slave ///////////////////
enum 
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  ADC0,     
  ADC1,        
  ADC2,
  ADC3,
  ADC4,
  ADC5,  
  LED_STATE,
  BUTTON_STATE,
  TOTAL_ERRORS,
  // leave this one
  TOTAL_REGS_SIZE 
  // total number of registers for function 3 and 16 share the same register array
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
////////////////////////////////////////////////////////////

quindi ...tutto quello che viene prima di TOTAL_ERRORS sono i tuoi registri (dallo 0 al 7)...devi aggiungere le "righe mancanti" per arrivare ai registri che t'interessano.

Intanto ti ringrazio infinitamente!

Quindi basta che aggiungo un ipotetico

ADC3,
  ADC4,
  ADC5, 
  LED_STATE,
  BUTTON_STATE,
  LED_STATE2,
  LED_STATE3,
  TOTAL_ERRORS,
  // leave this one
  TOTAL_REGS_SIZE

per arrivare ai 400008 e 9, giusto?

Grazie ancora.

in teoria si...poi non ho modo di verificare realmente...però da quanto c'è scritto si fa così.
poi sta a te implementare i due nuovi "enumerati" nel programma...quindi aggiornarli in lettura e/o scrittura.

Proverò!
Ti ringrazio per la disponibilità.