Добрый день.
UNO с Modbus Master опрашивает датчики и раздает команды нескольким устройствам.
Все телеграммы идут одна за другой, те с равным приоритетом.
Мне необходимо как то запрограммировать очередь, чтобы одни датчики опрашивались часто, хоть каждый первый/второй запрос.
А неважные данные обновлялись редко, но скажем гарантированно не реже раз в 10 секунд.
Есть еще команды, которые можно выполнять однократно и после отправки - вообще не выполнять телеграмму до следующего изменения данных.
UNO с Modbus Master опрашивает датчики и раздает команды нескольким устройствам.
Все телеграммы идут одна за другой, те с равным приоритетом.
Мне необходимо как то запрограммировать очередь, чтобы одни датчики опрашивались часто, хоть каждый первый/второй запрос.
А неважные данные обновлялись редко, но скажем гарантированно не реже раз в 10 секунд.
Есть еще команды, которые можно выполнять однократно и после отправки - вообще не выполнять телеграмму до следующего изменения данных.
C++:
#include <ModbusRtu.h>
Modbus master(0,Serial,4); // 0 this is master
modbus_t telegram[9]; // посылка данных для modbus
unsigned long u32wait; //таймер modbus
uint8_t u8query=0; //pointer to message query
byte u8state;
void modbussend() {
switch ( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
master.query( telegram[u8query] ); // send query (only once)
u8state++;
u8query++; //номер запроса телеграммы
if (u8query > 8) u8query = 0;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 10;
}
break;
}
}
void setup()
{
//rs485
Serial.begin( 19200 ); // baud-rate at 19200
master.start();
master.setTimeOut(20); // таймаут мастера
Serial.println("Start");
//тееграммы
// telegram 0: write registers
telegram[0].u8id = 2;
telegram[0].u8fct = 6; // function code (this one is registers write)
telegram[0].u16RegAdd = 0; // start address in slave
telegram[0].u16CoilsNo = 1; // number of elements (coils or registers) to write
telegram[0].au16reg = &motorSpeed; // pointer to a memory array in the Arduino
// telegram : read registers
telegram[1].u8id = 1;
telegram[1].u8fct = 3; // function code (this one is registers read)
telegram[1].u16RegAdd = 3328; // = 0D00 start address in slave
telegram[1].u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram[1].au16reg = busread; // pointer to a memory array in the Arduino
//и тд
telegram[8].u8id = 3;
telegram[8].u8fct = 4; // function code (this one is registers read)
telegram[8].u16RegAdd = 11; // start address in slave
telegram[8].u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram[8].au16reg = &GetSize; // pointer to a memory array in the Arduino
}
void loop() {
modbussend();
}