Modbusrtu.h первый слейв забивает эфир

sacred05
Offline
Зарегистрирован: 05.07.2019

Помогите, пожалуйста, разобраться, уважаемые форумчане.

Нужно несколько таймеров, которые будут отображаться на компьютере.

В качестве скады была выбрана 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;
    
   } }

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Это что?

sacred05 пишет:

#include "GyverEncoder.h"

Почему бы Вам не обратиться прямо на https://community.alexgyver.ru/ ? Там Вам и помогут.

sacred05
Offline
Зарегистрирован: 05.07.2019

Это библиотека модуля энкодера

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Так вот и я про тоже. Коды с такими библиотеками здесь разбирать не любят. Попробуйте обратиться на форум её автора.

sacred05
Offline
Зарегистрирован: 05.07.2019

Эта библиотека работы с энкодером повторюсь, а вопрос мой совсем не в работе энкодера, а в передаче данных по модбасу через модуль rs485. Совет понял. Так и сделаю. Спасибо

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, понял, и хорошо.