Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Programming issue? timeout without delay within the code #139

Open
realKamillo opened this issue Jan 31, 2024 · 2 comments
Open

Programming issue? timeout without delay within the code #139

realKamillo opened this issue Jan 31, 2024 · 2 comments
Labels
type: imperfection Perceived defect in any part of project

Comments

@realKamillo
Copy link

realKamillo commented Jan 31, 2024

My sketch below is based on the Kitchen Sink example.

If I run the code with delay(5) at the beginning and at the end of the loop, everything is working fine, without I am running into timeout issue during readInputRegisterValues();

Any idea what is wrong with my code or is this a bug?

Slave settings:
Baud rate: 9600
Parity bits: 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();
  }
}
@per1234 per1234 added the type: imperfection Perceived defect in any part of project label Jan 31, 2024
@PanzerFowst
Copy link

What are you communicating with? Check this forum post for an explanation on getting Modbus between two Arduino boards: https://forum.arduino.cc/t/arduinomodbus-only-prints-fail-messages-using-mkr1010-board-and-mkr485-shield/1197701.

@realKamillo
Copy link
Author

Hi,
I used a teensy 4.1 as Master and SGI0B08 (8DI 8DO by eletechsup). This is a simple Digital Input and Output card.
Strange is, that everything is working fine in case delay(5) is within the code.

I will check the link you posted and scan for hints which could solve my problem. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: imperfection Perceived defect in any part of project
Projects
None yet
Development

No branches or pull requests

3 participants