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.

nasiono 10 Wrz 2011 12:49 4075 8
REKLAMA
  • #1 9913050
    nasiono
    Poziom 17  
    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 20  
    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  
    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
  • Pomocny post
    #4 9913551
    __Maciek__
    Poziom 20  
    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ć.
  • REKLAMA
  • Pomocny post
    #5 9913577
    maxiu25
    Poziom 16  
    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 20  
    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  
    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.
  • Pomocny post
    #8 9915755
    maxiu25
    Poziom 16  
    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  
    Temat zamykam za odpowiedzi dziękuje i pozdrawiam.
REKLAMA