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

AVR i Modbus - jak odbierać dane z PC do Atmega16?

nasiono 10 Wrz 2011 12:49 4207 8
REKLAMA
  • #1 9913050
    nasiono
    Poziom 17  
    Posty: 355
    Pomógł: 1
    Ocena: 4
    Witam.
    Wykonuje pewien projekt. Na samym końcu okazało się, że trzeba dołożyć obsługę Modbus problem w tym że nigdy nie potrzebowałem używać tego rodzaju komunikacji. Na początek ściągnąłem bibliotekę Freemodbus skompilowałem ją pod Atmege 16 przestawiłem zegar na 16Mhz i odpaliłem(pliku porttimer.c nie modyfikowałem choć chyba powinienem?).
    Do testów wykorzystałem program Modbus Tester w ustawieniach. Wyglada na to że wszystko działa.
    Problem polega na tym ze w przykładzie z biblioteki to ja wysyłam dane do PC . Chciałbym by było na odwrót tzn PC ( w przyszłości PLC ) wysyła stale np 5 bajtów chciałbym je odbierać i wykorzystać w procesorze.
    Z tego co zrozumiałem do odbierania danych z PC powinienem wykorzystać raczej "Holding register" ?.


    Czy mógł by mi ktoś podpowiedzieć jaka funkcja jest za to odpowiedzialna jak powinno to wyglądać jak się do tego zabrać. Czy przy wysyłaniu składaniem ramki i liczeniem CRC zajmuje się funkcja z biblioteki czy nalezy to do zadań programisty ?.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 9913105
    __Maciek__
    Poziom 21  
    Posty: 366
    Pomógł: 25
    Ocena: 92
    W zasadzie freemodbus to implementacja dla urządzeń slave.

    Ale master może wpisywać dane do Slava .. po prostu ustawia rejestry w urządzeniu Slave.

    Poszukaj rozpiski - dotyczącej Modbusa - poczytaj zrozumiesz o co chodzi.
  • REKLAMA
  • #3 9913126
    nasiono
    Poziom 17  
    Posty: 355
    Pomógł: 1
    Ocena: 4
    Z tego co patrzyłem odpowiedzialna jest za to między innymi komenda " 0x10 Write multiple register". Taką opcje mają programy do testowania modbusa pod PC .
    Tylko jaką funkcją z freemodbusa przejąć te dane?

    Dodano po 12 [minuty]:

    Nie wiem czy dobrze kombinuje ale chyba tak to powinno wyglądać?


    Pytanie jescze czy powinienem liczyć CRC czy nie. Wydaje mi się z tego co podglądam w terminalu ze wszystko jest policzone ale chce się upewnić wybaczcie za być może głupie pytania ale robię to na szybko bo nie jest to głównym celem projektu.




    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #4 9913551
    __Maciek__
    Poziom 21  
    Posty: 366
    Pomógł: 25
    Ocena: 92
    Procedura którą przywołujesz to główna pętla obsługi modbusa ... odpowiada za obsługę protokołu, aktualizuje zniemme ( rejestry )

    Nie musisz liczyć crc .. stos freemodbus robi to za ciebie ... inaczej nie miałbyś transmisji danych.

    Jeśli chcesz poszukaj w moich starych postach jest gdzieś termohigrometr z interfejsem modbus .. oparłem go właśnie o stos freemodbus. Przeanalizuj program i powinieneś sobie poradzić.
  • Pomocny post
    #5 9913577
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    Do odczytywania polecał bym Read Input Registers - 0x04. 0x10 służy do zapisywania. Na końcu każdej ramki wysyłane jest crc16 wiec dobrze by było to liczyć.
  • Pomocny post
    #6 9913617
    __Maciek__
    Poziom 21  
    Posty: 366
    Pomógł: 25
    Ocena: 92
    Niekoniecznie .. koledze zależy na zapisywaniu danych do urządzenia .. więc IMHO najlepiej użyć holding registers .. do których host może zapisywać

    A CRC zapewnia zastosowanie stosu freemodbus.
  • REKLAMA
  • #7 9915489
    nasiono
    Poziom 17  
    Posty: 355
    Pomógł: 1
    Ocena: 4
    Z odbiorem już sobie poradziłem.
    Pojawiły się naszeptujące pytania ze specyfikacji modbusa dowiedziałem się że ramka w trybie ASCII składa się 16 bitowych danych.
    W RTU natomiast z 8 bitowych.
    Jednak w kazdym programie do testowania po ustawieniu liczby rejestru na 4 (tak mam w programie na procesor) zamiast rejestrów 4 rejestrów przypadających na każdy bajt mam ich aż 8 co wskazuje ze jednak RTU bazuje na zmiennych 16 bitowych.
    Druga sprawa to adres początkowy w programie mam ustawiony domyślny z biblioteki czyli 1000 (03E8).Jednak w każdym testerze musze wpisać (03E7) co odpowiada liczbie 999 . W programach gdzie wymagane jest wpisanie tej wartości dziesiętnie wpisuje 1000 ale nadal gdy podgladam co jest nadawane tester wysyła 03e7.

    Jeszcze odnośnie Timerów widze że program z bliblioteki skompilowany jest na zegar 20MHZ. Czy jesli chce uruchomić go na 16Mhz konieczne jest zmodyfikowanie wartosci
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    z pliku porttimer.c?
    Co prawda program bez tej modyfikacji działa ale zależy mi na pewnym działaniu urządzenia przez długi czas i niewierm czy będzie to miało wpływ?

    Mógł by mi ktoś wyjaśnić o co tu chodzi.


    AVR i Modbus - jak odbierać dane z PC do Atmega16?
  • Pomocny post
    #8 9915755
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    Modbus zawsze ma dane 16 bitowe czyli pytając o cztery słowa odpowiedź będzie wynosić 8 bajtów.
    Adres pierwszy zaczyna się od 0 dlatego 100 będzie 99 itd.
    Odczyt z czterech rejestrów jest prawidłowy wysyłasz same zera.
  • #9 10233048
    nasiono
    Poziom 17  
    Posty: 355
    Pomógł: 1
    Ocena: 4
    Temat zamykam za odpowiedzi dziękuje i pozdrawiam.

Podsumowanie tematu

✨ W dyskusji poruszono temat implementacji komunikacji Modbus w projekcie opartym na mikrokontrolerze Atmega16. Użytkownik zainstalował bibliotekę Freemodbus i skonfigurował zegar na 16 MHz, jednak miał trudności z odbieraniem danych z PC. Odpowiedzi wskazują, że do odbierania danych z PC należy użyć rejestrów Holding (0x10) oraz Read Input Registers (0x04). Użytkownik nie musi samodzielnie liczyć CRC, ponieważ biblioteka Freemodbus zajmuje się tym automatycznie. Wskazano również, że adresowanie rejestrów w Modbus zaczyna się od 0, co wyjaśnia różnice w adresach między programami testującymi. Użytkownik z powodzeniem rozwiązał problem z odbiorem danych, ale miał pytania dotyczące specyfikacji ramki Modbus w trybie ASCII i RTU oraz konieczności modyfikacji timerów w bibliotece.
Wygenerowane przez model językowy.
REKLAMA