modbus master polling frequency is very slow

hoo_wave
Posts: 20
Joined: Mon Dec 11, 2023 2:57 am

modbus master polling frequency is very slow

Postby hoo_wave » Tue Sep 02, 2025 7:50 am

I just polling one cid constantly in a for loop, but the frequency becomes extremely slow. about 3s per time, There are no other tasks in my project, and there are also no delay. Why is it so slowly? How can I make it more fast?

Code: Select all

esp_err_t mb_master_init(void)
{
    mb_communication_info_t comm = {
            .port = MB_PORT_NUM,
            .mode = MB_MODE_RTU,
            .baudrate = MB_DEV_SPEED,
            .parity = MB_PARITY_NONE
    };
    void* master_handler = NULL;
    esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler);
    MB_RETURN_ON_FALSE((master_handler != NULL), ESP_ERR_INVALID_STATE, TAG,
                                "mb controller initialization fail.");
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
                            "mb controller initialization fail, returns(0x%x).", (int)err);
    err = mbc_master_setup((void*)&comm);
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
                            "mb controller setup fail, returns(0x%x).", (int)err);

    // Set UART pin numbers
    err = uart_set_pin(MB_PORT_NUM, CONFIG_MB_UART_TXD, CONFIG_MB_UART_RXD,
                              CONFIG_MB_UART_RTS, UART_PIN_NO_CHANGE);
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
        "mb serial set pin failure, uart_set_pin() returned (0x%x).", (int)err);

    err = mbc_master_start();
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
                            "mb controller start fail, returned (0x%x).", (int)err);

    // Set driver mode to Half Duplex
    err = uart_set_mode(MB_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX);
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
            "mb serial set mode failure, uart_set_mode() returned (0x%x).", (int)err);

    vTaskDelay(5);
    err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters);
    MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG,
                        "mb controller set descriptor fail, returns(0x%x).", (int)err);
    ESP_LOGI(TAG, "Modbus master stack initialized...");
    return err;
}

void master_operation_func()
{
    static uint16_t cid = 0;
    float value = 0;
    bool alarm_state = false;
    const mb_parameter_descriptor_t* param_descriptor = NULL;

    ESP_LOGI(TAG, "modbus master polling...");

    for(; cid < num_device_parameters; )
    {
        mbc_master_get_cid_info(cid, &param_descriptor);
        void* temp_data_ptr = master_get_param_data(param_descriptor);
        uint8_t type = 0;
        mbc_master_get_parameter(cid, (char*)param_descriptor->param_key,(uint8_t*)temp_data_ptr, &type);
        cid++;
        cid = cid % num_device_parameters;
    }
}

void app_main(void)
{
    mb_master_init();
    master_operation_func();
}

Who is online

Users browsing this forum: Amazon [Bot] and 2 guests