Comments 10
Я бы предостерег Вас от использования ModbusRTU.h
Дело в том, то эта библиотека выдерживает положенный по протоколу интервал тишины равный 5мс. При том что в спецификации указано, что интервал тишины должен быть не менее 3.5 символов. На скорости 9600 это около 3мс, на скорости же 115200 это уже 200мкс.
Продолжительность интервала тишины зависит от скорости!
Используя фиксированный интервал тишины разработчик этой библиотеки свел на нет эффект от увеличения скорости передачи. На скорости 115200 при нормальной реализации цикл «запрос-ответ» занимает порядка 2 мс, а нас тут заставляют 5 мс тишину выдерживать.
Я долго не мог понять почему увеличение скорости с 9600 до 115200 не дает эффекта, пока не ткнулся осциллографом. Ну а потом полез в код и увидел эту бяку
а вот так там задается интервал тишины
Для нашего проекта пришлось переписать эту библиотеку и результат ошеломил — быстродействие сети выросло просто колоссально. Скоро выложу новую либу на гит, а пока призываю: Люди! Смотрите код используемых библиотек, особенно если речь идет об ардуино!
Это не первый случай говнокода в их библиотеках…
Дело в том, то эта библиотека выдерживает положенный по протоколу интервал тишины равный 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 или дождаться пока я выложу нашу реализацию на гитхаб. В нашей нет пока работы с мастером, ибо нам пока не надо. В принципе могу выложить код для слейвов
Держите ссылку Modbus slave for Arduino
Спасибо за комментарий, буду это учитывать в дальнейшем.
Конечно хотелось бы использовать более стабильно работающую библиотеку.
Конечно хотелось бы использовать более стабильно работающую библиотеку.
Сударь, вам респект, вы сэкономили мне кучу времени
Да, совершенно забыл вот что. 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
можно же просто сохранять словари и загружать через import
Sign up to leave a comment.
Простая Scada на Python и Arduino