Skocz do zawartości

Modbus ESP32 - w jaki sposób odczytać tylko jeden bit rejestru?


Pomocna odpowiedź

Pozostaje chyba sprawdzać konkretny bit w pętli możliwie szybką funkcją. W esp32 możesz użyć biblioteki rmt do generowania jednorazowego przebiegu. Daje dosyć dokładne czasy.

(edytowany)
2 godziny temu, robo1973 napisał:

Witam !!!

Z Modbus otrzymuję  bit_0 = zwroc_bit(SET_PIN_krok_M, 0)

Chciałbym teraz żeby ten bit wygenerował mi przebieg prostokątny o czasie trwania np 500 ms.

Czyli w chwili gdy pojawia się zbocze narastające (zamiana stanu z 0 n na 1 na bit_0 ) program wygeneruje prostokąt.

Kolejne generowanie prostokąta nastąpi po ponownym pojawianiu się zbocza narastającego na bit_0

Trzeba pewnie odczytywać zbocze narastające na bit_0

Czy jest do tego gotowa funkcja Myślałem o przerwaniach ale one tylko na fizyczne wejścia działają ?

Proszę o pomoc  i dziękuję pozdrawiam !! >

A mógłby kolega opisać projekt jaki buduje jako całość, bądź moduł funkcyjny? Teraz z naszego , punktu widzenia czyli czytających, wygląda to jak wyrwane z całej układanki puzzle, a my mamy się domyślić co przedstawia układany z nich obrazek.

Widzę kolega próbuje zrobić, takie nazwę to głębokie sterowanie, z użyciem protokołu MODBUS. Zasadniczo protokół ten nigdy nie był pod tym katem zaprojektowany, służy on do wymiany danych między Masterem, a SLAVEami. Oczywiście można coś takiego zrealizować, ale cała logika siedzi w urządzeniu SLAVE. Czy to urządzenie docelowe, zawiera cały komponent programowo logiczny do wygenerowania danej funkcji, tu impulsu 500ms. Master ustawia tylko wybrany BIT, ewentualnie ma dostęp do rejestru (adresu zmiennej), który może określać czas trwania tego impulsu. Jako tako nie ma więc funkcji MODBUS generującej sam impuls.

Tak notabene jedna uwaga do tego rodzaju systemów. Należy bardzo mocno uwzględniać aspekt co się stanie, jak transmisja się zerwie, i co w tedy ma zrobić układ SLAVE?

Edytowano przez BlackJack
inline int funkcja_monostabilna(int8_t pulse_in, int czas_trwania) {
  
  if (!pulse_in && !impuls_prostokat && pamiec == false) { //SET
    impuls_prostokat = 1;
    pamiec = true;
  }
      
  if (pulse_in  &&  pamiec == true) {//RESET
      pamiec = false;
    }   

 if (impuls_prostokat){//reset po czasie
  while (millis() - last >= czas_trwania) {
    impuls_prostokat = 0;
    pamiec = true; 
    last = millis();
  }
 }
 
  return  impuls_prostokat;

Myślę o takiej funkcji SET i reset po czasie  Na wyjściu impul prostokątny impuls_prostokat
Żeby wygenerować kolejny prostokąt to muszę wyłączyć SET i włączyć 

Na razie jak wywołam tę funkcję to tak jakby raz się wykonała i mills nie czeka
Proszę o jej modyfikację i

PS Modbus steruje SET

Pozdrawiam !

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...