Lab. Podstawy programowania w języku G (PDF 368 kB)
Transkrypt
Lab. Podstawy programowania w języku G (PDF 368 kB)
Komputerowe systemy pomiarowe – laboratorium Temat: Podstawy programowania w języku G Osoby w grupie: Sprawozdanie wykonał: Data ćwiczenia: Data oddania sprawozdania: Ocena: 1. Celem ćwiczenia było bliższe zapoznanie się z graficznym językiem programowania G, będącym składową środowiska Lab View, z podstawowymi typami danych w języku G, z podstawowymi strukturami programowymi oraz ze sposobem tworzenie podprogramów z reprezentacją graficzną. Z językiem tym mieliśmy już styczność np. podczas oprogramowywania karty pomiarowej NI-6024E. Wówczas stworzono w tym języku aplikację służącą do cyfrowej filtracji sygnału. 2. Zapoznano się ze wstępnymi informacjami o języku G i przystąpiono do realizacji ćwiczenia. W pierwszej kolejności utworzono aplikację z danymi numerycznymi. Jak widać, dostępne są obiekty jednowymiarowe oraz wielowymiarowe (tutaj ograniczono się do maksymalnie 2 wymiarów). Obiekty te mogą przechowywać typy numeryczne stałoliczbowe (widoczne po prawej stronie rysunku) oraz zmiennoprzecinkowe (widoczne po lewej stronie rysunku). Struktura Indicator (oznaczana na rysunkach skrótem Ind) służy do projekcji danych wpisanych do obiektów Numeric Control oraz Array. Rys. 1. Okno aplikacji z danymi numerycznymi Rys. 2. Diagram aplikacji z danymi numerycznymi Linie łączące tablice 2D od linii łączących tablice 3D różnią się szerokością. Po prostu te dwie skrajne kreseczki, będące składowymi linii, są bardziej oddalone od siebie. Można to łatwo zaobserwować na rysunku 3, gdzie przedstawiono grubość linii łączącej zarówno tablice jednowymiarowe, jak też dwu- oraz trójwymiarowe. Jak widać, im większy jest wymiar tablicy, tym kreski tworzące linię łącząca poszczególne obiekty, są coraz bardziej oddalone od siebie. Rys. 3. Tablice i kreski Kolejnym interesującym punktem na drodze poznawania języka G były konstrukcje sterujące. Pierwszą z nich była konstrukcja sterująca Sequence. W celu zbadania jej działania utworzono jej instancję w środowisku Lab View. Na środku górnej krawędzi ramki oznaczającej konstrukcję sterującą Sequence znajduje się informacja zawierająca identyfikator ramki oraz strzałeczki umożliwiające poruszanie się pomiędzy poszczególnymi ramkami, jeżeli jest ich więcej niż 1. W danej chwili widoczna jest jedynie jedna ramka. Identyfikatory ramek są bardzo proste w zrozumieniu. Poszczególne ramki instrukcji sterującej Sequence są indeksowane tak jak kolejne elementy tablicy jednowymiarowej w języku C, czyli począwszy od zera aż do n-1, gdzie n to ilość wszystkich ramek danej instrukcji sterującej Sequence. Zatem pierwsza liczba identyfikatora oznacza numer bieżącej ramki (czyli tej, którą właśnie edytujemy), a liczby w nawiasach kwadratowych informują nas o zakresie indeksowania ramek w obrębie bieżącej instrukcji sterującej Sequence. Pierwsza liczba wewnątrz nawiasu kwadratowego oznacza najmniejszy dostępny indeks, natomiast druga liczba oznacza największy dostępny indeks. Następnie zbudowano zgodnie z instrukcją aplikację wykorzystującą instrukcję sterującą Sequence: (C) 2004 STUDENT.NET.PL :: Wszelkie prawa zastrzeżone Rys. 4. Panel aplikacji Rys. 5. Diagram aplikacji Instrukcja Sequence programu składa się z 3 ramek. W pierwszej ramce do „zmiennej”, która jest oznaczona przez kwadrat ze strzałeczką przylegający do krawędzi obiektu Sequence, wpisywany jest czas (dane z timera) oraz emitowany jest dźwięk. W kolejnej ramce wywoływana jest funkcja opóźnienia z podanym przez użytkownika czasem oczekiwania. Po odczekaniu zadanego czasu aktywowana jest trzecia ramka. W trzeciej ramce pobierany jest czas z timera i wyznaczana jest różnica bieżącego czasu i tego pobranego w pierwszej ramce. Następnie wynik jest wyprowadzany na ekran (dolne okienko na panelu) i emitowany jest sygnał dźwiękowy. Następnie dane fragment kodu napisany w języku C: int a,b,c; double d; a=b+c; d=5*a; zrealizowano przy użyciu Sequence: Jak widać Sequence „wykonuje” kolejno poszczególne ramki, tak jakby to były kolejne linijki kodu programu napisanego np. w C. Wewnątrz obiektu Sequence można deklarować zmienne. Obiektu tego można użyć do wyznaczania wyników operacji, które wymagają sekwencyjnego obliczania poszczególnych składowych. Rys. 6. Obiekt Sequence Kolejną częścią ćwiczenia było zapoznanie się z konstrukcją sterującą Case. Zrealizowano aplikację z przełącznikiem pozwalającą na sumowanie lub odejmowanie argumentów w zależności od położenia przełącznika. Następnie zrealizowano następujący kod języka C w języku G za pomocą struktury Case: switch (random (4)) { case 0 : printf ("1"); break; case 1 : printf ("2"); break; case 2 : printf ("3"); break; case 3 : printf ("4"); break; } Rys. 7. Obiekt Case Zamiast funkcji Random użyto zwykłego pola numerycznego. Natomiast sam program działa dokładnie tak samo, jak napisana wyżej sekwencja w języku C. (C) 2004 STUDENT.NET.PL :: Wszelkie prawa zastrzeżone Kolejną czynnością w ćwiczeniu było zapoznanie się z obiektem Formula Node. Pozwala on na utworzenie struktury mogącej wykonywać np. obliczenia według podanej formuły. Formuła ta może także zawierać instrukcje warunkowe if oraz else. Poniższy kod języka C zrealizowano przy użyciu obiektu Formula Node. double x,y,z; if ((y>=0) && (x>=0)) z =sqrt(x)+sqrt(y); else z = -1; Rys. 8. Obiekt Formula Node Z powodu ogólnego osłabienia zdolności psycho-fizycznych uczestników zajęć laboratoryjnych, spowodowanych nadmiernym zmęczeniem, przeoczono punkt dotyczący zbudowania aplikacji liczącej silnię. Punkt ten został jednak zrealizowany w terminie późniejszym, jako że jest bardzo istotny. Przy użyciu struktur For Loop i While Loop i operatora Shift Register zbudowano aplikację obliczającą silnię. Rys. 9. Obliczanie silni za pomocą struktury For Loop Rys. 10. Obliczanie silni za pomocą struktury While Loop Rys. 11. Wygląd panelu aplikacji Trzeba szczerze przyznać, iż tworzenie tej aplikacji było bardzo interesującym i twórczym procesem. Jednakże warto w tym miejscu uwydatnić, iż taki sposób obliczania silni nie jest optymalny z programistycznego punktu widzenia. Dla przykładu można podać funkcję liczącą silnię zaimplementowaną rekurencyjnie w języku C: (C) 2004 STUDENT.NET.PL :: Wszelkie prawa zastrzeżone int silnia (int arg) { if (arg == 1) return (1); return ( arg * silnia (arg-1)); } Jak widać kod jest zwięzły i pozbawiony nadmiarowości, czego nie można powiedzieć o programach realizujących to samo zadanie w języku G. Kolejnym punktem było utworzenie podprogramu liczącego średnią ważoną. vssdvsvd Rys. 12. Diagram aplikacji Rys. 13. Panel aplikacji Zgodnie z instrukcją zapisano program na dysku i utworzoną własny podprogram (ikonę VI). Stworzono w ten sposób quasi obiekt, który można wykorzystać w każdej kolejnej aplikacji. Korzyści płynące z możliwości zastosowania takiego mechanizmu są niesłychanie istotne, gdyż tak jak w przypadku języka proceduralnego można tworzyć własne funkcje, tak i tu można tworzyć własne struktury (posiadające odpowiednie wyprowadzenia) ułatwiające tworzenie bardziej rozbudowanych aplikacji. 3. Wnioski końcowe. Bez wątpienia język G jest jednym z ciekawszych obiektowych języków programowania. Umożliwia w łatwy sposób tworzenie aplikacji poprzez łączenie odpowiednich obiektów, co pozwala programiście skupić się na meritum opracowywanego zagadnienia. Przejrzysta szata graficzna, łatwe w obsłudze obiekty i przyjemny interfejs graficzny czynią ten język wyjątkowym. (C) 2004 STUDENT.NET.PL :: Wszelkie prawa zastrzeżone