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