Introduction:
Modbus is a widely used communication protocol in industrial automation for interfacing various electronic devices. In this tutorial, we will explore how to create a Modbus client using the XIAO ESP32C3 microcontroller to read holding registers of Modbus TCP/IP devices. The XIAO ESP32C3, equipped with Wi-Fi connectivity, allows us to establish communication with Modbus TCP/IP devices over a network.
Prerequisites:
- XIAO ESP32C3 microcontroller board
- A Modbus TCP/IP device (e.g., PLC, sensor, or any other Modbus-enabled device or Simulator)
- Arduino IDE installed on your computer
- Basic understanding of Modbus protocol
Install Modbus Library:
To communicate with Modbus devices, we need to install the Modbus library. Follow these steps to install the library:
- Open the Arduino IDE and navigate to Sketch > Include Library > Manage Libraries.
- Search for “modbus-esp8266” and install the “modbus-esp8266” library.

Writing the Code:
Now, let’s write the code to create a Modbus client using the XIAO ESP32C3. Below is a sample code snippet to read holding registers from a Modbus TCP/IP device:
				
					#include 
#include 
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
IPAddress remote(192, 168, 1, 7);  // Address of Modbus Slave device
const int START_REG = 0;           // Starting holding register
const int NUM_REGS = 10;           // Number of holding registers to read
const int INTERVAL = 5000;         // Interval between reads (in milliseconds)
WiFiClient client;
ModbusIP mb;
uint16_t res[NUM_REGS];
uint8_t show = NUM_REGS;  // Counter for displaying values
uint32_t LastModbusRequest = 0;  // Variable to track the last Modbus request time
void setup() {
  Serial.begin(115200);
  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  // Initialize Modbus client
  mb.client();
}
void loop() {
  if (millis() - LastModbusRequest >= INTERVAL) {
    LastModbusRequest = millis();
    if (mb.isConnected(remote)) {  
      // Read holding registers from Modbus Slave
      uint8_t transaction = mb.readHreg(remote, START_REG, res, 10, nullptr, 1);
      
      // Wait for the transaction to complete
      while(mb.isTransaction(transaction)) {
        mb.task();
        delay(10);
      }
      // Print holding register values
      Serial.println("Holding Register Values:");
      for (int i = 0; i < NUM_REGS; i++) {
        Serial.print("Register ");
        Serial.print(i);
        Serial.print(": ");
        Serial.println(res[i]);
      }
    } else {
      // If not connected, try to connect
      mb.connect(remote);
    }
  }
}   
				
			
		- Replace "YourWiFiSSID"and"YourWiFiPassword"with your Wi-Fi credentials. Also, set theserverIPvariable to the IP address of your Modbus TCP/IP device.
Upload the Code:
Connect your XIAO ESP32C3 board to your computer using a USB cable. Select the correct board and port from the Tools menu, then click the “Upload” button to upload the code to your XIAO ESP32C3 board.

Testing:
Once the code is uploaded successfully, open the Serial Monitor in Arduino IDE. You should see the XIAO ESP32C3 connecting to your Wi-Fi network and then attempting to read holding registers from the Modbus TCP/IP device. If everything is set up correctly, you should see the data received from the Modbus device in the Serial Monitor.

Conclusion:
In this tutorial, we’ve learned how to create a Modbus client using the XIAO ESP32C3 microcontroller to read holding registers from Modbus TCP/IP devices. With this knowledge, you can now build your own Modbus-enabled IoT applications and integrate them into industrial automation systems. Experiment with different Modbus functions and parameters to explore more functionalities offered by the Modbus protocol.
 
				