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