Modbusrtu.h первый слейв забивает эфир
- Войдите на сайт для отправки комментариев
Пт, 05/07/2019 - 17:05
Помогите, пожалуйста, разобраться, уважаемые форумчане.
Нужно несколько таймеров, которые будут отображаться на компьютере.
В качестве скады была выбрана SimpLight.
пока собирал саму схему таймера тестил с одним слейвом, и всё было хорошо, но при подключении второго слейва, независимо от удалённости и кому какой ID отдать, тот ID который имеет наименьшее значение передаёт данные корректно, а вот последующий передаёт заветные циферки, только при паузе в таймере. мабуть кто сталкивался. Сильно не вините- недавно увлёкся темой.
я догадываюсь, что первый вместо того, чтобы передать данные и замолчать, передаёт их постоянно и забивает весь эфир. может и как-то иначе.
#include <TimerOne.h>
#include <ModbusRtu.h>
#include <Wire.h>
#include <MultiFuncShield.h>
#define CLK 5
#define DT 6
#define SW A5
#include "GyverEncoder.h"
#define ID 1 // адрес ведомого
#define timeout_1 1000 // Длительность ожидание ответа (таймаут modbus)
#define polling_1 200 // скорость опроса по modbus
#define retry_count_1 10 // количесво запросов modbus до ошибки и останова обмена
#define TxEnablePin_1 9 // Tx/Rx пин RS485
#define rxPin 0
#define txPin 1
Modbus slave(1, 1, 9);
Encoder enc1(CLK, DT, SW);
enum CountDownModeValues
{
COUNTING_STOPPED,
COUNTING
};
unsigned long millis1,millis2;
// строка для получаемых данных
String inputString0 = "";
// признак конца строки
boolean stringComplete9 = false;
long prevmicros = 0;
byte countDownMode = COUNTING_STOPPED;
String sekChar; // Переменная для преобразования числового значения секунд в строковое.
String minuChar; // Переменная для преобразования числового значения минут в строковое.
byte tenths = 0;
char seconds = 0;
char minutes = 1;
int8_t state = 0; //
uint16_t au16data[11];
unsigned long tempus;
String times2;
int a;
int b = 1;
void setup() {
// put your setup code here, to run once:
tempus = millis() + 100;
pinMode(TxEnablePin_1, OUTPUT);
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multifunction shield library
MFS.write(0);
slave.begin( 115200 );
enc1.setType(TYPE1); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// put your main code here, to run repeatedly:
enc1.tick();
byte btn = MFS.getButton();
if (enc1.isRight()) {delay (100);
minutes++; // если был поворот направо, увеличиваем на 1
if (minutes > 60)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);}
if (enc1.isLeft()) {delay (100);
minutes--; // если был поворот направо, увеличиваем на 1
if (minutes < 0)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);}
if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)
{MFS.beep(100, 100, 4); // beep 3 times, 500 milliseconds on / 500 off
minutes += 59;
if (minutes <= 60)
{
minutes = 59;
}
MFS.write(minutes*100 + seconds);
}
switch (countDownMode)
{
case COUNTING_STOPPED:
if (btn == BUTTON_1_SHORT_RELEASE && (minutes + seconds) > 0)
{
// start the timer
countDownMode = COUNTING;
}
else if(enc1.isHold())
{if(digitalRead(SW))
// start the timer
countDownMode = COUNTING;
}
else if (btn == BUTTON_1_LONG_PRESSED)
{
// reset the timer
tenths = 0;
seconds = 0;
minutes = 1;
MFS.write(minutes*100 + seconds);
}
else if (btn == BUTTON_2_PRESSED || btn == BUTTON_2_LONG_PRESSED)
{
minutes++;
if (minutes > 60)
{
minutes = 0;
}
MFS.write(minutes*100 + seconds);
}
else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)
{
minutes += 59;
if (minutes <= 60)
{
minutes = 59;
}
MFS.write(minutes*100 + seconds);
}
break;
case COUNTING:
if (btn == BUTTON_1_SHORT_RELEASE || btn == BUTTON_1_LONG_RELEASE)
{
// stop the timer
countDownMode = COUNTING_STOPPED;
}
else
{
// continue counting down
tenths++;
if (tenths == 10)
{
tenths = 0;
seconds--;
if (seconds < 0 && minutes > 0)
{
seconds = 59;
minutes--;
}
if (minutes == 0 && seconds == 0)
{
// timer has reached 0, so sound the alarm
MFS.beep(50, 50, 10); // beep 3 times, 500 milliseconds on / 500 off
countDownMode = COUNTING_STOPPED;
}
MFS.write(minutes*100 + seconds);
}
delay(100);
}
break;
// обработка сообщений
} {state = slave.poll( au16data, 11);
if (state > 4)
a=minutes;
b=seconds;
minuChar=a;
sekChar=b;
times2=minuChar +sekChar;
int intVar;
String stringVar = times2;
intVar=stringVar.toInt();
au16data[1] = intVar;
} }
Это что?
Почему бы Вам не обратиться прямо на https://community.alexgyver.ru/ ? Там Вам и помогут.
Это библиотека модуля энкодера
Так вот и я про тоже. Коды с такими библиотеками здесь разбирать не любят. Попробуйте обратиться на форум её автора.
Эта библиотека работы с энкодером повторюсь, а вопрос мой совсем не в работе энкодера, а в передаче данных по модбасу через модуль rs485. Совет понял. Так и сделаю. Спасибо
Ну, понял, и хорошо.