Библиотека ModBus RTU и обнуление результата
- Войдите на сайт для отправки комментариев
Сб, 19/12/2020 - 18:04
Добрый день!
Пытаюсь использовать библиотеку Modbus Master-Slave for Arduino, вот основной код её вызова:
void poll_modbus() {
switch( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
telegram.u8id = 1; // slave address
telegram.u8fct = 3; // function code (this one is registers read)
telegram.u16RegAdd = 4; // start address in slave
telegram.u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram.au16reg = au16data; // pointer to a memory array in the Arduino
master.query( telegram ); // send query (only once)
u8state++;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 250;
}
break;
}
//au16data[0] = 9;
}
Результат хранится в au16data[0] .
Когда датчик подключен (ответ поступает) - всё нормально. Но если отключаю датчик - в au16data[0] так и остаётся старое значение. Неужели эта библиотека не предусматривает, что при отсутствии отклика от слейва нужно обнулить эту переменную?
Или я что-то не так делаю :(
А зайти в библиотеку и посмотреть что она делает слабо? Она , кстати, отвечает на все телодвижения. В том числе на отключенный датчик честно говорит, что датчика нет. Вы сам себе злобный буратино, если не проверив валидность ответа пытаетесь прочитать старые данные, которые только переписываются новыми результатами, если ответ валиден.
Это в скетче (примере, который с нею шёл) так было.
Посмотреть-то могу, но в си не большой спец :(( вот если бы кто показал, где там валидность проверяется.
Навскидку увидел Modbus::validateRequest() - но в примерах он не используется.
К библиотеке идёт полная документация, что очень редко случается. Найдите в ней: enum ERR_LIST {.... uint8_t Modbus::getLastError ( ) ... и другие ссылки на обработчики ошибок.