Smart Home Automation Forum
Modbus - Printable Version

+- Smart Home Automation Forum (https://www.kincony.com/forum)
+-- Forum: Technical Support (https://www.kincony.com/forum/forumdisplay.php?fid=20)
+--- Forum: Extender module (https://www.kincony.com/forum/forumdisplay.php?fid=57)
+--- Thread: Modbus (/showthread.php?tid=6597)



Modbus - charles.garand - 09-04-2024

Hi!

anybody had implement Modbus ?
I'm having hard time to get mine working.
I'm using esp32ModbusRTU library.

here is my code;

esp32ModbusRTU modbus(&Serial1, -1); 


void modbusTask(void *pvParameters) {
  Serial1.begin(4800, SERIAL_8N1, RX, TX); 
  printf("Serial1 initialized for Modbus\n");
  vTaskDelay(pdMS_TO_TICKS(1000)); 

    // callbacks  Modbus
    modbus.onData([](uint8_t serverAddress, esp32Modbus::FunctionCode fc, uint8_t* data, size_t length) {
        printf("Modbus Response Received - Server ID: 0x%02x, Function Code: 0x%02x, Length: %u\n", serverAddress, fc, length);
        for (size_t i = 0; i < length; ++i) {
            printf("%02x ", data[i]);
        }
        printf("\n");
    });

    modbus.onError([](esp32Modbus::Error error) {
        printf("Modbus Error: 0x%02x\n", static_cast<uint8_t>(error));
    });

   
    modbus.begin();
  vTaskDelay(pdMS_TO_TICKS(1000)); 

   
    while (true) {
        modbus.readHoldingRegisters(0x01, 0x0000, 4); 
        //vTaskDelay(pdMS_TO_TICKS(1000)); 
    }
}

extern "C" void app_main(void)
{
  vTaskDelay(6000 / portTICK_PERIOD_MS);
  printf("Hello world!\n");
 
    xTaskCreate(modbusTask, "modbusTask", 8192, NULL, 5, NULL);

    while (true) {
        std::cout << "In the while\n" << std::endl;
        //vTaskDelay(pdMS_TO_TICKS(1000));
    }

}

...
#include <esp32ModbusRTU.h>
#include "driver/uart.h"

// Declaration Modbus
esp32ModbusRTU modbus(&Serial1, 10); // 10 is arbitary GPIO because don't use RTS pin


void modbusTask(void *pvParameters) {
// Configurer la communication UART pour Modbus
Serial1.begin(4800, SERIAL_8N1, RX, TX); // Initialise Serial1
printf("Serial1 initialized for Modbus\n");
vTaskDelay(pdMS_TO_TICKS(1000)); // stabilisation time

// Configurer les callbacks de Modbus
modbus.onData([](uint8_t serverAddress, esp32Modbus::FunctionCode fc, uint8_t* data, size_t length) {

printf("Modbus Response Received - Server ID: 0x%02x, Function Code: 0x%02x, Length: %u\n", serverAddress, fc, length);

if (length % 2 != 0) {
printf("Invalid data length\n");
return;
}

for (size_t i = 0; i < length; i += 2) {
uint16_t value = (data[i] << 8) | data[i + 1];
if(i < 5)
value = value / 10;
printf("Register %zu: %u \n", i / 2, value);
}

printf("\n");
});

modbus.onError([](esp32Modbus::Error error) {
printf("Modbus Error: 0x%02x\n", static_cast<uint8_t>(error));
});

// start Modbus
modbus.begin();
vTaskDelay(pdMS_TO_TICKS(1000)); // wait 1 sec to stabilise

while (true) {
modbus.readHoldingRegisters(0x01, 0x0000, 5); // slave address: 0x01
vTaskDelay(pdMS_TO_TICKS(1000));
}
}

extern "C" void app_main(void)
{
xTaskCreate(modbusTask, "modbusTask", 8192, NULL, 5, NULL);

while (true) {
std::cout << "In the while\n" << std::endl;
vTaskDelay(pdMS_TO_TICKS(2000));
}

}