Опрос нескольких слейвов по модбасу. нехватает мощности ESP32. НЕ более 4 регистров , делее аппаратная перезагрузка. в чем дело

фрагмент кода. , использую библ. модбас GitHub - smarmengol/Modbus-Master-Slave-for-Arduino: Modbus Master-Slave library for Arduino

после 4 телеграммы перезагрузка.

#include <ModbusRtu.h>
#define PACET 5  //общее количество элементов для всех ведомых устройств
#define modbus Serial2
uint8_t u8state;  //!< machine состояние
uint8_t u8query;  //!< указатель на запрос сообщения
unsigned long u32wait;
Modbus master(0, modbus, 0);  // this is 0 master
modbus_t telegram[PACET];     // МАССИВ ПАКЕТОВ [1,2,3,...]
 //  uint16_t slave_1[6] = {};  //!<  масив данных SLAVE# телеграммы  для совмесного использования ВАРИАНТ 1
 //  uint16_t slave_2[6] = {};  //!<  масив данных SLAVE#
void setup(){
    modbus.begin(19200, SERIAL_8N1, 16, 17);
    master.start();  
}
/*******  void loop() ******/ 
uint16_t* slave_1 = new uint16_t[12]();  // выделен массив uint16_t[n], инициализирован 0 ** ВАРИАНТ 2

switch (u8state) {  // состояния modbus
    case 0:
      if (millis() > u32wait) u8state++;  // wait state
      break;
    case 1:
      //telega(1, 3, 101, 1, slave_1)
                            // Slaive # 1 Func read 03 : { 907, 909, 101, 102, 103, 106 }
      telegram[0].u8id = 1;
      telegram[0].u8fct = 3;
      telegram[0].u16RegAdd = 907;
      telegram[0].u16CoilsNo = 1;
      telegram[0].au16reg = slave_1;  //[0]

      telegram[1].u8id = 1;
      telegram[1].u8fct = 3;
      telegram[1].u16RegAdd = 909;
      telegram[1].u16CoilsNo = 1;
      telegram[1].au16reg = slave_1;  //[1]
      
      telegram[2].u8id = 1;
      telegram[2].u8fct = 3;
      telegram[2].u16RegAdd = 101;  // 101...103
      telegram[2].u16CoilsNo = 3;
      telegram[2].au16reg = slave_1; //[2,3,4]

      telegram[3].u8id = 1;
      telegram[3].u8fct = 3;
      telegram[3].u16RegAdd = 106;
      telegram[3].u16CoilsNo = 1;
      telegram[3].au16reg = slave_1; //[5]

                                 //Slaive # 2 Func read 03 : err,key,run,tmp,hum,fm
      telegram[4].u8id = 2;           // slave address
      telegram[4].u8fct = 3;          // function code (this one is registers read)
      telegram[4].u16RegAdd = 0;      // start address in slave
      telegram[4].u16CoilsNo = 6;     // number of elements (coils or registers) to read //весь пакет
      telegram[4].au16reg = slave_1;  // pointer to a memory array in the Arduino

      master.query(telegram[u8query]);  //!< ПРАВИЛО: ОТПРАВКА ТЕЛЕГИ ТОЛЬКО ОДИН РАЗ
      printf("telegram - %s\n", telegram);
      u8state++;
      u8query++;
      if (u8query > PACET) u8query = 0;
      break;
    case 2:
      master.poll();  // check incoming messages
      if (master.getState() == COM_IDLE) {
        u8state = 0;
        u32wait = millis() + 1000;
      Serial.print(F("data: "));      Serial.println(*au16data);

      break;
  }
delete[] au16data;

количество слейвов или регистров контролировал как физически так и с пом. Modbus Slave Ver 10. bild 2493

Спасибо, будем знать, что больше, чем на 4

1 лайк

telegram[4]. - Это уже пятый элемент массива.

поправил, если память использовать для запросов статическую, то сброс. а если динамическая - то есть данные, но они нулевые (не правильно в сериале). думаю…..

  • поправил вывод данных Serial.print(F("data: ")); Serial.println(*au16data);
  • код работает!! в консоле каждые 1000 мс по очередно выводятся данные регистров теперь их надо собрать. думаю….

скриншот запость хоть, как перезагружается. Ну или так, словами..

попробовал поменять контроль вывода Serial.print() на printf()/ пока стабильно до 6 телеграмм. опрос 1000 мс, пауза 5мс между тлг.

 master.query(telegram[u8query]);  //!< ПРАВИЛО: ОТПРАВКА ТЕЛЕГИ ТОЛЬКО ОДИН РАЗ
      u32wait = millis() + 5;
      u8state++;
      u8query++;
      if (u8query > PACET) u8query = 0;
      break;
    case 2:
      master.poll();  // check incoming messages
      printf("data: - %d\n", массив[0]);