Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Biblioteka obsługi paneli operatorskich DGUS dla AVR

tehaceole 20 Feb 2014 14:41 6732 11
  • Jakiś czas temu trafiłem na stronę www.whiteelectronics.pl której autor jest polskim dystrybutorem budżetowych paneli operatorskich DGUS. Z ciekawości nabyłem jeden z tych wyświetlaczy (dokładnie ten), aby zapoznać się z jego możliwościami. Za niewielką cenę otrzymujemy kolorowy wyświetlacz z panelem dotykowym, który obsługujemy przy pomocy portu RS232 w standardzie TTL. Jeżeli chodzi o możliwości samego wyświetlacza to uważam, że za tę cenę jest to strzał w 10kę, aby móc konkurować z przemysłowymi panelami (ot choćby Micro Innowation) w aplikacjach o silnie okrojonym budżecie. Trochę czasu trzeba poświęcić na przyzwyczajenie się do dość minimalistycznego środowiska w którym tworzymy wizualizację i do jego ograniczeń (nie da się wprost zrobić pewnych czarów znanych mi z paneli serii XV-1xx, ale da się to osiągnąć stosując kilka prostych zabiegów). Jednak po jego opanowaniu (mi zajęło to 2 popołudnia) możemy z powodzeniem tworzyć efektownie wyglądające wizualizacje. Na podkreślenie zasługuje fakt świetnego wsparcia technicznego ze strony dystrybutora. Polecam również poszukać Jego artykułów na Elektrodzie - nick Bieli.
    Do rzeczy: w każdym panelu operatorskim zmiennym nadawane są adresy. Niektóre z paneli potrafią zassać listę zmiennych i ich adresów bezpośrednio ze środowika w którym programujemy PLC (np. soft galileo importuje listę zmiennych utorzoną w Codesys). To bardzo przyspiesza pracę. Niestety my zmuszeni będziemy zarówno po stronie uP jak i panelu ręcznie ustawić adresy.

    Aby moja biblioteka była jak najbardziej przyjazna postanowiłem, że:
    - umieszczona będzie w niej jedna zmienna określająca ilość zmiennych jaką wymieniamy się z panelem,
    - adresacja zmiennych w panelu nie musi być ciągła, tzn. każdy adres kolejnej zmiennej nie musi być adresem następującym bezpośrednio po poprzedniej,
    - do panelu przesyłane będą tylko zmienne które uległy modyfikacji w uP,
    - możliwe jest ustawienie interwału transmisji do wyświetlacza,
    - na podstawie interwału wyznaczany jest czas timeout dla odczytu z wyświetlacza,
    - biblioteka przygotowana jest do współpracy z procesorami Atmega w których występuje różne nazewnictwo rejestrów kontrolnych UART,
    - każda wymieniana zmienna widziana będzie w uP jako: pojedyncza zmienna uint16_t, 2 zmienne uint8_t, 16 zmiennych bitowych - co umożliwia na prawdę elastyczne pisanie oprogramowania,
    - z poziomu uP możliwe będzie przełączanie wyświetlanych ekranów,
    - wprowadzona zostanie natywna obsługa RS485.

    Nie będę się tutaj rozwodzić nt. sposobu adresacji zmiennych po stronie panelu - strona dystrybutora i jego wpisy na Elektrodzie wystarczająco wyczerpują to zagadnienie.

    Zatem... Do dzieła!

    Biblioteka znajduje się w katalogu Panel_DGUS. Podzielona jest na warstwę wysokopoziomową z której korzystamy w naszym programie, oraz niskopoziomową - opdowiedzialną za bezpośrednią współpracę z modułem UART. Plik DHUS.h zawiera deklaracje funkcji:
    Code: c
    Log in, to see the code
    Ponadto w programie korzystać będziemy ze zmiennych typu strukturalnego "ZmienneDGUS[]". Zdefiniowane są one w plikach obsługi niskopoziomowej. Dzięki tak zadeklarowanej zmiennej mam w programie od razu bezpośredni dostęp do poszczególnych interesujących nas elementów:
    - adresu zmiennej
    - danych
    Taki pojedynczy rekord opisujący zmienną uzyskałem dzięki stworzeniu "potworka":
    Code: c
    Log in, to see the code
    Jest to unia zawierająca w swoim wnętrzu kilka struktur. Takie podejście pozwoliło na bezproblemowy dostęp do danych na kilka sposobów. Zawartość unii wymuszona jest przez kształt ramki przesyłanych do wyświetlacza danych. W obecnym kształcie uniemożliwia to wymianę z wyświetlaczem danych 32 bitowych, ale zrezygnowałem z tej możliwości świadomie, uznając ją za zbędną dla mnie.

    Plik DGUS_UART_Config.h

    W pliku tym znajdziemy szereg parametrów konfiguracyjnych biblioteki. Są to:
    Code: c
    Log in, to see the code

    Dołożyłem starań, żeby inicjalizacja UART dla procesorów z dwoma UARTAMI była poprawna, jednak gdyby ktoś znalazł tu jakiś błąd to proszę dać znać.

    Piszemy program! :)
    Do pliku main includujemy plik DGUS.h. Przed główną pętlą programu wywołujemy funkcję inicjalizacji UART przypisanego dla naszego panelu.

    Code: c
    Log in, to see the code


    Następnie podajemy adresy zmiennych jakie użyliśmy w panelu:
    Code: c
    Log in, to see the code

    W moim przypadku adresacja jest ciągła (co 2 bajty - wynika to ze specyfikacji pamięci zmiennych panelu), ale zrobiłem tak tylko i wyłącznie dla własnej wygody. Adresacja nie musi być ciągła.
    Teraz możemu już przystąpić do wymiany danych z panelem. Służą do tego 2 funkcje, które należy umieścić w głównej pętli programu:
    Code: c
    Log in, to see the code


    Pierwsza z nich odpowiedzialna jest za przetworzenie odebranych z wyświetlacza danych. Zawiera w sobie mechanizm timeoutu na wypadek zaistnienia błędów w transmisji z wyświetlacza do systemu mikroprocesorowego.

    Zadaniem drugiej jest zapisanie naszych zmiennych do panelu. Można by to wszystko zapisać razem w jednej funkcji, ale ze względu na specyficzne zastosowanie jakie miały u mnie ostatnio te funkcje postanowiłem, że będą one osobno. Obydwie funkcje pobierają jako argument wskaźnik na timer programowy (o timerach programowych możesz poczytać tutaj). Jak we wszystkich moich kodach, także i tutaj przyjęta została rozdzielczość timerów programowych wynosząca 10ms.

    Jak widać powyżej potrzebujemy dwóch niezależnych timerów programowych.

    Napisałem wcześniej, że uP wysyła do panelu jedynie te zmienne których wartość uległa zmianie od ostatniej wysyłki. Jest to jak najbardziej prawdą. Jednak funkcja ta ma pewną "furtkę" w postac przesłania o panelu pełnej listy zmiennych co określony czas. Wyobraźmy sobie sytuację,w której wyłączyliśmy zasilanie panelu bez wyłączania zasilanai systemu mikroprocesorowego. Nasz system wysyła sobie dane do panelu (a raczej nie wysyła jeżeli nie uległy zmianie). Jednak skąd u licha ma on wiedzieć, że panel został zrestartowany? Owszem można to rozwiązać odczytując statusy z rejestrów kontrolnych panelu. Jednak jest to dodatkowy nakład kodu, który moim zdaniem jest niepotrzebny. Wprowadziłem zatem prosty mechanizm, który cyklicznie co czas równy 255*CzasAktualizacjiZmiennychDGUS przesyła nam pełną listę zmiennych do panelu. Dzięki temu unikniemy sytuacji jaką opisałem powyżej.


    A teraz dostęp do zmiennych:
    - jako uint16_t
    Code: c
    Log in, to see the code

    - jako uint8_t
    Code: c
    Log in, to see the code

    - jako pojedyncze bity
    Code: c
    Log in, to see the code


    Przestrzegam aby pamiętać, że maksymalny indeks tablicy zmiennych jaki możemy wybrać to IloscZmiennychDGUS-1, w przeciwnym wypadku poślemy nasz program w wieczną otchłań... Należy o tym pamiętać tworząc dowolne pętle indeksujące tablicę zmiennych.

    Zastanawiałem się również nad implementacją mechanizmu odczytu numeru aktualnie wyświetlanego ekranu. Jednak w toku pisania programu zrezygnowałem z takiej możliwości uznając ja za (przynajmniej dla mnie) całkowicie zbędną. Wynika to z faktu, że tworząc wizualizację dokładnie znamy numery poszczególnych plansz i chcąc wyświetlić jakąś na ekranie po prostu podajemy jawnie jej numer. Jeżeli już zaistniałaby konieczność wykonania akcji związanej z przejściem do konkretnej planszy to skupiłbym się raczej na użyciu w wizualizacji opcji przełączenia planszy z wysłaniem jakiegoś numeru który jej przyporządkowujemy. Dzięki temu nie trzeba będzie rozbudowywać kodu po stronie mikrokontrolera - wystarczy jedną z wirtualnych zmiennych wymiany danych przeznaczyć na przechowywanie właśnie tej wspomnianej wartości.

    Przykładowy kod zawiera funkcję main w postaci:
    Code: c
    Log in, to see the code

    Jak widać wszystko jest jasne i przejrzyste. Patrząc na ciało funkcji main od razu wiemy co tak właściwie robimy w programie (bo zdarza się, że czasem sami tego nie wiemy... :) hehe).

    Praca z pacjentem...
    Na mojej stronie zamieściłem gotowy, sprawdzony, działający przykład użycia biblioteki, oraz prostą wizualizację współpracującą z tym przykładem. W katalogu PROJEKT_DGUS znajduje się przykładowy projekt dla panelu DGUS o przekątnej 4,3". Projekt można otworzyć do edycji przy pomocy DGUS_SDK dostępnego na www.whiteelectronics.pl lub też użyć już przygotowanej wizualizacji. W tym celu należy przygotować kartę microSD o pojemności NIE WIĘKSZEJ niż 2GB, sformatować ją w systemie plików Fat32 a następnie skopiować na nią cały katalog DWIN_SET. Po włożeniu karty do wyświetlacza powinien on samoczynnie załadować jej zawartość. Jeżeli to nie nastąpi to należy wyłączyć i włączyć zasilanie wyświetlacza. Po wczytaniu wizualizacji kartę można trwale usunąć ze slotu, inaczej przy każdym restarcie wizualizacja będzie na nowo wczytywana.
    Istnieje również możliwość wgrywania wizualizacji i parametrów konfiguracyjnych do panelu bezpośrednio z poziomu środowiska DGUS_SDK - wtedy karta nie jest nam wcale potrzebna.

    Cool? Ranking DIY
    About Author
    tehaceole

    Level 28  
    Offline 

    www.stsystem.pl
    tehaceole wrote 1224 posts with rating 194, helped 102 times. Live in city Koszalin. Been with us since 2004 year.
  • #3
    tehaceole

    Level 28  
    Cieszę się, że mogłem w jakiś sposób pomóc.:) Bascoma liznąłem kiedyś dawno, gdy przysiadałem się z AT89C2051 (ASM) na AVR. Niestety porzuciłem tę ścieżkę rozwoju na korzyść C. Ale na Elektrodzie jest dużo osób piszących w Bascomie, więc może ktoś pokusi się o skrobnięcie libki. Ja w tej chwili w miarę możliwości czasowych chcę opracować bibliotekę dla PLC programowanych ze środowiska Codesys. Ale prawdziwą bombę odnośnie tych wyświetlaczy szykuje Kolega Bieli. Nie będę zdradzać szczegółów, ale możliwe że już w marcu opublikuje on swoje dzieło. A zatrzęsie ono dość mocno rynkiem.
  • #5
    tehaceole

    Level 28  
    Hmm... W aktualnych aplikacjach nie korzystałem z tego, więc nie potrafię powiedzieć jak to działa (czy to działa). Na pewno działa bez zarzutu ustawianie daty / czasu w panelu z poziomu uP, ale to nie jest ujęte w bibliotece przedstawionej tutaj - dopisałem to później wraz z kilkoma "fjuczersami".

    W wolnej chwili to sprawdzę.Jednak jeżeli chodzi Ci o "wygaszacz ekranu" to zawsze możesz utworzyć jakiś obrazek o ciemnej kolorystyce ustawiony jako tło konkretnego ekranu a ekran z kolei wywoływać z poziomu uP np. po zadanym czasie bezczynności użytkownika. Na tym ekranie natomiast ustawiasz przezroczystą maskę przycisku tak, że po dotknięciu dowolnego miejsca ekranu panel przełączy się np. na menu itp.
  • #6
    avatar
    Level 36  
    Idee jak to obejść mam - teraz pytanie czy może ja czegoś nie wyklikuje czy to błąd w opisie od producenta czy felerny egzemplarz. Zauważyłem też że środowisko SDK nie obsługuje plików ikon ICO (tych widzianych z poziomu PC) Niby coś się ładuje a w rzeczywistości na LCD grafika nie działa ...
  • #7
    tehaceole

    Level 28  
    Pliki ICO są obsługiwane na 100% bo sam z nich korzystam. Należy tylko przestrzegać 2 zasad:
    1) zaczynamy numerację i nazewnictwo tak jak podaje instrukcja
    2) instrukcja chyba nie wspomina, albo wspomina drobnym druczkiem o tym, że numeracja kolejnego pliku ikony ma ścisłe powiązanie z rozmiarem pliku wcześniejszego. Chodzi o to, że panel ma ładuje np. 1MB ikony do 4 kolejnych komórek swojej pamięci. Dlatego jeżeli nadasz ikonie numer powiedzmy 80, a ma ona rozmiar 1MB to kolejną ikonę musisz zapisać z numerem 84. W przeciwnym przypadku na ekranie zobaczysz krzaki. Zasada jest taka: rozmiar ikony dzielisz przez 256 i otrzymana wartość jest offsetem dla numeru następnej ikony.

    Skontaktuj się z dystrybutorem. On bardzo dba o należytą pomoc techniczną dla swoich klientów.
  • #8
    avatar
    Level 36  
    Napewno ?
    Przerabiałem różne wersje i nawet 1 ikona z ICO nie chciała mi zatrybić (środkowisko SDK Degus V50) ta sama ikona w PNG już tak na tych samych ustawieniach
    Numer ICO zaczynający się zgodnie z numeracją tj 23 24 po 1 obrazie w ikonie
    Pliki pobrane z darmowej biblioteki z interentu "open_icon_library-standard"
    W przykładzie podanym przez producenta też np suwak jest bitmapą
  • #9
    tehaceole

    Level 28  
    Kolego zapewniam Cię, że to działa :) W załączniku masz prosty przykładowy projekt z kilkoma różnymi ikonami. Tutaj do ich przełączania użyłem wewnętrznego timera panelu - dlatego są zadeklarowane jako animation icon. Zwróć uwagę, że niektóre przemiatane są szybciej, inne wolniej. Te wolniejsze były tworzone specjalnie z myślą o współpracy z timerem panelu. Dlatego w pojedynczym pliku ikony obrazek jednej klatki jest powtórzony parokrotnie. Te wyświetlane szybko były tworzone z myślą o współpracy ze zmiennymi zadawanymi od strony mikrokontrolera (tu tylko jako przykład dla Ciebie wrzuciłem je jako animation icon). Ze względu na to, że obowiązuje mnie umowa handlowa narzucająca pewne ograniczenia nie mogę tu umieścić tego projektu w całości. A szkoda bo byłoby to najlepszą prezentacją możliwości. :)

    Jeszcze uwaga techniczna: najbezpieczniej jest stosować dla panelu bitmapy. Robiłem testy z innymi formatami, ale jedynie z BMP nie było nigdy żadnego problemu. Należy jedynie pamiętać o poprawnej "adresacji" poszczególnych elementów (tła, ikony itp.) podczas nadawania im przedrostkowego numeru. To właśnie numer jaki nadamy odpowiada za to w jakie miejsce pamięci panelu trafi nasz element. I jeżeli nadamy numery tak, że obszary będą na siebie zachodzić to zrobi nam się kaszana przy wyświetlaniu.

    Myślę, że poniższy film rozwieje Twoje wątpliwości co do działania ikon:



    Uprzedzam, że w tym przykładzie specjalnie usunąłem wszelkie inne elementy graficzne odpowiedzialne np. za dodatkowe tło dla niektórych ikon. Stąd można odnieść wrażenie, że część ikon jest wyświetlana niezbyt ładnie. Zapewniam, że we właściwym projekcie wszystko prezentuje się graficznie bardzo dobrze (ikony z odpowiednim tłem we właściwych dla siebie miejscach).

    Gdybyś nadal miał problemy to podeślij mi na PW swój projekt. Postaram się pomóc.
  • #11
    tehaceole

    Level 28  
    nouki podpytaj Kolegę Bieli bo on te panele dystrybuuje i ma je w małym paluszku. Nie sprawdzałem tego, ale wydaje mi się, że bateria którą można umieścić na płycie panelu służy tylko do podtrzymania zegara RTC. Swoją drogą w aktualnym projekcie zadaję sygnał zegara z uP. Po starcie panelu i uP procek wysyła datę/czas do panelu. A w panelu używam gotowych komponentów do obsługi jego RTC. Jedynie co 60 minut (chyba - musiałbym zerknąć w kod) przesyłam datę /czas do panelu bo z doświadczenia z nawet dużo bardziej zaawansowanymi panelami i sterownikami niż te zabaweczki wiem, że czas potrafi się rozjechać (co prawda widać to dopiero po kilku, kilkunastu dniach, ale jednak).

    A tak z ciekawości: czemu chcesz mieć to tak zrobione?

    Jak będę miał trochę czasu to postaram się wrzucić tu aktualny kod biblioteki bo od czasu jej prezentacji znacząco sie rozrosła. Po prostu w miarę potrzeb dopisuję nowe funkcjonalności. Problem tylko się robi taki, że musiałbym bieżący projekt dla panelu przerobić pod kątem możliwości jego pokazania bez obawy narażenia się na nieprzyjemności ze strony zleceniodawcy.
  • #12
    nouki
    Level 25  
    Witam.

    Wprowadzam nastawy np.
    - temp dla 4 miejsc.
    - ciśnienie progów
    - dane jakieś tam

    Zmieniając program w procesorku ( a pewnie zapomnę by nie czyścić pamięci podczas programowania) tracę nastawy .
    A w przypadku jaki podaje mam je w panelu więc program zaczytuje je sobie z niego jakie były ostatnio po uruchomieniu.
    Dodatkowo mogę podczas projektu w panelu wstępnie już określić co i jak bez konieczności uruchamiania części wykonawczej.
    Zaoszczędzam czas dla procesora na zapisy jak i miejsce w nim.

    Kolegi pytałem już ale jeszcze nie testował osobiście. A dość słabo jest to opisane..

    Pozdrawiam