logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wykryć zakończenie nadawania ramki (w SLAVE i MASTER)? AVR GCC, Modbus.

zbynio_k 18 Lut 2016 21:38 1215 8
REKLAMA
  • #1 15449355
    zbynio_k
    Poziom 10  
    Witam,
    staram się trenować MODBus, z freemodbus też po troszce się zaznajomiłem,
    ale chciałbym maksymalnie uprościć transmisję (tylko dla moich potrzeb).

    Mam pytanie > jak NAJprościej wykryć zakończenie nadawania ramki (w SLAVE jak i w MASTER).
    Można to zrobić np. na timerze .... czas ciszy > 3,5T ale może jest jakiś prostszy sposób.
    Dla własnych potrzeb mogę 'dołożyć' długość ramki ...
    Ale chciałbym być w "miarę" zgodny z MODBus ASCII/RTU
    jakieś sugestie ?

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 15449389
    grko
    Poziom 33  
    Dobrze kombinujesz. Ja rozwiązałbym to tak, że zapamiętywałbym timestamp (w milisekundach) ostatniego przychodzącego znaku. i jeżeli jest większy niż 4 ms (dla baudrate 9600) to uznajemy że jest koniec ramki. Oczywiście można użyć timera o większej rozdzielczości dla szybszych transmisji. Dla trybu ASCII sprawa jest chyba jasna.
  • Pomocny post
    #3 15450149
    Eagle
    Poziom 24  
    Ja robię reinit timera po odebraniu każdego znaku, stopuję timer po odebraniu całego pakietu. W przerwaniu timera obsługa time-out.
  • REKLAMA
  • #4 15450442
    kornik280
    Poziom 18  
    Jak chcesz to maksymalnie uprościć to możesz przyjąć długość ramki dla zadanego requesta. Gdy dostajesz bajt w przerwaniu inkrementujesz flage , jak doliczysz do założonej długości to analizujesz ramke. Na początek to wystarczy aby zrozumieć podstawy
  • #5 15450553
    Eagle
    Poziom 24  
    @kornik280

    Przecież zliczanie długości pakietu nie zadziała w sensie time out. Niech z jakiś powodów przejdzie tylko połowa ramki, licznik odliczył połowę oczekiwanego pakietu. Następnie następuje retransmisja z powodu braku odpowiedzi, nowa ramka jest dodawana do istniejącej połówki, licznik osiąga oczekiwaną wartość, ale ramka składa się z początku poprzedniego pakietu + początek następnego. Retransmisja się nie powiedzie i dochodzisz do momentu gdy masz dead lock. Bo każdy następny pakiet jest dodawany do następnego. Gdy będzie zrobione na timerze, z czasem mniejszym od retransmisji, niepełny pakiet zostanie odrzucony po timeOut'cie. Druga metoda bez timera to wybrać protokół tak aby nagłówek miał unikalny wzór nie występujący w pakiecie, oraz tak skonstruowana suma kontrolna aby nie zawierała wartości z hedera, np przez dodanie dodatkowego bajtu do pakietu, którego wartość zmieniasz gdy suma zawiera wartości z nagłówka. Minusem tego rozwiązania jest niemożliwość przesłania wszystkich wartości w treści pakietu.
  • REKLAMA
  • #6 15450716
    kornik280
    Poziom 18  
    Jak dojdzie druga połowa ramki to ona nie przejdzie walidacji licznik bajtów sie wyzeruje jak i tablica trzymająca kolejne bajty.
  • REKLAMA
  • #7 15450777
    grko
    Poziom 33  
    @kornik280

    Nie przejdzie walidacji ramka numer 1. Dodatkowo odrzucisz ramkę numer 2. Więc słabo to wygląda bez odmierzania timeoutu.
  • #8 15451162
    kornik280
    Poziom 18  
    Nie twierdze że to jest poprawna implementacja Modbusa, lecz najprostsza wersja dla początkującego.Zapytania pójdą za pewne z jakiegoś symulatora więc zawsze będą poprawne
  • #9 15470902
    zbynio_k
    Poziom 10  
    Dzięki za uwagi.
    Zrobiłem czas ciszy na timerze i działa
REKLAMA