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

STM32 - MODBUS RTU - Jak wykryć początek i koniec ramki

prawicowiec 19 Kwi 2017 17:42 3174 17
REKLAMA
  • #1 16422327
    prawicowiec
    Poziom 9  
    Posty: 78
    Witam
    Jak wykryć początek nadawania ramki MODBUS RTU poprzedzonej ciszą na linii oraz koniec ramki ?
    Mikrokontroler STM32F10x
  • REKLAMA
  • #2 16422333
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 16422402
    prawicowiec
    Poziom 9  
    Posty: 78
    Komunikuje się przez układ SP3485 podłączony do linii Tx, Rx + pin sterujący kierunkiem przepływu danych. Dane odbieram wykorzystując przerwanie. Nie wiem jak wykryć np. ciszę na linii poprzedzającą początek ramki z danymi.
  • #4 16422435
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 16422510
    prawicowiec
    Poziom 9  
    Posty: 78
    Musze zaimplementować protokół w urządzeniu SLAVE (obsługa kilku najprostszych zapytań w protokole MODBUS). W sieci będzie podłączonych więcej niż jedno urządzenie SLAVE
  • #6 16422539
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16422597
    prawicowiec
    Poziom 9  
    Posty: 78
    Chodzi o zabezpieczenie przed nadawaniem kiedy już inny SLAVE jest w trakcie wysyłania odpowiedzi no chyba, że do takiej sytuacji przy tej komunikacji nie dochodzi (RS485)
  • #8 16422665
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Przeczytaj specyfikację MODBUS, tam wszystko jest, uniwersalnie dla każdego urządzenia.

    http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf

    Generalnie wygląda to tak, że po odebraniu każdego znaku czekasz 3,5 znaku na następny znak. Jeśli w tym czasie zostanie odebrany nowy znak, resetujesz timer i znowu czekasz ten okres, jeśli znak nie nadejdzie oznacza to koniec ramki. Przystępujesz do dekodowania ramki z zapytaniem i generujesz ramkę odpowiedzi. W trakcie wysyłania ramki po wysłaniu ostatniego znaku powinieneś poczekać 3,5 znaku przed przełączenie drivera w tryb odbioru. Jest to zabezpieczenie przed pojawieniem się śmieci na magistrali RS485.
  • #9 16424911
    prawicowiec
    Poziom 9  
    Posty: 78
    Mam kolejny problem. Wg tej dokumentacji trzeba ustawić bit parzystości na EVEN i jeden bit stopu lub ustawić 2 bity stopu. Wysyłam dane i przychodzą głupoty chociaż po obu stronach mam dobrze ustawione parametry transmisji.
    Dla przykładu wysyłając dwa bajty 0x30 i 0x32 (w ASCII są to odpowiednio cyfry 0 i 2 otrzymałem w odpowiedzi 0x30 (dobrze) 0xB2 (źle). Wstawia mi bit na najstarszej pozycji
  • #10 16424975
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    Poczytaj dokładnie dokumentację do protokołu MODBUS RTU.
    Jeżeli chce pracować jako master to musisz pamiętać o odpowiednim
    formacie ramki. Nie możesz o tak wysłać dwa bajty.
    Tu jest opisane jak ramka ma wyglądać:
    https://pl.wikipedia.org/wiki/Modbus

    Zacznij od przeczytania dokładnie dokumentacji a wszystko stanie się
    proste.

    Pozdrawiam,
  • #11 16424984
    prawicowiec
    Poziom 9  
    Posty: 78
    Tak ja wiem jak ma wyglądać ramka. Te dwa bajty to dla testu. Interesuje mnie tylko SLAVE. Wysyłam przykładowe zapytania z np. RealTerm, który pełni rolę MASTER podczas testów
  • #12 16425112
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16425224
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,
    prawicowiec napisał:
    Tak ja wiem jak ma wyglądać ramka. Te dwa bajty to dla testu.

    Ok. Ale proponuję złożyć cała ramkę z sumą kontrolną i to wysyłać bez jakiś
    testów.

    Pozdrawiam,
  • REKLAMA
  • #14 16425274
    Konto nie istnieje
    Konto nie istnieje  
  • #16 16425441
    prawicowiec
    Poziom 9  
    Posty: 78
    To jak muszę ustawić port w STM32 dla poprawnej transmisji 8E1 ?
  • #17 16425474
    Rariusz
    Specjalista Automatyk
    Posty: 1773
    Pomógł: 267
    Ocena: 126
    Witam,

    Ustaw port do obsługi RTU. A konfigurację znajdziesz w necie. Jest wiele przykładów nawet z wykorzystaniem SPL więc nie powinno być problemu.

    Pozdrawiam,
  • #18 16425731
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ W dyskusji poruszono problem wykrywania początku i końca ramki w protokole MODBUS RTU przy użyciu mikrokontrolera STM32F10x. Użytkownik zadał pytanie dotyczące detekcji ciszy na linii RS485, co jest istotne w kontekście komunikacji z wieloma urządzeniami SLAVE. Odpowiedzi sugerują, że po odebraniu znaku należy czekać 3,5 znaku na następny, aby zidentyfikować koniec ramki. Wskazano również na konieczność poprawnej konfiguracji portu UART oraz na znaczenie dokumentacji MODBUS. Użytkownik napotkał problemy z parzystością i błędnymi danymi, co wymagało dalszej analizy ustawień transmisji.
REKLAMA