Библиотека ModBus RTU и обнуление результата

AonMaster
Offline
Зарегистрирован: 04.12.2017

Добрый день!

Пытаюсь использовать библиотеку 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]  так и остаётся старое значение. Неужели  эта библиотека не предусматривает, что при отсутствии отклика от слейва нужно обнулить эту переменную?
 
Или я что-то не так делаю :(
nik182
Offline
Зарегистрирован: 04.05.2015

А зайти в библиотеку и посмотреть что она делает слабо? Она , кстати, отвечает на все телодвижения. В том числе на отключенный датчик честно говорит, что датчика нет. Вы сам себе злобный буратино, если не проверив валидность ответа пытаетесь прочитать старые данные, которые только переписываются новыми результатами, если ответ валиден. 

AonMaster
Offline
Зарегистрирован: 04.12.2017

Это в скетче (примере, который с нею шёл) так было.

Посмотреть-то могу, но в си не большой спец :(( вот если бы кто показал, где там валидность проверяется.

Навскидку увидел Modbus::validateRequest() - но в примерах он не используется.

nik182
Offline
Зарегистрирован: 04.05.2015

К библиотеке идёт полная документация, что очень редко случается. Найдите в ней: enum  ERR_LIST {....  uint8_t Modbus::getLastError ( ) ... и другие ссылки на обработчики ошибок.