Modbus RTU timeout without delay() within the code

Hello,

please find my example below based on Kitchen Sink example.
If I run the code with delay(5) at the beginning and at the end of the loop, everything is working finde, without I am running into timeout issue during "readInputRegisterValues();"

Any Idea what is wrong with my code?

Slave settings:
Baud rate: 9600
Parity bbits: None

/*
  Modbus RTU Client Kitchen Sink

  This sketch creates a Modbus RTU Client and demonstrates
  how to use various Modbus Client APIs.

  Circuit:
   - MKR board
   - MKR 485 shield
     - ISO GND connected to GND of the Modbus RTU server
     - Y connected to A/Y of the Modbus RTU server
     - Z connected to B/Z of the Modbus RTU server
     - Jumper positions
       - FULL set to OFF
       - Z \/\/ Y set to ON

  created 18 July 2018
  by Sandeep Mistry
*/

#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>

int counter = 0;
byte readModbus1 = 0; 
byte writeModbus1 = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("Modbus RTU Client Kitchen Sink");

  // start the Modbus RTU client
  if (!ModbusRTUClient.begin(9600, SERIAL_8N1)) {
    Serial.println("Failed to start Modbus RTU Client!");
    while (1);
  }
}

void loop() {
  readInputRegisterValues();  

  counter++;
  //delay(5);

  if ((bitRead(readModbus1,0)==0) && (bitRead(readModbus1,1)==0) && (bitRead(readModbus1,2)==0) && (bitRead(readModbus1,3)==0) && (bitRead(readModbus1,4)==0) && (bitRead(readModbus1,5)==0) && (bitRead(readModbus1,6)==0) && (bitRead(readModbus1,7)==0))
    {
    ModbusRTUClient.beginTransmission(01, COILS, 0x00, 8);
    for (int i = 0; i < 8; i++) {
      ModbusRTUClient.write(0);
    }
    if (!ModbusRTUClient.endTransmission()) {
      Serial.print(F("failed!1 "));
      Serial.println(ModbusRTUClient.lastError());
    } else {
      Serial.println(F("success1"));
    }
  }
  if (bitRead(readModbus1,0)==1) {
    Serial.println(F("Bit3 ist gesetzt"));
  }

  if ((bitRead(readModbus1,0)==1) || (bitRead(readModbus1,1)==1) || (bitRead(readModbus1,2)==1) || (bitRead(readModbus1,3)==1) || (bitRead(readModbus1,4)==1) || (bitRead(readModbus1,5)==1) || (bitRead(readModbus1,6)==1) || (bitRead(readModbus1,7)==1)) 
  {
 
      writeModbus1 = bitWrite(writeModbus1,0, 1); //Update of relevant bits
      writeModbus1 = bitWrite(writeModbus1,2, 1); //Update of relevant bits
      writeModbus1 = bitWrite(writeModbus1,7, 1); //Update of relevant bits
      ModbusRTUClient.beginTransmission(01, COILS, 0x00, 8); //Start Modbus communication 

      for (int i = 0; i < 8; i++) {
        ModbusRTUClient.write(bitRead(writeModbus1,i)); //writes full byte on the Modbus
      }

    if (!ModbusRTUClient.endTransmission()) {
      Serial.print(F("failed!2 "));
      Serial.println(ModbusRTUClient.lastError());
    } else {
      Serial.println(F("success2"));
    }
  }
  //delay(5);
  //Serial.println();
}

void readInputRegisterValues() {
  Serial.print("Reading input register values ... ");

  // read 10 discrete input values from (slave) id 42,
  if (!ModbusRTUClient.requestFrom(1, DISCRETE_INPUTS, 0x00, 8)) {
    Serial.print("failed!3 ");
    Serial.println(ModbusRTUClient.lastError());
  } else {
    Serial.println("success3");

    while (ModbusRTUClient.available()) {
      readModbus1 = ModbusRTUClient.read();
      Serial.print(readModbus1);
    }
    Serial.println();
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.