фрагмент кода. , использую библ. модбас 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