Lab. 2 Tablice, struktura warunkowa
Transkrypt
Lab. 2 Tablice, struktura warunkowa
Lab. 2 Tablice, struktura warunkowa (wersja 0.4) Marzena M. Tefelska, Filip A. Sala 1 1.1 Wprowadzenie Sposób wyszukiwania i usuwania błędów Jeżeli na diagramie blokowym pojawi się przerywana linia z czerwonymi przekreśleniami (rys. 1) to oznacza, że w kodzie znajdują się błędy i w takiej postaci program nie zostanie skompilowany. Informuje o tym również szara złamana strzałka (rys. 2a). Po jej naciśnięciu automatycznie otworzy się okno z listą błędów (rys. 1). Okno obsługi błędów można również przywołać za pomocą skrótu Ctrl + L lub poprzez panel górny View ⇒ Error list. Dwukrotne kliknięcie lewym przyciskiem myszy na każdym wierszu listy błędów (lub naciśnięcie przycisku Show Error) przenosi do obszaru diagramu, który należy poprawić. Dopiero po prawidłowym połączeniu wszystkich terminali program może zostać uruchomiony, co sygnalizuje „cała” strzałka (rys. 2b) na panelu uruchomienia. Rysunek 1: Błędne połączenie danych (po lewej) oraz okno listy błędów (po prawej). Błędne połączenia można usunąć wywołując opcje Edit ⇒ Remove Bad Wires. Przydatne skróty klawiszowe: Ctrl+B – usunięcie wszystkich źle podłączonych linii danych Ctrl+H – pokazanie pomocy kontekstowej (ważne) Ctrl+E – przełączanie pomiędzy oknami płyty czołowej i diagramu Ctrl+Z – cofnięcie ostatnio wykonywanych operacji Ctrl+? – przełączenie okna w tryb pełnoekranowy Ważne: Gdy nie wiemy jak dana funkcja działa należy uruchomić okno pomocy kontekstowej poprzez menu Help ⇒ Show Context Help lub za pomocą skrótu klawiszowego Ctr+H. Po najechaniu kursorem myszy na funkcję, która nas interesuje, w oknie pomocy pojawi się krótki opis jej działania. 1.2 Odpluskwianie (ang. Debugging ) Debugowanie (odpluskwianie) programu jest to systematyczne redukowanie błędów w programie. Przyciski na górnym panelu diagramu blokowego (rys. 2c) odpowiadają za sekwencyjne uruchamianie kodu. Poniżej omówione zostaną podstawowe funkcje służące do debugowania: Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 1 Rysunek 2: Wykaz ważnych ikon Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 2 • Retain wire values (rys. 2d) - opcja powodująca zapamiętanie wartości zmiennych na każdym połączeniu, dzięki temu można później obejrzeć te wartości debugując program przy użyciu sondy (ang. probe). • Start Into (rys. 2e) - umożliwia wykonanie programu krok po kroku (od węzła do węzła) za każdym razem zatrzymując działanie programu. W przypadku struktury bądź subVI wykonuje krok po kroku wewnętrzne funkcje. Każdy węzeł miga w momencie kiedy jest gotowy do wykonania. W celu wywołania tego narzędzia można również nacisnąć Ctrl i klawisz strzałki w dół (Ctrl+↓). • Start Over (rys. 2f) - Podobnie jak Step Into z tą różnicą, że wykonuje całą strukturę, subVI na raz bez wnikania do funkcji wewnętrznych. W celu wywołania narzędzia można nacisnąć Ctrl i klawisz strzałki w prawo (Ctrl+→). • Step Out (rys. 2g) - kończy wykonywanie bieżącego węzła programu i zatrzymuje się. Kiedy program kończy się wykonywać przycisk Step Out jest nieaktywny. W celu wywołania narzędzia można nacisnąć Ctrl i klawisz strzałki w górę (Ctrl+↑). • Zastosowanie narzędzia Breakpoint (rys. 2h) umożliwia zaznaczenie na diagramie punktów, w których program się zatrzyma. Program zatrzymuje się po dotarciu do Breakpointa i czeka na działanie użytkownika. • Gdy wciśnięty jest przycisk żarówki (świeci się) to podczas wykonania programu wizualizowany jest przepływ danych w kodzie. Pokazywana jest kolejność wykonywane poszczególnych fragmentów kodu (rys. 2i). • Narzędzie Probe data (rys. 2j) jest to sonda, która mierzy i wyświetla aktualne dane/wartości z danej sekwencji działającego programu. Sonda znajduje się w palecie narzędzi, którą można otworzyć z menu głównego View ⇒ Tools palette. 1.3 Pętla While (ang. While Loop) Pętla While znajduje się w Functions ⇒ Structures. Pętla ta powtarza działanie programu – subdiagramu znajdującego się wewnątrz pętli do momentu spełnienia warunku końca pętli. O warunku końca pętli decyduje ikona w prawym dolnym rogu. Na rysunku 3 przedstawiono dwa różne warunki końca pętli. Warunek ten sprawdzany jest tuż po wykonaniu pętli. Można zmienić jego zachowanie klikając prawym przyciskiem myszy na ikonce i wybierając Stop if True lub Continue if True. Niebieska litera „i” jest licznikiem iteracji, jej wartość zawsze zaczyna się od zera. Rysunek 3: Przykład dwóch warunków końca pętli. Pętla po lewej wykonywana będzie do momentu, gdy na kontrolce warunku końca pętli (w prawym dolnym rogu) pojawi się stan TRUE. W przypadku pętli po prawej, będzie ona wykonana tak długo jak na kontrolce będzie panował stan TRUE. 1.4 Struktura Case (ang. Case Structure) W celu dodania struktury case należy z palety funkcji Functions wybrać Programming, a następnie Structure. Case Structure jest to struktura decyzyjna - wyboru. Funkcjonalnie odpowiada ona instrukcji „if. . . then. . . else” i „switch” znanej z języka C. Case Structure posiada minimum dwie ramki. Na podstawie wartości zmiennej umożliwia wybranie i wykonanie właściwego fragmentu programu. Akceptuje zmienne logiczne, numeryczne i tekstowe oraz specjalną zmienną informującą o błędzie. Ma postać nakładających się na siebie ramek (które przyjmują wartość TRUE lub FALSE). W każdej z nich umieszcza się kod odpowiadający danemu przypadkowi. Ramki wykonywane są w zależności od stanu wejścia wyboru/selekcyjnego Case Selektor (zielony znak Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 3 zapytania). Case Selektor jest wartością używaną do określenia, które zadanie z pętli należy wykonać i jest równoważny przedstawionemu poniżej pseudokodowi: Gdzie „Case selector” ma wartości A,B,C, a X to zmienna if(X == A) wykonaj przypadek dla A if(X == B) wykonaj przypadek dla B if(X == C) wykonaj przypadek dla C else wykonaj przypadek domyślny Rysunek 4: Struktura Case 1.5 Tablice Tablica jest złożoną strukturą danych i składa się z elementów tego samego typu i wymiarów. Elementami są uporządkowane dane lub wartości zawarte w tablicy, gdzie każdy element w tablicy ma odpowiednią wartość indeksu. Odwołując się do indeksu można uzyskać dostęp do konkretnego elementu tablicy. W Labview indeksowanie tablicy zaczyna się od zera. Oznacza to, że jednowymiarowa (1D) tablica zawiera n elementów, natomiast zakres indeksu wynosi od 0 do n-1, gdzie indeks 0 oznacza pierwszy element, a indeks n-1 ostatni element tablicy. Tablica może przechowywać kontrolki i wskaźniki, ale nie jednocześnie, czyli musi przechowywać zmienne jednego typu. Wymiar tablicy stanowi długość, wysokość lub głębokość. Aby utworzyć jednowymiarową (1D) tablicę w LabVIEW, należy umieścić ikonę tablicy na przednim panelu (rys. 5), a następnie wewnątrz tablicy umieścić element np. numeryczny, logiczny lub wskaźnik (rys. 6). Rysunek 5: Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 4 Rysunek 6: Następnie należy umieścić kursor myszy na tablicy i przeciągnąć go w prawą stronę aby rozwinąć i wyświetlić wiele elementów (rys. 7). Rysunek 7: Tablica dwuwymiarowa (2D) przechowuje elementy w siatce lub macierzy. Każdy element w dwuwymiarowej tablicy ma dwa odpowiadające wartości indeksu: indeks wiersza i indeks kolumny. Tak samo jak dla tablicy 1D, indeksowanie wiersza i kolumny zaczyna się od zera. Abu utworzyć tablicę 2D najpierw należy utworzyć tablicę 1D, a następnie dodać do niej wymiar. Na utworzonej poprzednio tablicy 1D na wyświetlaczu indeksu należy kliknąć prawym przyciskiem myszy i wybrać opcję Add Dimension - Dodaj wymiar (rys. 8). Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 5 Rysunek 8: Następnie należy złapać róg tablicy i przeciągnąć w celu wyświetlenia wielu wierszy i kolumn (rys. 9). Rysunek 9: Jak widać wartości w tablicy mają szary kolor co oznacza, że elementy są niezainicjowane. Aby zainicjować element należy kliknąć wewnątrz elementu i wpisać wartość (rys. 10). Rysunek 10: 1.6 Tunelowanie Tuneli używamy do wprowadzania i wyprowadzania danych z wnętrza struktury pętli. Jeśli chcemy przesłać dane do naszej pętli, musimy zbudować strukturę tuneli. Dane przesyłane są do pętli tylko przy pierwszym zliczeniu, natomiast odbierane są z pętli po ostatnim zliczeniu. Jeśli chcemy zebrać dane do tabeli np. z pętli While Loop należy przetunelować dane poprzez podłączenie tablicy poza pętlą z automatycznym indeksowaniem tunelu (auto-indexed tunnel). Aby włączyć automatyczne indeksowanie należy prawym przyciskiem myszy kliknąć na kwadraciku i wybrać Indexing. Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 6 Rysunek 11: Przykład tunelowania z indeksowaniem. Po lewej stronie brak indeksowania, po prawej Autoindexed tunnel 1.7 Generowanie opóźnień Do generowania opóźnień służy Wait (ikonka zegarka) i Wait until next ms multiple (metronom). Można je znaleźć w Functions ⇒ Programming ⇒ Timing. Opóźnienie (Wait) polega na tym, iż czeka określoną ilość milisekund i zwraca wartość licznika w milisekundach. 1.8 Konwersja liczby na tekst (ciąg znaków) W celu konwersji liczby do ciągu znaków (ang. String) należy wybrać funkcję Programming ⇒ String ⇒ String/Number Conversion ⇒ i wybrać jedną z dostępnych funkcji. W celu konwersji liczby do ciągu znaków w formacie dziesiętnym należy użyć funkcji Number to Decimal String. Uwaga, funkcja ta przed konwersją zamienia liczbę na 64-bitowy typ całkowity. W celu zamiany liczby zmiennoprzecinkowej (rzeczywistej) na ciąg znaków można użyć funkcji Number to F-String. W celu zamiany kilku liczb na ciągi znaków, a następnie połączenia ich w jeden ciąg znaków należy połączyć Number to Decimal String lub Number to F-String z funkcją Concatenate Strings. Funkcja Concatenate skleja ciągi znaków oraz tablice ciągów znaków w jeden ciąg wyjściowy. Gdy na wejściu jest tablica to funkcja ta skleja każdy element tablicy. Funkcja Concatenate domyślnie ma dwa wejścia, jednak można zwiększyć liczbę wejść najeżdżając na dolną/górną krawędź ikony i rozciągając w dół/górę. 2 Zadania do wykonania 1. Usuń wszystkie błędy występujące w aplikacji Obsługa błędów. Sprawdź kolejność wykonywania operacji korzystając z Highlight Execution oraz z Single Stepping (czyli Step Into, Step Over, Step Out) (1 pkt.) 2. Napisz VI Dataflow zgodnie z rysunkiem 12. Sprawdź wartość zwróconą przez funkcję random za pomocą narzędzia Probe. (1 pkt.) Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 7 3. Zbuduj generator liczb, który będzie losować liczby całkowite z przedziału [0, 1000]. Napisz program, który będzie się zatrzymywać automatycznie, w chwili wylosowania liczby zadeklarowanej przed uruchomieniem programu. Program powinien wyświetlać: • aktualnie wylosowaną liczbę, • liczbę losowań, które miały miejsce do chwili zatrzymania VI, • tablicę zawierającą wszystkie liczby wylosowane w czasie, kiedy program był uruchomiony. Aby zaobserwować działanie programu, dodaj do pętli opóźnienie 10ms. (2 pkt.) 4. Napisz program Liczydło. Stwórz frontpanel zgodnie z rysunkiem 13. Program powinien umożliwiać wykonanie dodawania, odejmowania, dzielenia, mnożenia, potęgowania ab . Do wyboru operacji należy użyć kontrolki System Enum z palety Controls ⇒ System ⇒ Ring & Enum. Wynik powinien być wyświetlony w postaci np: a+b = 5. W przypadku dzielenia przez zero w polu wyniku powinien zostać wyświetlony stosowny komunikat. (2 pkt.) 5. (dodatkowe) Napisz podobny program wykonujący obliczenia na wektorach 3 elementowych (dodawanie, odejmowanie, iloczyn wektorowy oraz iloczyn skalarny). Wykorzystaj operacje na tablicach, zamiast kontrolki Enum, użyj kontrolki Ring. (4 pkt.) Rysunek 12: Przepływ danych (Data Flow) Rysunek 13: Panel przedni (Front Panel) Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 8