Call us Now - 0034 938 760 191

Help

Welcome!

This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.

1

Modbus RS485 - good data back but the code is not picking it up

I have sniffed the data to and from the M21+ and i have valid data going out and coming back but the M21+ is not recognizing it.  I have attached what is basically the example code. Can anyone see anything wrong with the Rx portion?

I am on Z and Y and have half duplex switch set to on.  again validated i have a good modbus string leaving and coming to the M21+. 

sniffed data


SENT - 01 03 00 05 00 03 15 CA

Returned - 01 03 06 00 00 00 44 00 00 61 60



At this point this if statment is not firing:   " if (modbus.isWaitingResponse())  "


----------------------------------------------------------------------------code


#include <ModbusRTUMaster.h>


// Define the ModbusRTUMaster object, using the RS-485 or RS-232 port (depending on availability)

#include <RS485.h>

ModbusRTUMaster modbus(RS485);



uint32_t lastSentTime = 0UL;

const uint32_t baudrate = 9600;

bool Dig1State = 0;


////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

  Serial.begin(9600UL);

  Serial.println("Modbus starting...");

  


  // Start the serial port


  RS485.begin(baudrate, HALFDUPLEX, SERIAL_8N1);



  // Start the modbus master object.

  // It is possible to define the port rate (default: 38400)

  modbus.begin(9600);


  pinMode(Q0_1, OUTPUT);

  delay(2000);

  

  Serial.println("Loop start...");

}


////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  // Send a request every 1000ms

  if (millis() - lastSentTime > 2000) {

    

    Dig1State = !Dig1State;

    digitalWrite(Q0_1, Dig1State);

    

    Serial.println("Modbus poll...");

    // Send a Read Coils request to the slave with address 1

    // It requests for 23 coils starting at address 10

    // IMPORTANT: all read and write functions start a Modbus transmission, but they are not

    // blocking, so you can continue the program while the Modbus functions work. To check for

    // available responses, call master.available() function often.

    modbus.readHoldingRegisters( 1 , 5, 3);



    lastSentTime = millis();

  }


  // Check available responses often

  if (modbus.isWaitingResponse()) {

    ModbusResponse response = modbus.available();

    if (response) {

      Serial.println("Modbus responce...");

      if (response.hasError()) {

        // Response failure treatment. You can use response.getErrorCode()

        Serial.print("Modbus Comm Error");

      } 

      else {

        // Get the coil value from the response

        for (int i = 0; i < 3; ++i) {

          Serial.print(i);

          Serial.print("- ");

          Serial.println(response.getRegister(i));

      }

   }

  }

 }

} //loop


Avatar
Discard
1 Answer
0
Best Answer

Hello friend, 


Maybe the !modbus.isWaitingResponse() is not used in the right situation, you can check it and compare it with this example: https://www.industrialshields.com/blog/arduino-industrial-1/post/communicating-by-modbus-rtu-through-a-rs485-serial-interface-seneca-z-d-in-module-93. Or you can adapt this example and try it directly.


Thank you, 

 

Avatar
Discard