Lab. 3 Tablice, struktura warunkowa 1 Wprowadzenie Marzena M. Tefelska, Filip A. Sala 1.1 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: 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). 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
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łanie tego narzędzia można również nacisnąć Ctrl i klawisz strzałki w dół. 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. 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. 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. 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 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 Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 3
else wykonaj przypadek domyślny 1.5 Tablice Rysunek 4: Struktura Case 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: 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). Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 4
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). 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: Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 5
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). 1.6 Tunelowanie Rysunek 10: 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 do pętli są tylko przy pierwszym zliczaniu, natomiast dane odbierane z pętli po ostatnim zliczaniu. 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. 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. Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 6
1.8 Konwersja tekstu na liczby W celu konwersji liczby do ciągu znaków należy wybrać funkcję Programming String Number String 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. 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 z funkcją Concatenate Strings Function. Funkcja ta 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. 2 Zadania do wykonania 1. Usuń wszystkie błędy występujące w aplikacji Obsługa błędów (1 pkt.) 2. Napisz VI Dataflow zgodnie z rysunkiem 12. Sprawdź kolejność wykonywania operacji korzystając z Highlight Execution oraz z Single Stepping. Sprawdź wartość zwróconą przez funkcję random za pomocą narzędzia Probe. (1 pkt.) 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 a b. Wynik powinien być wyświetlony w postaci np: a+b = 5. W przypadku dzielenia przez zero w polu wynik powinien zostać wyświetlony stosowny komunikat. (2 pkt.) 5. (dodatkowe) Napisz podobny program wykonujący obliczenia na wektorach 3 elementowych (dodawanie, odejmowanie, iloczyn wektorowy). Wykorzystaj operacje na tablicach, zamiast kontrolki Enum, użyj Ring Control. (4 pkt.) Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 7
Rysunek 12: Przepływ danych (Data Flow) Rysunek 13: Panel przedni (Front Panel) Wydział Fizyki, Politechnika Warszawska - Podstawy Projektowania Przyrządów Wirtualnych 8