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

protokół komunikacji po szynie RS485 - jaki i jak

eros81 15 Lis 2006 15:49 12614 9
REKLAMA
  • #1 3227429
    eros81
    Poziom 14  
    Posty: 175
    Pomógł: 1
    Ocena: 5
    Witam.
    Robię sobie w domu taką malutką sieć pomiędzy paroma mikrokontrolerami ( ster akwarium, wł. światła, itp.) a komputerem.
    Jako interfejs wybrałem RS485 ( tani a RS mają wszystkie mikrokontrolery – tu AtMega 8).
    I utknąłem na protokole wymiany danych.
    Wiadomo że komputer będzie masterem, ale po szynie chciałem przesyłać krótkie informacje ( ale o różnej długości) i za bardzo nie umie sobie poradzić z protokołem wymiany danych ( pisze pod GCC).
    Podobno MODBUS jest dobry ale jakoś ciężko mi go zaimplementować ( nie znalazłem żadnych bibliotek),
    Czy już ktoś coś takiego pisał, jak się zabrać do tego aby na koniec nie okazało się ze np. obsługa tej transmisji to 90% kodu programu.
  • REKLAMA
  • #2 3227544
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Żeby uzyskać RS485 trzeba założyć konwerter. :D. Bo standardem w PC jest RS232 , Co do protokołu zacznij od czegoś prostego typu:
    ZAPYTANIE ADRESOWE>CZEKANIE NA ODPOWIEDZ>WYSŁANIE ROZKAZU>CZEKANIE NA ODPOWIEDŹ.
  • REKLAMA
  • #3 3228097
    eros81
    Poziom 14  
    Posty: 175
    Pomógł: 1
    Ocena: 5
    Spoko.
    Mam na płytce konwerter (MAX485). a od strony PC mam układ RS232-RS485 (jakiś czas temu w EP "Klocki RS485”).
    Gubię się w programowaniu, np. że mikrokontroler ma sobie wykonywać swój program (obsługa LCD, klawiszy , DS18B20). a podczas transmisji przełączyć na nadawanie i odbieranie. nie wiem czy np. zrobić to wszystko w przerwaniu od UARTa (bo podobno powinny tam być tylko najistotniejsze procedury aby pracy nie blokowało).
  • #4 3228271
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Na przerwaniu trochę trudniej ale jak uP ma robić w międzyczasie też co innego to takie rozwiązanie jest najlepsze.
  • #5 3229294
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    ja właśnie uporałem się z pierwszą częścią takiego zagadnienia o jakie pytasz ;) ... tzn mam ATTiny2313 i komunikacja z PC, za niedługo dojdą kolejne "klocki" ... u mnie ATTiny2313 mierzy temp na 3 czujnikach DS18B20, steruje 2 przekaźnikami na 220V, ma 2 wejścia z optoizolatorami do załączania różnych sygnałów i wykorzytuję komparator do badania czy jest już zmierzch/noc czy dzień (taki sterownik-ogrodu i piwnicy) ;). Na PCcie mogę odczytywać już ładnie stan przekaźników (i ustawiać je manualnie), czas załączenia , temperatury .. tu screenshot

    protokół komunikacji po szynie RS485 - jaki i jak

    a odnośnie protokołu to zaplanowałem i zrobiłem to tak:

    ustaliłem, że dane będą wymieniane w postaci "RAMEK danych"
    budowa ramki:
    1. MSG_Size - rozmiar ramki w bajtach
    2. Adresat - adres (1..255) układu do którego wysyłamy dane
    3. Nadawca - adres (1..255) tego układu który nadaje (każdy moduł ma zapisany na stałe adres - PC ma umownie zawsze 255)
    4. Command - komenda, polecenie - kod od 0-255
    5. DataStart - bajt mówiący o starcie danych (jakaś wybrana wartość)
    6.
    ... bajty danych
    n.
    n+1. suma kontrolna całej ramki (suma XOR wszystkich bajtów)

    dalej:
    w uC na przerwaniach mam zrobiony odbiornik i nadajnik, który wykorzytuje cykliczny o zdeklarowanej wielkości w pamięci SRAM bufor, dzięki czemu wysłanie danych w programie to tylko wpisywanie odpowiednią procedurką znaków do bufora (a przerwanie UDRIE samo już dalej wysyła) - podobnie z odbieraniem danych (przerwanie Rx odbiera i wpisuje do bufora a odpowiednia procedurka odczytuje kolejne znaki z buforka - działa super i i nie obciąża procka ;)....
    oczywiście dorobione są procedurki które aby coś wysłać - formują RAMKĘ jak wyżej i wpisują tylko po kolei jej bajty do bufora, podobnie jest procedura, która sprawdza czy dotarła cała ramka i jest bez błędów oraz co ważne czy w polu adresat jest adres tego układu do którego dotarła (jeśli nie to ramka jest ignorowana) czyli uC cały czas słucha co się dzieje w sieci ;)

    dokładnie podobne zasady zrobiłem tylko że w Delphi na PCcie. Jak narazie wszystko działa ślicznie !

    natomiast rozbudowując o dodatkowe moduły sieć RS485 planuję, że będzie to działało tak:

    jest sobie 1 master i on cyklicznie odpytuje kolejne moduły i wczytuje co potrzeba, jednak - każdy z modułów jeśli chciałby być również podrzędnym masterem - będzie mógł zgłosić to głównemu MASTEROWI, który przydzieli mu odpowiedni czas na działanie jako master w sieci a sam będzie cicho lub będzie działał jako slave przez ten czas. Jeśli ten nowy master skończy przed czasem swoją robotę to powiadomi o tym głównego a ten dalej zacznie odpytywać kolejne moduły itd itd...

    jeśli moduł, który przejął mastera się zawiesi - to jak pisałem po upłynięciu maksymalnego czasu otrzymanego od głównego Mastera - to właśnie on się znowu sam uaktywni.

    dodatkowo, każdy z modułów który przejmuje rolę mastera wyposażę w procedurę, że gdy wyczuje kolizję w sieci (tzn nie będzie otrzymywał odpowiedzi od kolejnych modułów do których się zwraca to przechodzi automatycznie w stan slave ;)

    ... drugie rozwiązanie o którym myślę to działanie sieci (jak podpowiedział mi tu na elektrodzie jeden z kolegów) ArcNet - czyli moduły przesyłają sobie dane w ramkach ale w ramce jest jeszcze tzw ŻETON(TOKEN) który każdy po kolei każdy otrzymuje i jest masterem - a po wykonaniu swojej roboty przekazuje żeton kolejnemu układowi w magistrali - też fajne (tylko jeszcze nie wymyśliłem tu dobrej metody co robić gdy "zdechnie" moduł który własnie otrzymał TOKEN)

    tak generalnie to bardzo ciekawe zagadnienie i programowanie tego sprawia mi jak narazie dużą przyjemność ;) ... dobrze że robię to w asemblerze bo na styk zmieściłem się z tym w ATTiny2313 z jego pamięcią szczególnie RAM 128b ;)

    pozdrówka
  • REKLAMA
  • #6 3229550
    eros81
    Poziom 14  
    Posty: 175
    Pomógł: 1
    Ocena: 5
    Widzę że zrobiłeś kawał dobrej roboty.
    ja zabieram się za swoje układy,
  • REKLAMA
  • #7 3229740
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    ... no to powodzenia ;) ... na początku to tylko wygląda tak, że to mnóstwo kodu do napisania i roboty... ale jak już się zrobi to się tak nie wydaje ;) ... a biblioteki funkcji które się samemu utworzy łatwo się przenosi na kolejne moduły i już szybko idzie ;)
    pozdrówka
  • #8 3232218
    SKBIS
    Poziom 13  
    Posty: 64
    Ocena: 6
    Ja zrobiłem do fabryki ponad 20 urządzonek porozumiewających się po RS485. Wszystko działa do dziś (na szczęście). Zrobiłem sterownik Master, który odpytuje pozostałe Slave'y i wysyła informacje na drugm porcie do PC. Protokół jest taki (sam wymyśliłem, ale też danych nie ma wiele): Bajt startu (#FE - unikalny, nie może się znaleźć w danych, bo zostanie odczytany jako start transmisji i wyzeruje licznik bajtów). Potem adres Slave'a, rozkaz, dane, kontrola CRC8. Ten protokół jest wzorowany trochę na Modbusie. Ale dziś poleciłbym Modbus w trybie tekstowym, jest łatwy do implementacji (tak się zdaje). Start to chyba #10 (dwukropek w kodzie ASCII), kontrolery synchronizują start odczytu ciągu danych, potem adresy, dane i rozkazy są wysyłane w cyfrach i literach w kodach ASCII. Czyli wysyła H41,H42 co odpowiada (nie wiem czy rzeczywiście) cyfrom np.1, 2. Nie wiem czy rozjaśniłem czy zaciemniłem. Generalnie: w tej transmisji musi być jakiś początek bo biedne Slave'y się nie połapią gdzie są. I w tym jest cały problem.
  • #9 8666462
    eros81
    Poziom 14  
    Posty: 175
    Pomógł: 1
    Ocena: 5
    SKBIS napisał:
    Ja zrobiłem do fabryki ponad 20 urządzonek porozumiewających się po RS485. Wszystko działa do dziś (na szczęście). Zrobiłem sterownik Master, który odpytuje pozostałe Slave'y i wysyła informacje na drugm porcie do PC. Protokół jest taki (sam wymyśliłem, ale też danych nie ma wiele): Bajt startu (#FE - unikalny, nie może się znaleźć w danych, bo zostanie odczytany jako start transmisji i wyzeruje licznik bajtów). Potem adres Slave'a, rozkaz, dane, kontrola CRC8. Ten protokół jest wzorowany trochę na Modbusie. Ale dziś poleciłbym Modbus w trybie tekstowym, jest łatwy do implementacji (tak się zdaje). Start to chyba #10 (dwukropek w kodzie ASCII), kontrolery synchronizują start odczytu ciągu danych, potem adresy, dane i rozkazy są wysyłane w cyfrach i literach w kodach ASCII. Czyli wysyła H41,H42 co odpowiada (nie wiem czy rzeczywiście) cyfrom np.1, 2. Nie wiem czy rozjaśniłem czy zaciemniłem. Generalnie: w tej transmisji musi być jakiś początek bo biedne Slave'y się nie połapią gdzie są. I w tym jest cały problem.


    Modbus wcale nie jet taki prosty w obsłudze :-( no i wymaga nie mało zasobów,
    prościej jest cyklicznie odczytywać kolejne napływające dane, jeśli nastąpi przerwa w transmisji to zerujemy licznik danych.
  • #10 8666487
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    eros81 napisał:

    Modbus wcale nie jet taki prosty w obsłudze :-( no i wymaga nie mało zasobów,
    prościej jest cyklicznie odczytywać kolejne napływające dane, jeśli nastąpi przerwa w transmisji to zerujemy licznik danych.


    Wszystko dobrze panie eros ale zanim na drugi raz zabawisz się pan w archeologa odkopując tak stary temat to może jednak zwrócisz pan uwagę na datę ostatniego postu ;)

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji protokołu komunikacji po szynie RS485 między mikrokontrolerami (np. AtMega8, ATTiny2313) a komputerem, gdzie komputer pełni rolę mastera. Użytkownicy wskazują na konieczność stosowania konwerterów, np. MAX485, do uzyskania sygnału RS485 z poziomu mikrokontrolera i PC. Poruszono problem zarządzania transmisją, w tym przełączania trybów nadawania i odbioru oraz obsługi przerwań UART, co jest zalecane przy jednoczesnym wykonywaniu innych zadań przez mikrokontroler. Proponowane podejścia do protokołu obejmują prostą strukturę ramki danych zawierającą rozmiar, adres nadawcy i odbiorcy, komendę oraz dane, z kontrolą CRC8. Jeden z użytkowników opisał własny protokół wzorowany na Modbusie, z unikalnym bajtem startu (#FE) i synchronizacją transmisji. Wskazano, że Modbus, choć popularny, może być trudny do implementacji i wymaga zasobów, dlatego alternatywnie sugerowano prostsze metody, np. cykliczne odczytywanie danych i zerowanie licznika przy przerwie w transmisji. Dyskusja podkreśla znaczenie modularności kodu i tworzenia bibliotek ułatwiających przenoszenie funkcji między urządzeniami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA