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();
}
}