Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Modbus RTU i Atmega8 - Komunikacja

rewers01 17 Sty 2015 12:45 1752 11
  • #1 17 Sty 2015 12:45
    rewers01
    Poziom 8  

    Witam,
    Chciałbym prosić was o pomoc w sprawie komunikacji AVR z PLC po modbusie. Mam do stworzenia projekt w postaci cyfrowego termometru który w zależności od danej temperatury bedzie zarządzał odpowiednim zapalaniem diod na sterowniku PLC. Do tego zadania użyłem Atmegi8, czujnika DS18b20, wyświetlacza lcd, maxa 232. Komunikacja musi odbywać sie po RS232 dlatego zdecydowałem sie na modbusa RTU. Do tej pory udało mi sie skonstruować układ który bez problemu mierzy temperature oraz wysyła ja do terminala na PC.
    Ostatnim krokiem mojego projektu jest skomunikowanie się ze sterownikiem PLC. Wymyśliłem że, mikrokontroler bedzie slavem a sterownik masterem. Przszukałem pół internetu i znalazlem pare programów na atmegi32 albo wykorzystując protokół rs485.
    Do symulacji mastera używam modbus poll oraz bibliotek freemodbus.
    Prosiłbym osoby doświadczone o nakierowanie mnie jak powinien wyglądać kod od strony slava dla takiej atmegi. A najlepiej gotową i przetestowana funkcja. Proszę o to bo pozostało mi nie wiele czasu a od dłuższego czasu stoje w miejscu. Byłbym wdzieczny:)

  • #3 17 Sty 2015 13:23
    kuuczoo
    Poziom 26  

    Potrzebujesz przynajmniej zmiennych takich jak:
    bufor[x] gdzie x to max przewidywana liczba znaków w ramce odbieranej + zapas
    licznik_znaków
    flaga_odebranej_ramki
    flaga_bledu
    .W przerwaniu od Uart czytasz odebrany znak
    .W zależności od wartości licznik_znaków i odebranego znaku albo rozpoczynasz ramke jak był 0 a znak był adresem, albo wstawiasz znak do bufora jak 0<licznik<max, albo ustawiasz flage_błędu i zerujesz licznik_znaków jak jest większy od max
    .Jeśli to był ostatni poprawny znak mieszczący się w długości zakładanej ramki to zerujesz licznik_znaków i ustawiasz flage_odebranej_ramki.
    Poza przerwaniem
    czekasz na flage_odebranej _ramki, jak sieę pojawi:
    .analizujesz bufor i robisz z danymi co trzeba, jeśli trzeba odpowiadasz masterowi
    .zerujesz bufor i zmienne pomocnicze
    ewentualnie czekasz na flage_błędu i ją odpowiednio obsługujesz

    To tak w skrócie...

  • #4 17 Sty 2015 13:44
    tos18
    Poziom 35  

    Na sourceforge widziałem gotowe biblioteki modbus dla atmegi.
    http://sourceforge.net/projects/avrmodbusserial/
    Sterowniki plc zazwyczaj mają rs485.RS485 mają zazwyczaj urządzenia mające komunikację modbus rtu lub ascii.Implementacja jest prostsza niż rs232
    używasz sn75176(lub zamiennika) zamiast max232 - programowo nic się nie zmienia.
    Do testowania (zamiast plc) polecam modbusmastertoolpc.

    Opis ramki jest na wiki http://pl.wikipedia.org/wiki/Modbus

  • #5 17 Sty 2015 16:15
    rewers01
    Poziom 8  

    Dzieki za szybka odpowiedz.
    Problem jest taki że sciągnałem gotowe biblioteki jednak po kompilacji wyskakuje mi taki błąd

    Modbus RTU i Atmega8 - Komunikacja

    Po sprawdzeniu wszystkich bibliotek znalazlem jedna do ktorej odwoluja sie te pliki. Tam funkcje sa zadeklarowane i w tym momencie troche zglupiałem, skad ten błąd?

    Czy ktoś pracował juz na tych bibliotekach ?

  • #6 18 Sty 2015 10:23
    tos18
    Poziom 35  

    Fizyczna lokalizacja plików zgadza się z deklaracją ?

  • #7 19 Sty 2015 22:33
    rewers01
    Poziom 8  

    Otóż tak, dzieki uprzejmości jednego z użytkowników udało mi sie przerobić program pod mój czujnik. Jedyny błąd jaki w tym momencie mi wyskakuje dotyczy rozmiaru programu. Obecnie kod wazy 9.6 kbajta a musze zmieścic to na Atmege8.

    W załaczniku zamieszczam cały moj kod wraz z bibliotekami. Czy znalazła by się tutaj osoba która pomogła by mi zmniejszyć wage całego projektu? Prosiłbym również o rzucenie okiem na kod ktory napisałem.

  • #8 19 Sty 2015 23:33
    zumek
    Poziom 39  

    rewers01 napisał:
    .. Obecnie kod wazy 9.6 kbajta a musze zmieścic to na Atmege8.

    To mi wygląda na -O0 :D
    Poczciwe AVRStudio4.18, z jeszcze poczciwszym WinAVR-em, generuje kody:
    -O0 = 9602 B
    -Os = 7886 B
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Projekt w załączniku.

  • #9 20 Sty 2015 00:30
    rewers01
    Poziom 8  

    Przyznam się że troche zgłupiałem. Korzystam z Eclipsa pod avr. Po importowaniu programu który zamieściłeś w załączniku kod nie zmienil swoich rozmiarów. ;/

  • #10 20 Sty 2015 12:10
    zumek
    Poziom 39  

    rewers01 napisał:
    ... kod nie zmienil swoich rozmiarów. ;/

    A "przestawiłeś" optymalizację na -Os :?:

    Modbus RTU i Atmega8 - Komunikacja

    Albo ustaw jako aktywną, konfigurację Release, bo tam ustawiłeś -Os.

    I tak już na marginesie, jeśli zdecydowałeś się używać jakiegoś narzędzia, to wypadałoby poznać choćby jego podstawowe możliwości :D

  • #11 20 Sty 2015 14:35
    rewers01
    Poziom 8  

    Wielkie dzięki za odpowiedz. Faktycznie ta opcja nie byla zaznaczona. Po kompresji program mieści sie na Atmedze. Jednak nastał kolejny problem. Po skonfigurowaniu programu Modbus Poll wywkakuje błąd "timeout error".

    Modbus RTU i Atmega8 - Komunikacja

    Po czym wykorzystując opcje " Read/Write definition" konfiguracja wygląda tak:

    Modbus RTU i Atmega8 - Komunikacja

    Dla jasności zamieszczam kod main.c:

    Kod: text
    Zaloguj się, aby zobaczyć kod

  • #12 10 Sie 2017 09:42
    martin.v
    Poziom 1  

    ako sa ti to podarilo? funguje program? modbus odpoveda ? mas screenshot z mdpoll programu? dakujem. pouzivam freemodbus 1.5 ale neodpoveda mi atmega. martin

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME