emelianov / modbus-esp8266

Most complete Modbus library for Arduino. A library that allows your Arduino board to communicate via Modbus protocol, acting as a master, slave or both. Supports network transport (Modbus TCP) and Serial line/RS-485 (Modbus RTU). Supports Modbus TCP Security for ESP8266/ESP32.
Other
534 stars 190 forks source link

Read all registers in one call task()? #274

Closed kurnatskyi closed 1 year ago

kurnatskyi commented 1 year ago

Добрый вечер. Возможно ли как то считать массив регистров?

Допустим есть такой массив с адресами регистров. uint16_t addr[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 70, 71, 72, 73, 74, 75, 76, 77, 90, 91, 92, 93, 94, 95, 100, 101, 102, 103, 104, 105, 106, 120, 121, 122, 123, 124, 125, 126}

Есть массив с кол-вом регистров: uint16_t qty[] = {17, 8, 6, 7, 7};

mb.readHreg(SLAVE_ID, addr[0], &rhr[0], qty[0], cb); while(mb.slave()) {
mb.task();
delay(30);
}

Читает первые 17 регистров. Потом необходимо заново вызивать функцию readHreg и task для чтения следующих?

rob040 commented 1 year ago

Translation?

kurnatskyi commented 1 year ago

Translation?

Ok.

void loop() {
  if (!mb.slave()) {
    mb.readHreg(SLAVE_ID, 2, &rhr[0], 17, cb); 
    while(mb.slave()) {                                                                
      mb.task();                                                                                                                                                   
      delay(30);                                                                      
    }                                                                                  
    mb.readHreg(SLAVE_ID, 70, &rhr[17], 8, cb);                                     
    while(mb.slave()) {                                                               
      mb.task();                                                                                                                                                  
      delay(30);                                                                       
    } 
  }
}

can i read all registers in one call task()?

emelianov commented 1 year ago

No. You can't place non-sequental registers within single modbus request.

Нет. Modbus не может включать непоследовательные регистры в рамках одного запроса.