Как стать автором
Обновить

Комментарии 10

Я бы предостерег Вас от использования ModbusRTU.h

Дело в том, то эта библиотека выдерживает положенный по протоколу интервал тишины равный 5мс. При том что в спецификации указано, что интервал тишины должен быть не менее 3.5 символов. На скорости 9600 это около 3мс, на скорости же 115200 это уже 200мкс.

Продолжительность интервала тишины зависит от скорости!

Используя фиксированный интервал тишины разработчик этой библиотеки свел на нет эффект от увеличения скорости передачи. На скорости 115200 при нормальной реализации цикл «запрос-ответ» занимает порядка 2 мс, а нас тут заставляют 5 мс тишину выдерживать.

Я долго не мог понять почему увеличение скорости с 9600 до 115200 не дает эффекта, пока не ткнулся осциллографом. Ну а потом полез в код и увидел эту бяку

#define T35  5
#define  MAX_BUFFER  64	//!< maximum size for the communication buffer in bytes


а вот так там задается интервал тишины
// check T35 after frame end or still no frame end
    if (u8current != u8lastRec)
    {
        u8lastRec = u8current;
        u32time = millis() + T35;
        return 0;
    }
    if (millis() < u32time) return 0;


Для нашего проекта пришлось переписать эту библиотеку и результат ошеломил — быстродействие сети выросло просто колоссально. Скоро выложу новую либу на гит, а пока призываю: Люди! Смотрите код используемых библиотек, особенно если речь идет об ардуино!

Это не первый случай говнокода в их библиотеках…

Посоветуйте, какую библиотеку лучше использовать?
Придется править самому код ModbusRTU.h или дождаться пока я выложу нашу реализацию на гитхаб. В нашей нет пока работы с мастером, ибо нам пока не надо. В принципе могу выложить код для слейвов
Спасибо большое
По интерфейсу данная реализация — один в один то что использовали Вы. Так что Ваш код даже править не придется вообще.

Из отличий ещё — поддержка только хардварного UART. Думаю нет смысла заморачиваться на софт сериал
Спасибо за комментарий, буду это учитывать в дальнейшем.
Конечно хотелось бы использовать более стабильно работающую библиотеку.
Сударь, вам респект, вы сэкономили мне кучу времени
Да, совершенно забыл вот что. ModbusRTU.h худо-бедно работает как слейв, но в коде, касающемся мастера есть вот такие милые вещи

/**
 * This method processes functions 1 & 2 (for master)
 * This method puts the slave answer into master data buffer
 *
 * @ingroup register
 * TODO: finish its implementation
 */
void Modbus::get_FC1()
{
    uint8_t u8byte, i;
    u8byte = 0;

    //  for (i=0; i< au8Buffer[ 2 ] /2; i++) {
    //    au16regs[ i ] = word(
    //    au8Buffer[ u8byte ],
    //    au8Buffer[ u8byte +1 ]);
    //    u8byte += 2;
    //  }
}


и вот такие

 u8regsno = u8bytesno = 0; // now auxiliary registers
 for (uint16_t i = 0; i < telegram.u16CoilsNo; i++)
 {


 }       


Так что использовать такое даже в хобби-проектах или, упаси боже, в продакшине не очень разумно
а что у вас формат такой в setting.cfg ???

можно же просто сохранять словари и загружать через import
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации