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

Transmisja MODBUS RS-485 z AT90S8535 do InTouch - przerwanie UARTu

KEN 18 Sty 2004 12:59 2811 11
REKLAMA
  • #1 480180
    KEN
    Poziom 14  
    Posty: 138
    Pomógł: 2
    Ocena: 2
    Witam !
    zrobilem urządzonko na AT90S8535 (program pisany w Bacomie), które zbiera pewne dane, które są przekazywane do kompa (do programu wizualizującego procesy technologiczne "InTouch"). Transmisja odbywa sie według standardu transmisji MODBUS czyli master zadaze pytanie slave i slave odpowiada. Wiec w swym urządzonku zamierzałem wykorzystać przerwanie ze sprzętowego uartu (gdy master wysyła cos po RS-e w moim uP wystepuje przerwanie, odbieram dane od master i wysyłam odpowiedz). I tu jest problem bo gdy master wyśle paczke to uP siedzi całyczas w przerwaniu mimo ze master (czyli program InTouch) jest ustawiony na wysylanie zapytania co 3s (napewno nie jest to błąd w oprogramowaniu uP, tylko jakby cały czas coś szło po RS-e). Nie jestem pewien ale moze ma to cos wspulnego z faktem ze InTouch do transmisj wykorzystuje RS-485 i wystawia jakąś jedynke na lini czy cos, którą moj uP traktuje jako znak jakis i z tąd zapetla sie przerwanie, a ja w celach testowych podpiełem to jako zwykłe RS-232 i mam wirusa?

    Z góry dzięki za wszelkie podpowiedzi!!!
  • REKLAMA
  • #2 480224
    jano2300
    Poziom 17  
    Posty: 234
    Pomógł: 2
    Ocena: 7
    RS232 i RS485 ,to różne tematy.Przede wszystkim sprzętowo RS485 wymaga od procesora dodatkowej linni do sterowania kierunkiem przepływu danych,pomijam zupełnie różne poziomy sygnałów .
    Z Twojego postu nie mogę wywnioskować poziomu Twojej wiedzy w temacie,ale chyba Cię to trochę przerasta.
    Tym niemniej chętnie pociągnę temat jeśli to co napisałem powyżej jest dla Ciebie całkowicie jasne.
  • #3 480265
    KEN
    Poziom 14  
    Posty: 138
    Pomógł: 2
    Ocena: 2
    Chyba nie zrozumiałes mego postu:

    1 w normalnych układach wizuakizacji danych wspulprqacujacych z
    programem InTouch z kompa wychodzi zwykły RS-232
    poczym jest na kablu zamontowany konwenter RS232/RS485 lub
    odrazu do kompa jest zamontowana karta z portem RS485

    2 ja w celach testowych (bo potem pozakładam przejsciowki
    RS232/RS485) podpiołem tymczasowo swe urządzenie bezposrednio do
    kompa do portu RS232

    3 i teraz jezeli taką samą paczke wysyłam z kompa do mojego uP np. z
    Hyper Terminala to wszystko działa i jest ok! lecz gdy załącze InTouch
    to układ sie zapętla, nie moze wyjść z przerwania i tu jest problem
    wlasnie
    Ps. doskonale wiem na czym polegają różnice między RS232 i RS485 a poza tym do RS485 wcale nie trzeba dodatkowego przewodu wystarczją dwie linie A,B tworzące pętle prądową i odpowiedni protokół transmisji danych
  • REKLAMA
  • #4 480384
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    KEN napisał:
    3 i teraz jezeli taką samą paczke wysyłam z kompa do mojego uP np. z
    Hyper Terminala to wszystko działa i jest ok! lecz gdy załącze InTouch
    to układ się zapętla, nie moze wyjść z przerwania i tu jest problem
    wlasnie
    To wygląda na błąd protokołu transmisji, procek pewnie zawiesza się czekają na dane które nie przychodzą.
    KEN napisał:
    poza tym do RS485 wcale nie trzeba dodatkowego przewodu wystarczją dwie linie A,B tworzące pętle prądową i odpowiedni protokół transmisji danych
    To jest kwestia dyskusyjna, niby nie potrzeba, ale firmy np Ti wręcz nakazują jego podłączenie. W zeszłym roku uruchamiałem z kolegą prostą sieć edukacyjną na 485, przy ok 20m kabla i 7 konwerterach, każdy element sieci zasilany z oddzielnego zasilacza i sieć działała dość niestabilnie. Dopiero podłączenie wpólnej masy pomogło.
  • REKLAMA
  • #5 480396
    jano2300
    Poziom 17  
    Posty: 234
    Pomógł: 2
    Ocena: 7
    No OK chyba faktycznie nie zrozumiałem Twojego postu .
    Standartowo RS485 pracuje na dwóch przewodach (linni prądowej) i wtedy potrzebny jest dodatkowy sygnał do kontroli przepływu.Jeżeli obie linie Rx i Tx puścić na niezależnych przetwornikach RS485 (na dwóch pętlach) i wymuszonym na stałe kierunkiem przepływu ,to wtedy wystarczy i wszystko faktycznie rozwiązuje protokół transmisji.

    No ale problem jest jak rozumiem już na poziomie warstwy protokołu MODBus.
    Trochę mało wiem na temat MODBUS'a aby się wdawać w szczegółową dyskusję .
    Trochę mało danych.Próbowałeś podglądać transmisję ?. Przyczyn zapętlenia obsługi przerwania w uP może być wiele.Za długa obsługa przerwania(rekurencja) ,źle zerowane flagi RI TI.Może też ten InTouch wystawia break i procek zapętla Ci się w przerwaniu.
    Jeśli nikt bardziej mocny nie włączy się do dyskusji ,to pisz na priv może coś poradzimy.
  • REKLAMA
  • #6 480474
    KEN
    Poziom 14  
    Posty: 138
    Pomógł: 2
    Ocena: 2
    Problem rozwiązany!!!
    zrobilem se monitork i zauważyłem ze ten InTouch oprócz paczki podstawowej wysyla jeszcze jakis znaczek (czego nie było w zwykłym terminalu); i wlasnie ten znaczek powodowal wywolanie kolejnego przerwania i zapetlenie uP


    Dzięki za wszelką pomoc!! I pozdrawiam!
  • #7 499788
    KePeSIaN
    Poziom 12  
    Posty: 33
    W jaki sposób Intouch wstawia "jakiś znaczek" ??. Przecież jeżeli pracuje z protokołem Modbus to ten protokół dokładnie opisuje skład ramki, i nie ma tam miejsca na żadne dodatkowe znaczki, no chyba że nie jest to modbus .

    Możesz mi to wyjaśnić, bo właśnie jestem w trakcie pisania Modbus-Slave, i będę wdzięczny za jakiekolwiek informacje. Zakładałem, że moje urządzenie będzie slavem w sieci i że będzie pracowało z różmymi masterami, SCADA czy PLC, ale nie brałem pod uwage takich problemów o których piszesz - dla mnie Mobus to Modbus

    Dzieki
  • #8 500016
    calinka
    Poziom 15  
    Posty: 120
    Ocena: 1
    Jeżeli mogabym wtrącić się do dyskusji, to chciałabym zwrócić uwagę koledze KEN, aby zmienił algorytm w programie. Jak dobrze zrozumiałam, w obsłudze przerwania odbierane są całe pakiety (jako odpowiedzi na pytanie). Poprawan obsługa transmisji szeregowej powinna polegać na odbiorze jednego znaku i umieszczeniu go w jakimś buforze do interpretacji poza obsługą przerwania. Być może użyty przez KEN sposób obsługi jest prostszy w realizacji, ale jest to 'masz ku klęsce'. Jeżeli program ma być rozwijany, to od jakiegoś stopnia komplikacji staje się programem niemodyfikowalnym (być może już jest osiągnięty ten stan).
  • #9 500360
    KEN
    Poziom 14  
    Posty: 138
    Pomógł: 2
    Ocena: 2
    witam

    Celinka nie do końca ma racje chyba. W Modbasie są dwa rodzaje przesyłu danych
    1- To RTU gdzie odbierasz właśnie tka jak to zostało przez Ciebie opisane.
    2- To ASCII gdzie odbierasz całą paczkę zaczynającą się od znaku „:” i na której końcu jest znak końca „CRL” i nie mozesz sobie odebrać jakiejs jej częsci!
  • #10 500411
    calinka
    Poziom 15  
    Posty: 120
    Ocena: 1
    Ja mówiłam o filozofii programów czyli o sztuce tworzenia algorytmów. Niezależnie od sposobu realizacji wymiany danych między urządzeniami przerwanie powinno obsługiwać jeden znak i wspólpracować z jakimś buforem.
  • #11 501104
    KEN
    Poziom 14  
    Posty: 138
    Pomógł: 2
    Ocena: 2
    Witam!
    Nie będę się spierał! Być może panna (pani?) Calineczka ma racje. W każdym bądź razie ja odbieram całą pakę jednorazowo i wszystko śmiga bez problemowo!
    Pozdrawiam i dziękuje za porady!!
  • #12 551755
    kekon
    Poziom 19  
    Posty: 449
    Pomógł: 10
    Ocena: 47
    Dodatkowa linia do sterowania kierunkiem przepływu danych w RS485 wcale nie jest konieczna. Konwerter RS232/RS485 jest normalnie ustawiony jako odbiornik od strony PC. Przełączanie go w tryb nadajnika może odbywać się w momencie wykryciu bitu startu (czyli bitu w stanie 0).
    Linia TX z PC musi być wtedy dołączona do wejścia uniwibratora pracującego w trybie z wydłużaniem impulsu. Wyjście uniwibratora musi wtedy aktywować nadajnik. W taki sposób zrobionych jest wiele konwerterów. Czas trwania impulsu na wyjściu uniwibratora jest ustalony typowo na czas trwania 4 bajtów przy danej prędkości transmisji, tak więc odbiornik (po odebraniu odpowiedzi) musi odpowiedzieć po czasie większym niż czas trwania 4 bajtów, ponieważ w tym czasie konwerter nastawiony jest na nadawanie. Bardzo ważną rzeczą jest zastosowania odpowiedniego uniwibratora. Najchętniej wielu konstruktorów używa do tego celu układów 74LS123 lub 74HC123 ale mają one pewną wadę: potrafią wyzwalać się od przypadkowych zakłóceń. Profesjonalne konwertery (np. z serii "Adama") jako uniwibratora używają specjalnie do tego celu zaprogramowanego mikrokontrolera

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z transmisją MODBUS RS-485 między mikrokontrolerem AT90S8535 a programem wizualizacyjnym InTouch, polegającego na zapętleniu przerwania UART w mikrokontrolerze. Urządzenie odbiera zapytania od mastera (InTouch) i odpowiada jako slave. Problem pojawia się tylko przy komunikacji z InTouch, a nie przy zwykłym terminalu RS-232, co sugeruje obecność dodatkowego znaku wysyłanego przez InTouch, który powoduje ciągłe wywoływanie przerwania. Dyskusja porusza różnice między RS-232 a RS-485, konieczność stosowania linii sterującej kierunkiem transmisji w RS-485, a także kwestie protokołu MODBUS w trybach RTU i ASCII. Zwrócono uwagę na poprawną obsługę przerwań UART – odbieranie pojedynczych znaków i buforowanie ich do dalszej analizy poza przerwaniem, co jest zalecanym podejściem programistycznym. Ostatecznie problem rozwiązano poprzez identyfikację i obsługę dodatkowego znaku wysyłanego przez InTouch, który wcześniej powodował zapętlenie przerwania. W dyskusji pojawiły się także uwagi dotyczące stabilności sieci RS-485, konieczności wspólnej masy oraz technik sterowania konwerterami RS232/RS485, w tym wykorzystania układów uniwibratorów 74LS123/74HC123 do automatycznego przełączania kierunku transmisji.
REKLAMA