Custom ModBus RTU Slave via USB

Hi all,

i am struggeling to get this project to actually work.

I wnt to create a Modbus RTU Slave that connect via USB to my openPLC Pi which runs the Modbus Master.

My Requirements are:

MEGA 2560 (XA) - Input extender will only read all Pins as Inputs
MEGA 2560 (XB) - Output extender will output all pins.

I have tried several Librarys and always have the result that on my Master i can establish a connection but while reading the Input register it times out.

Is this even possible to do via Modbus?

So what indicates "established connection"?
Modbus is just a protocol, your hardware remains unclear here.

As said iam using a Arduino MEGA 2560 connected via USB to My RSAP Pi 3.

Modbus Read Discrete Input Registers failed on MB device MEGA_XA: Connection timed out



#include <ModbusSerial.h>
ModbusSerial modbus;

// Digital input pins (excluding 0, 1)
const uint8_t inputPins[] = {
  2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
  14, 15, 16, 17, 18, 19, 20, 21,
  22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  50, 51, 52, 53
};
const uint8_t numInputs = sizeof(inputPins) / sizeof(inputPins[0]);

// Analog input pins (A0–A15)
const uint8_t analogPins[] = {
  A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15
};
const uint8_t numAnalogs = sizeof(analogPins) / sizeof(analogPins[0]);

void setup() {
  // Set digital pins as input
  for (uint8_t i = 0; i < numInputs; i++) {
    pinMode(inputPins[i], INPUT_PULLUP);
  }

  // Start Modbus slave on Serial, 9600 baud, slave ID 1
  modbus.config(&Serial, 9600, SERIAL_8N2);
  modbus.setSlaveId(1);

  // Map digital inputs as discrete inputs (function code 0x02)
  for (uint8_t i = 0; i < numInputs; i++) {
    modbus.addIsts(i);
  }

  // Map analog inputs as input registers (function code 0x04)
  for (uint8_t i = 0; i < numAnalogs; i++) {
    modbus.addIreg(i);
  }
}

void loop() {
  // Update digital input discrete inputs
  for (uint8_t i = 0; i < numInputs; i++) {
    modbus.Ists(i, digitalRead(inputPins[i]));
  }

  // Update analog input registers
  for (uint8_t i = 0; i < numAnalogs; i++) {
    modbus.Ireg(i, analogRead(analogPins[i]));
  }

  modbus.task();
}

Did you try the switch example from that library? With default 8N1 ?