Znacie Elbox Laboratorium Informatyki? Poznajcie język G!
22.06.2015 | aktual.: 22.06.2015 09:37
Niektórzy z Was mogą pamiętać zajęcia Informatyki w szkole podstawowej lub gimnazjum, na których uczyło się obsługi języka Logo w programach Logomocja lub Logo Komeniusz. Sterowało się tak zwanym żółwiem, który wykonywał nasze komendy i rysował na ekranie różne obiekty - zazwyczaj to co chcieliśmy ;) Było to jedno z pierwszych środowisk programistycznych, jakie poznawało się w szkole.
Kolejnym programem powiązanym z programowaniem, a którego również poznawało się w szkole, był Elbox Laboratorium Informatyki. Służył on jako pomoc naukowa w szkołach przy nauce Algorytmów i obsługi komputera. W programie mieliśmy dostępnych kilkanaście różnych bloczków, które spełniały różne role. Mieliśmy bloczki początku i końca algorytmu, linie łączące bloczki, bloczki wykonywania obliczeń lub funkcji, bloczki sprawdzania warunku, bloczki od wprowadzania i wyprowadzania danych (i lokalnych i globalnych). ELI oferował nam nie tylko tworzenie prostych algorytmów, ale również budowę programów z wykorzystaniem wbudowanego żółwia, zewnętrznych interfejsów (jak np. pomiar natężenia światła), tzw. "taśm", czyli prostych rejestrów danych czy tablic przechowujących dane. Te wszystkie mechanizmy pozwalały nam na zbudowanie bardzo rozbudowanych algorytmów, które mogły wykonać praktycznie dowolne zadanie. Sterowanie sygnalizacją świetlną, rysowanie grafik za pomocą żółwia, tworzenie wykresów i tabel czy stworzenie gry logicznej - to wszystko było możliwe do zrobienia za pomocą ELI. A przy okazji, można było się bawić i uczyć.
Ale to, co chcę Wam dzisiaj przedstawić, to język G. Jest to graficzny język programowania wykorzystywany w oprogramowaniu LabVIEW stworzony przez firmę National Instruments (w skrócie NI). NI jest producentem urządzeń, kart pomiarowych i systemów akwizycji danych, które stosuje się właśnie do kontrolowania różnych urządzeń, zbierania danych z tych urządzeń i systemów oraz akwizycji zebranych danych i ich analizy. Flagowym produktem firmy jest oczywiście oprogramowanie LabVIEW, a drugim z kolei (również tak samo ciekawym) jest LabWindows/CVI, którego przedstawię innym razem.
Czym jest LabVIEW?
Z Wikipedii możemy dowiedzieć się, że LabVIEW (akronim nazwy ang. Laboratory Virtual Instrument Engineering Workbench) powstało w 1986 roku jako rozwiązanie dla wszystkich osób, które nie były programistami, a potrzebowały programu do obsługi ich problemu. Dzięki temu, każdy naukowca, inżynier czy jakikolwiek inny badacz, mógł stworzyć potrzebną sobie aplikację, która np. zbierała dane z jego urządzeń, analizowała te dane i wyświetlała np. w postaci wykresów. Takie aplikacje oczywiście mogły być interaktywne, więc nie było problemu, by w określonych warunkach aplikacja podejmowała jakieś decyzje np. w przypadku przekroczenia dozwolonej temperatury mogła wyłączyć urządzenie lub włączyć dodatkowe wentylatory.
Z naszej internetowej encyklopedii dowiemy się również, że LabVIEW jest często wykorzystywane w ośrodkach badawczych takich jak CERN czy NASA i wszędzie tam, gdzie wykonuje się jakieś pomiary i analizuje się zebrane dane.
Pierwsza wersja aplikacji, wydana w 1986 roku, była dostępna jedynie na komputery Macintosh, dopiero 6 lat później pojawiły się na rynku wersje dla systemów Sun oraz Windows. Od następnego roku środowisko było już rozwijane równocześnie dla wszystkich platform, a obecnie dostępne jest na systemy Windows, Unix, Linux oraz Mac OS i to w wersjach 32 i 64 bitowych.
W języku graficznym G do tworzenia programów wykorzystuje się różne ikonki, które symbolizują realizowane przez nie funkcje. Takie bloczki następnie łączymy ze sobą "nitkami", które determinują przepływ danych pomiędzy wszystkimi obiektami jakie umieścimy na planszy.
Interfejs graficzny programu tworzymy poprzez umieszczanie na pustej planszy, różnych elementów graficznych, jak np. suwaki, pola tekstowe, wykresy, gałki, pokrętła, przyciski, diody LED i wiele wiele innych. Środowisko posiada bardzo rozbudowaną bazę elementów interfejsu graficznego. LabVIEW udostępnia również ponad 400 różnych funkcji matematycznych, funkcje do przedstawiania danych. itd.
Hello World
Na początek, jak wygląda interfejs graficzny środowiska. Program składa się z dwóch okien, pierwsze, o nazwie "Front Panel", jest oknem, w którym tworzymy interfejs graficzny naszego programu. Możemy tam umieszczać wszelkiego rodzaju kontrolki, wykresy, grafiki, miejsca na wprowadzanie danych, jak i miejsca z wynikami z programu. To jedno okno pozwala nam zdefiniować cały interfejs aplikacji. Drugim oknem środowiska jest "Block Diagram", czyli nasz "kod źródłowy" aplikacji. Tam pojawiają się nam wszystkie elementy naszego interfejsu w postaci ikonek o podobnej wielkości, dzięki czemu łatwo możemy je łączyć z innymi elementami aplikacji, np. pole tekstowe, w którym będziemy wprowadzać dane, możemy połączyć z funkcją konwertującą tekst na liczbę, która następnie przekaże wynik do jakiejś funkcji matematycznej lub np. do elementu graficznego przedstawiającego zbiornik. W ten sposób tworzymy kod programu, który ma się wykonać po każdym uruchomieniu.
Napisanie najprostszej wersji "Hello World", to tak naprawdę umieszczenie jednego obiektu w oknie Front Panel, a w oknie Block Diagram, dodanie stałej, która przekaże wartość do wcześniej dodanego obiektu.
Chciałem Wam również pokazać trochę bardziej rozbudowaną wersję Hello World, w której napis wyświetlany jest poprzez migające diody LED. Niestety blog nie dopuszcza gifów, dlatego pod tym linkiem możecie zobaczyć jak to działa (niestety, ale program w darmowej wersji nagrywał z małą ilością FPS). Natomiast "kod" odpowiedzialny za działanie tego programu przedstawiam już w grafice poniżej.
Jak widać na załączonym obrazku, kod nie jest wcale jakiś skomplikowany, ale już tłumaczę, co tam mamy i co to wszystko robi. Szara ramka, która znajduje się w około wszystkich elementów i która posiada w prawym dolnym roku strzałkę, to pętla while. Wszystko co znajdzie się w środku tej ramki, znajduje się w pętli while. Po prawej stronie tej ramki mamy przycisk "stop", który jest podłączony do małego kwadracika z czerwoną kropką w środku. Ta ikonka z czerwoną kropką to warunek pętli while. Do wyboru mamy dostępne dwa warunki pętli while:
- czerwona kropka - czyli "stop if true" - jeżeli do czerwonej kropki podamy wartość true, to pętla zostanie przerwana.
- zielona zaokrąglona strzałeczka - czyli "continue if true" - jeżeli do ikonki przestaniemy podawać wartość true, to pętla zostanie przerwana.
Natomiast po lewej stronie mamy kilka niebieskich elementów, jakiś kwadracik i trójkąt. Niebieskie elementy to stałe, a ich kolor oznacza typ zmiennej. Niebieski oznacza liczby całkowite, pomarańczowy oznacza liczby zmiennoprzecinkowe, różowy oznacza ciągi tekstowe, a zielony wartości logiczne. Występują jeszcze inne kolory odpowiadające innym typom, ale ich na razie nie będę opisywał.
I tak wracając do tematu, po lewej stronie mamy trzy wartości całkowite, z czego jedna jest własnością pętli while. Tym elementem należącym do pętli jest zmienna "i", która przy każdym przebiegu pętli jest zwiększana o 1. Wartości "1" i "2" dodałem ręcznie, tak samo, jak kwadrat i trójkąt, które są funkcjami. Kwadrat to funkcja dzielenia z resztą. Po lewej stronie bloku znajdują się wejścia, pod które podłączona jest zmienna "i" i wartość "2", a po prawej stronie znajdują się dwa wyjścia funkcji, przy czym tylko jedno jest w tej chwili podłączone. Literka R znajdująca się przy pierwszym wyjściu oznacza resztę z dzielenia, a IQ oznacza wynik dzielenia. W moim programie chciałem, by diody naprzemiennie zapalały i gasiły się, więc potrzebuję tylko reszty z dzielenia przez 2, która daje wynik 0 lub 1. Następnie porównuję tę resztę z dzielenia z liczbą 1, co daje mi wynik true lub false.
Kolejnym elementem na planszy jest ramka w kształcie filmu do aparatu fotograficznego, która nazywa się "Flat Sequence Structure". Element ten pozwala nam zbudować strukturę sekwencji do wykonania przez program, najpierw wykonuje się pierwsza część "filmu" z lewej strony i później kolejne bloki, aż do ostatniego. W każdym z tych bloków widzimy ikonki podpisane jako Boolean. Są to nasze diody LED umieczone na Front Panelu. Ich nazwa pochodzi od typu zmiennej jaka je obsługuje, a z racji, że światło może być tylko zapalone lub zgaszone, to typem obsługującym ten element jest typ logiczny, czyli Boolean.
Jak widzimy na rysunku, jeden sygnał może być źródłem dla wielu elementów i nie ma z tym żadnych problemów. Na zrzucie pozostał jeszcze jeden element w 5 sztukach. Time Delay, to jak sama nazwa mówi, odstęp czasowy. Blok ten wymusza odczekanie zadanego czasu zanim przejdziemy do kolejnego bloku. Dzięki temu mogłem zrealizować poszczególne uruchamianie literek w programie.
Czytelność kodu
Czas pokazać, co może pójść nie tak w tym środowisku. Jednym z problemów języka G jest zachowanie czytelności kodu. Jeżeli nie będziemy dbali o naszą aplikację od samego początku, to możemy źle na tym skończyć. Programy lubią być modyfikowane, ulepszane czy rozbudowywane. Dokładanie kolejnych funkcji do już istniejącego bałaganu, nie spowoduje nagle, że kod stanie się czytelniejszy. I niestety wszystkie osoby tworzące programy w LabVIEW muszą być świadome tego, że im bardziej będą dbali o czytelność swojego kodu, tym lepiej będzie się go edytowało w przyszłości. A już na pewno ułatwi to zadanie nowym osobom, które nie są wtajemniczone w projekt. W sumie te zdania tyczą się każdego języka, tak jak się mówi, by nazwy zmiennych były logicznymi nazwami, które oznaczają coś sensownego, by kod był odpowiednio wyrównany i wcięty itp., tak w G jest to jeszcze bardziej istotne. No bo kto chciałby edytować program z kodem jak z rysunku poniżej?
A uwierzcie mi, takich aplikacji jest dużo więcej:
Na szczęście, jest na to rozwiązanie. LabVIEW umożliwia wykorzystywanie wcześniej stworzonych aplikacji jako podprogramów. Dzięki temu możemy jedną dużą aplikację podzielić na kilka mniejszych i pracować nad nimi osobno. Następnie w głównym projekcie włączamy wszystkie podprogramy i łączymy je w jedną całość. Takie podprogramy zyskują ikonkę podobną do wszystkich elementów, posiada ona wejścia i wyjścia i można ją łączyć z innymi blokami do współpracy.
Podsumowanie
Znów chciałem napisać krótki wstęp do bardzo ciekawego języka, ale chyba nie da się tego zrobić w postaci kilku krótkich akapitów z kilkoma zdjęciami i tyle. Język jest bardzo bogaty, umożliwia tworzenie wielu ciekawych aplikacji pomiarowych i jest bardzo przydatny właśnie w środowiskach naukowych i przemysłowych przy zbieraniu danych i ich analizie. Z chęcią przedstawię Wam ten język w kolejnych wpisach bardziej szczegółowo, ale już może bardziej na zasadzie kursu niżeli takiego wpisu jak ten. Oczywiście ponownie jestem świadom tego, że wpis nie jest napisany jakimś super językiem do czytania, tego niestety muszę się dopiero nauczyć. Mam jednak nadzieję, że wpis ten zainteresuje chociaż kilka osób, a może ktoś zna firmę NI i korzysta z ich produktów i oprogramowania? Czekam na wszelkie komentarze (te negatywne również ;))
PS. A poniżej dwa przykłady, ładnych graficznie aplikacji, których zadaniem jest sterowanie kilkoma urządzeniami, zbieraniem danych z tych urządzeń i prezentacją ich w różny sposób.