Mod Bus RS485 problemi di indirizzamento ?

Buon giorno, mi sono imbattuto in un video di Paolo Aliverti per la trasmissione RS485 protocollo ModBus con scambio dati tra Master e Slave, mi è piaciuto e vorrei approfondire quindi ho replicato il tutto è funziona, allora ho pensato perchè non aggiungere un’altro pulsante e un’altro led?
E qui casca l’asino…
ho provato e riprovato nulla di fatto qualcuno di voi ha lavorato con con il protocollo modbus?
vorrei capire come inviare i dati da un lato e interpretarli dall’altro inserisco gli sketch Master e slave per avere un aiuto concreto.

Grazie a tutti voi.

Master

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial RS485Serial(10, 11); // RX, TX
#define MAX485_DE_RE    2

ModbusMaster node;

void preTransmission() {
  digitalWrite(MAX485_DE_RE, HIGH);
}
void postTransmission() {
  digitalWrite(MAX485_DE_RE, LOW);
}

#define led1  5 // led 1
#define led2 8  // led 2

void setup() {
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  digitalWrite (led1, HIGH);
  digitalWrite (led2, HIGH);


  pinMode(MAX485_DE_RE, OUTPUT);
  digitalWrite(MAX485_DE_RE, LOW);
  //Serial.begin(9600);
  RS485Serial.begin(9600);

  node.begin(1, RS485Serial);
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

}

int led = LOW;
int ret = 0;

void loop() {

  ret = node.readDiscreteInputs(0x0005, 16); // 0x0005 indirizzo 5

  if (ret == node.ku8MBSuccess) {
    unsigned int ret = node.getResponseBuffer(0x0000); // 16 posizioni es:0000 0000 0000 0001

    if (ret = node.getResponseBuffer(0x0000) == LOW)
    {
      digitalWrite(5, HIGH);
    }
    else
    {
      digitalWrite(5, LOW);
    }

    ret = node.writeSingleCoil(0x000C, led);
    led = !led;
    delay(1000);
  }
  if (ret = node.getResponseBuffer(0x0001) == LOW)
  {
    digitalWrite(8, HIGH);
  }
  else
  {
    digitalWrite(8, LOW);
  }

}

Slave

#include <SoftwareSerial.h>
#include <ModbusSlave.h>

SoftwareSerial RS485Serial(10, 11); // RX, TX
Modbus slave(RS485Serial, 1, 2 );

#define tasto1 5  //pin 5
#define tasto2 6 //pin 6
#define ledstato 12 //pin 12

void setup() {

  pinMode(2, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);

  slave.cbVector[CB_WRITE_COILS] = writeDigitalOut;
  slave.cbVector[CB_READ_COILS] = readDigital;
  slave.cbVector[CB_READ_DISCRETE_INPUTS] = readDigital;

  Serial.begin(9600);
  RS485Serial.begin(9600);
  slave.begin(9600);
}

void loop() {
  slave.poll();
}
uint8_t writeDigitalOut(uint8_t fc, uint16_t address, uint16_t length) {
  Serial.print("FC=05: ");
  Serial.println(fc);
  Serial.println(address);
  Serial.println(length);

  if (address == 12) {
    digitalWrite(12, slave.readCoilFromBuffer(0x00)); // ritorno master

  }
  return STATUS_OK;
}
uint8_t readDigital(uint8_t fc, uint16_t address, uint16_t length) {
  Serial.print("FC=01/02: ");
  Serial.println(fc); // tipo di classe
  Serial.println(address);// indirizzo da leggere
  Serial.println(length); // n. bit

  for (int i = 0; i < length; i++) {
    int bt = 0;
    if (i == 0) {
      bt = digitalRead(5);
    }
    slave.writeCoilToBuffer(i, bt); //invio master
  }

  for (int i = 0; i < length; i++) {
    int bt = 0;
    if (i == 0) {
      bt = digitalRead(6);
    }
    slave.writeCoilToBuffer(i, bt); //invio master
  }
  return STATUS_OK;
}

Buon Giorno, in merito a questo Post vorrei fare una precisazione:

Vi chiedo un aiuto, per l’indirizzamento ho fatto mille prove però nulla, non riesco ad andare avanti.
La cosa che non riesco a capire è come inviare correttamente il dato esempio invio allo slave(0x0000) leggo il buffer ma estraggo sempre e solo il primo bit con la serialprintln. lo vedo il cambio di stato da 0 a 1 sè invio (0x0005) non lo vedo cosa è che sbaglio?
Ho fatto mille ricerche, ho trovato tanto, ma poco chiaro.

Ps.Sò per cerco che ci riuscirò, non chiedo di realizzarlo voi, ma di aiutarmi a capire

Grazie a tutti.