You are on page 1of 35

Instrukcja nr 4 – cwiczenia

Flat Sequence, Type definitions, VI Server, Dobre techniki projektowe

Opracował: Michał Maciejewski


Ćwiczenie 1 – Ćzy Windows XP to RTOS?
Cel: Zweryfikowanie przydatności systemu operacyjnego Windows XP do uruchamiania na
nim aplikacji czasu rzeczywistego.

LabVIEW oferuje funkcje pozwalające odmierzać czas z dokładnością do pojedynczych


milisekund. Należy mieć jednak na uwadze to, że system operacyjny (w tym przypadku Windows
XP) odpowiada za przydział czasu procesora dla każdego z uruchomionych zadań. W ramach
ćwiczenia zostanie stworzony program odmierzający określony interwał czasu, po czym zostanie
obliczony rzeczywisty czas, który upłynął od wywołania funkcji do jej zakończenia. Program
powinien dynamicznie modyfikować kolor wykresu, gdy błąd uzyskanego opóźnienia przekroczy
20%. Dodatkowo, należy zweryfikować na ile można ufać odmierzaniu czasu oraz co wpływa na
pomiar czasu. Pozwoli to odpowiedzieć na pytanie postawione w tytule tego ćwiczenia.

1. Otworzyć LabVIEW 2012 i utworzyć nowy VI. Zapisać go pod dowolną nazwą
(przykładowo XP Benchmark).
2. Stworzyć następujący Panel Czołowy aplikacji, który posłuży do zadawania interwału
czasowego odmierzanego przez program oraz prezentacji uzyskanych wyników.

 Umieścić wykres Waveform Chart. Zmienić jego nazwę na Wykres czas [ms].
Następnie wybrać z jego menu kontekstowego Visible → Caption. Ustawić nazwę
wyświetlaną dla użytkownika (Caption), jako Wykres pomiaru czasu.
2
 Upewnić się, że opcja automatyczne skalowanie osi X jest wyłączona (X Scale →
Autoscale X).
 Oś rzędnych wykresu nazwać Czas [ms], zaś odciętych Ilość iteracji.
 Dodać wskaźnik numeryczny służący do wyświetlania rzeczywistego opóźnienia i
nazwać go (Label) Czas [ms]. Nazwę wyświetlaną tylko na Panelu Czołowym
(Caption) ustawić na Czas wykonywania operacji [ms].
 Umieścić kontrolkę numeryczną, która posłuży do określania ilości pomiarów. Nadać
jej nazwę Ilość pomiarów. Zmienić typ tej zmiennej na całkowitoliczbowy, 32-bitowy
(I32).
 Na zakończenie umieścić na Panelu Czołowym przycisk Stop. Powiększyć jego
rozmiar, aby kliknięcie go było dla użytkownika łatwiejsze. Przypisać mu odpowiedni
tryb pracy – przycisk ten posłuży do awaryjnego zatrzymania pętli głównej.
3. Przejść do okna Diagramu i utworzyć kod służący do obliczania czasu, jaki rzeczywiście
upłynął od rozpoczęcia odliczania ustawionej ilości czasu do jej zakończenia.

 Umieścić w kodzie programu strukturę Flat Sequence Structure (Programming →


Structures).
 W jej wnętrzu umieścić funkcję Tick Count (ms) (Programming → Timing). Jak
wiadomo funkcja ta zwraca zawartość licznika czasu o podstawie 1 milisekundy.
 Dodać z prawej strony kolejną ramkę (ang. frame) struktury Flat Sequence poprzez
kliknięcie prawym przyciskiem myszy na jej prawą krawędź i wybranie z menu
kontekstowego opcji Add Frame After.
 Umieścić w jej wnętrzu funkcję Wait (ms) i przypisać wartość opóźnienia równą 50
milisekund.

3
 Dodać kolejną ramkę, która posłuży do obliczenia opóźnienia, które faktycznie
wystąpiło podczas wykonywania programu. W tym celu kliknąć prawym przyciskiem
myszy na prawą krawędź ramki zawierającej funkcję Wait (ms) i z menu
kontekstowego ponownie wybrać opcję Add Frame After.
 We wnętrzu nowo utworzonej ramki umieścić ponownie funkcję Tick Count (ms),
która zwróci bieżący stan licznika czasu. Następnie obliczyć rzeczywisty czas
wykonywania funkcji Wait (ms), jako różnicę (Subtract) bieżącego stanu licznika i
wartości „zatrzaśniętej” w pierwszej ramce przed wywołaniem funkcji wstrzymującej
pracę programu na 50 milisekund.
 Wynik operacji dołączyć do wykresu Wykres czas [ms] oraz kontrolki numerycznej
Czas [ms].
4. Pojedynczy pomiar w żaden sposób nie może świadczyć o dokładności odmierzania
odstępów czasu przez system operacyjny Windows XP. Aby móc oceniać właściwości
należy dysponować większą ilością danych. Najłatwiejszym sposobem jest naturalnie
zastosowanie pętli For (ilość iteracji jest znana przed uruchomieniem pętli), która
pozwoli wielokrotnie wykonać ten sam fragment kodu.

 Obwieść dotychczas utworzony kod Pętlą For.

4
 Do terminalu określającego ilość iteracji dołączyć kontrolkę numeryczną Ilość
pomiarów.
 W menu kontekstowym pętli zaznaczyć opcję Conditional Terminal.
 Do terminalu warunkowego zakończenia pętli For dołączyć przycisk Stop.
5. Aby ułatwić użytkownikowi pracę z programem dodane zostaną funkcje czyszczenie
zawartości wykresu w momencie uruchomienia programu oraz zmiany jego koloru, gdy
mierzone wartości przekroczą 60 milisekund, czyli o 20% więcej niż zadane 50 ms.
 Z menu kontekstowego terminalu wyjściowego Wykres czas [ms] wybrać kolejno
opcje: Create → Property Node → History Data (ostatnia pozycja).
 Umieścić utworzoną instrukcję modyfikującą historię wykresu poza pętlą For.
 Z jej menu kontekstowego wybrać opcję Change All To Write. Pozwoli to przypisać
odpowiednią wartość do historii wykresu.
 Z menu kontekstowego wejścia History wybrać opcję Create → Control. Spowoduje
to kasowanie zawartości wykresu po każdym ponownym uruchomieniu programu.
 Ponownie utworzyć Property Node, tym razem służący do zmiany koloru wykresu.
W tym celu wybrać ponownie z menu kontekstowego Wykres czas [ms] następujące
opcje Create → Property Node → Plot → Plot Color.
 Korzystając z funkcji Select oraz Greater? utworzyć kod modyfikujący kolor
wykresu w zależności od wartości rzeczywistego opóźnienia. Dołączyć dwie stałe
typu Color Box (Programming → Graphics & Sound → Picture Functions) do
odpowiednich wejść funkcji Select.
6. Powrócić do Panelu Czołowego i uruchomić program, aby wykonał 100 pomiarów czasu.
7. Wyświetlanie danych w postaci wykresu jest na pewno dużo czytelniejsze niż
analizowanie tabel zawierających dane pomiarowe. Jednakże, ze względu na dużą
przypadkowość uzyskiwanych wyników analiza ilościowa takiego wykresu jest
utrudniona. Warto w takiej sytuacji zastosować histogram.

Histogram jest to wykres słupkowy służący do graficznej reprezentacji rozkładu badanej


cechy (tu: dokładności odmierzania czasu). Na osi odciętych umieszcza się przedziały
uporządkowane w sposób rosnący, zaś na osi rzędnych przedstawiana jest ilość składników
należących do danego przedziału.

5
8. Na Panelu Czołowym umieścić wykres XY Graph przeznaczony do prezentowania
histogramu.
 Nadać wykresowi nazwę Histogram, osi odciętych Przedziały, zaś rzędnych Ilość.
 Otworzyć okno właściwości wykresu i zmodyfikować zakładkę Plots zgodnie z
przedstawionym rysunkiem.

9. Jako aktywne ustawić okno Diagramu i uzupełnić program o następujący fragment kodu.

6
 Poza pętlą For umieścić funkcję Histogram.vi (Mathematics → Probability &
Statistics). Do wejścia intervals dołączyć stałą numeryczną równą 10. Dzięki temu
uzyskane wyniki zostaną podzielone na 10 podprzedziałów.
 Utworzyć tunel wyjściowy pętli For z indeksowaniem, dzięki temu powstanie tablica
wyników pomiarów.
 Utworzony tunel wyjściowy połączyć z funkcją To Double Precision Float rzutującą
dowolny typ na typ zmiennoprzecinkowy (double), gdyż na tym typie danych operuje
funkcja Histogram.
 Wyjście funkcji To Double Precision Float dołączyć do wejścia X funkcji
histogram.
 Umieścić w kodzie funkcję Bundle, która posłuży do utworzenia klastra złożonego z
przedziałów (oś odciętych) oraz liczebności poszczególnych przedziałów (oś
rzędnych).
 Do pierwszego wejścia funkcji Bundle dołączyć wyjście X Values funkcji
Histogram, zaś do drugiego wyjście Histogram: h(x).
 Wyjście funkcji Bundle dołączyć do terminalu wyjściowego Histogram.
10. Ocena dużych zbiorów danych nawet przy pomocy wykresów jest trudna zwłaszcza, jeśli
konieczne jest ich wzajemne porównanie. Zastosowanie histogramu w pewnym
momencie może okazać się zawodne. W takiej sytuacji warto wprowadzić skalarne
wskaźniki oceniające dokładność pomiaru, do najpopularniejszych należą:
a) średnia,
b) mediana,
c) odchylenie standardowe,
d) wartość maksymalna,
e) wartość minimalna,
f) maksymalny jitter.

Jitter to krótkookresowe odchylenie od ustalonych (średnich), okresowych charakterystyk


sygnału. Odchylenie może dotyczyć częstotliwości, amplitudy lub fazy danego sygnału.
Maksymalny Jitter to po prostu różnica wartości maksymalnej i wartości średniej.

7
Potrzebne funkcje można znaleźć w palecie Programming → Array. Warto skorzystać z
polimorfizmu podstawowych funkcji matematycznych (Programming → Numeric).

11. Przejść do Diagramu i samodzielnie utworzyć kod obliczający wartości poszczególnych


wskaźników.
12. Ostatecznie Panel Czołowy aplikacji powinien mieć postać zbliżoną do przedstawionej na
rysunku.

Zastosowanie struktury Flat Sequence zagwarantowało ścisłą kolejność wykonywania


poszczególnych operacji, gdyż w momencie wykonywania kolejnych „klatek” nie są
wykonywane równolegle żadne inne instrukcje kodu. Jest to niewątpliwie wada tej struktury i
jej stosowanie należy ograniczyć do sytuacji, w których nie można było uzyskać określonego
następstwa wykonywania instrukcji w inny sposób. Warto dodać, że takie sytuacje należą do
rzadkości i z reguły dotyczą uzyskiwania precyzyjnych odstępów czasu.

8
13. Uruchomić program i zweryfikować jego działanie. Wykonać następujące testy
a) Uruchomić menadżer zadań Windows XP (Ctrl + Alt + Del) i zmienić priorytet
procesu.
b) Po uruchomieniu programu zwiększyć obciążenie procesora wykonując dodatkowe
zadania (uruchomienie dodatkowego programu, poruszanie oknem, etc.).
c) Dodać w kodzie programu równoległą pętlę, która będzie uruchamiana razem z pętlą
pomiarową i będzie wykonywać o połowę mniej iteracji.
d) Zmienić odmierzany czas z 50 milisekund na 5, a następnie 100 milisekund.

Aby skopiować zawartość wykresu należy z jego menu kontekstowego wybrać opcję
Data Operations → Copy Data.

14. Zaproponowane testy, uzyskane wyniki oraz wnioski przedstawić prowadzącemu.


15. Po ukończeniu prób zapisać program.

Reasumując, system Windows XP nie nadaje się do realizacji krytycznych czasowo zadań i
nie należy się tu dziwić, gdyż nie został do tego celu zaprojektowany. Naturalnie
zastosowane środowisko programistyczne oraz język programowania nie mają żadnego
wpływu na przydział czasu dla poszczególnych zadań przez scheduler systemu
operacyjnego. Mimo to można przyjąć, że pętle programowe o okresie pracy równym 100
milisekund (lub więcej) będą wykonywane z dużą powtarzalnością, przy jednoczesnym
wyeliminowaniu czynników spowalniających pracę systemu operacyjnego.

9
Ćwiczenie 2 – Moduł i argument wektora - Decorations
Cel: Poznanie sposobów tworzenia czytelnego graficznego interfejsu użytkownika.
Stworzenie programu służącego do obliczania długości oraz argumentu
wektora.

Czasem zamiast przedstawienia wektora w postaci współrzędnych jego początku oraz końca,
wygodniej jest dysponować jego długością oraz kątem, jaki tworzy on z dodatnią półosią OX
(rozważany będzie wektor na płaszczyźnie XY).

Y
y2
v 𝒗 = (y2 − y1 )2 + (x2 − x1 )2

y1 arg 𝒗 = arctg2(y2 − y1 , x2 − x1 )

x1 x2 X

1. Otworzyć LabVIEW 2012 i utworzyć nowy VI. Zapisać go pod dowolną nazwą
(przykładowo Wektor).
2. W Panelu Czołowym wybrać paletę Controls → Modern → Decorations

i za pomocą zebranych tam elementów graficznych stworzyć interfejs graficzny programu.

10
 Skorzystać z dowolnych elementów dekoracyjnych tak, aby użytkownik mógł szybko
zorientować się w funkcjonowaniu programu.
 Podczas tworzenia wizualizacji warto korzystać z funkcji Reorder.

Funkcja ta pozwala dowolnie grupować, blokować oraz przemieszczać względem


siebie w przestrzeni, umieszczone na Panelu Czołowym obiekty, w tym elementy
dekoracyjne.
 Na Panelu Czołowym umieścić cztery kontrolki numeryczne i nazwać je kolejno x1,
x2, y1, y2. Zostaną wykorzystane do zadawania współrzędnych początku oraz końca
wektora.
 Dodać dwa wskaźniki numeryczne i nazwać je odpowiednio Długość wektora, Kąt
tworzony z osią OX.

11
 Na zakończenie dodać przycisk Stop. Posłuży on do zatrzymania pętli głównej
programu, dlatego też należy ustawić odpowiedni tryb pracy. Jego nazwę zmienić na
STOP [Esc].

Zastosowanie skrótu klawiszowego Ctrl + M pozwala podejrzeć jak wygląda Panel Czołowy
podczas wykonywania aplikacji, przy czym program nie jest uruchamiany. Jest to bardzo
przydatne, w początkowej fazie tworzenia program, gdy utworzony został tylko Panel
Czołowy.

3. Przejść do okna Diagramu i utworzyć kod obliczający długość i argument wektora.

 Korzystając z funkcji zgrupowanych w palecie Numeric utworzyć kod obliczający


długość wektora. Wynik obliczeń dołączyć do terminalu wyjściowego Długość
wektora.
 Jedyną trudność podczas tworzenia programu może spowodować odnalezienie
dwuargumentowej funkcji arcus tangens (zbiorem wartości tej funkcji jest kąt pełny -
2𝜋). Aby uzyskać do niej dostęp należy wybrać kolejno Functions → Mathematics →
Elementary & Special Functions → Trigonometric Functions.
 Dodać funkcję Rad_to_Deg umieszczoną w folderze wskazanym przez prowadzącego
laboratorium.
 Dwukrotnie kliknąć ikonę reprezentującą funkcję Rad_to_Deg i w nowo otwartym
oknie Panelu Czołowego tej funkcji wybrać z menu głównego File → VI Properties.

12
 W oknie VI Properties wybrać kategorię Execution i zaznaczyć opcję Preallocated
clone reentrant execution – zaznaczenie tej opcji pozwala uzyskać równoległe
wykonywanie funkcji, jeśli występuje w kilku miejscach. Zaznaczyć opcję Inline
subVI into calling – poskutkuje to przyspieszeniem wykonywania programu, gdyż
funkcja nie będzie wywoływana ponownie przy kolejnych iteracjach pętli poprzez skok
do odpowiedniego miejsca w pamięci programu. Funkcja z atrybutem inline zostanie
umieszczona bezpośrednio wewnątrz kodu programu.

 Po dokonaniu zmian kliknąć OK, zapisać i zamknąć subVI.


4. Po przejściu do Panelu Czołowego można uruchomić program. Nim to nastąpi można
dodać kolejne udogodnienie w postaci zatrzymania programu za pomocą klawisza. W tym
celu należy otworzyć właściwości przycisku, po czym wybrać zakładkę Key Navigation.
W polu Toggle wybrać jeden z klawiszy np. Escape. Jest to klawisz na klawiaturze, który
można łatwo zlokalizować i szybko zakończyć działanie programu.
5. Zapisać i uruchomić program.

13
Ćwiczenie 3 – Lotto – tworzenie opisu programu.
Cel: Poznanie metod ułatwiania pracy z aplikacją przez użytkownika oraz dokumentowania
kodu programu.

Wychodzenie z założenia, iż podczas tworzenia programu istotne jest jedynie zrealizowanie


założeń projektowych dotyczących jego funkcjonowania nie jest słuszne. Bardzo często podczas
programowania nie jest przyjmowana większa uwaga do elementów, które nie mają
decydującego wpływu na końcowe działanie aplikacji, tj. nazewnictwa zmiennych, doboru typów
danych, uporządkowania kodu programu, tworzenia komentarzy opisujących działanie
algorytmu, itd. Dobry program to taki, który oprócz prawidłowego funkcjonowania cechuje się:
modułową i hierarchiczną budową, spójnością oraz małym sprzężeniem pomiędzy wątkami i co
najważniejsze posiada dobrą dokumentację. Wówczas, podczas tworzenia nowych aplikacji,
można bardzo szybko skorzystać z gotowego fragmentu kodu, który jest prosty w analizie i
zastosowaniu. W LabVIEW istnieje kilka sposobów tworzenia dobrze udokumentowanego kodu
programu. W ramach ćwiczenia zostanie zmodyfikowany kod programu, który działa
prawidłowo, jednak w żaden sposób nie zadbano o to, by kod ten był udokumentowany.

1. Otworzyć LabVIEW 2012 i uruchomić program Lotto.vi tworzony podczas laboratorium


numer 2. Zapisać go pod nową nazwą (przykładowo Lotto_ok).
2. Zmodyfikować wygląd Panelu Czołowego oraz właściwości elementów znajdujących się
na nim.

14
 Kliknąć dwukrotnie w pustym miejscu na Panelu Czołowym i umieścić napis
„Losowanie LOTTO”.
 Korzystając z narzędzia służącego do edycji tekstu

zwiększyć rozmiar do 30 punktów i podkreślić tekst.


 Z menu kontekstowego przycisku Stop wybrać opcję Description and Tip (opis oraz
wskazówka).
 W polu „Stop” Description wprowadzić dokładny opis przeznaczenia kontrolki, będzie
on wyświetlany w pomocy kontekstowej, po najechaniu kursorem myszki na ten
obiekt. Przykładowo: „Przycisk służący do zatrzymania wykonywania programu przed
wylosowaniem wszystkich liczb.”
 W polu „Stop” Tip wprowadzić krótką wskazówkę, która będzie wyświetlana podczas
pracy programu. Przykładowo: „Naciśnij, aby zakończyć.”

 Na następnej stronie przedstawiono efekt wprowadzenia dotychczasowych zmian.

15
 W analogiczny sposób wprowadzić opisy oraz wskazówki dla pozostałych dwóch
obiektów na Panelu Czołowym.
 Dodać na Panelu Czołowym komentarz opisujący pokrótce działanie programu.
3. Przejść do Diagramu i dokonać modyfikacji kodu programu mających na celu poprawę
jego czytelności.

4. W LOTTO losowane są liczby całkowite bez znaku od 1 do 49. Najbardziej


odpowiadający w tej sytuacji typ danych to 8-bitowy, całkowitoliczbowy, bez znaku.
 Zmienić typ danych zawartych w tablicy Wylosowane liczby z DBL na U8.

16
 Zmodyfikować typ stałej liczbowej dołączonej do wejścia element funkcji
Initialize Array na U8. Wyświetlić nazwę tej stałej (Visible → Label) i zmienić ją
z y na Wartość początkowa.
 Wyświetlić nazwę stałej dołączonej do wejścia dimension size funkcji Initialize
Array i zmienić ją z dimension size na Rozmiar tablicy.
 Do wyjścia funkcji Round Toward +Infinity dołączyć funkcję To Unsigned Byte
Integer dokonującą konwersji do typu U8.
5. Fragment kodu losujący liczbę od 1 do 49 warto zamknąć w postaci subVI, gdyż operacja
losowania liczby z danego przedziału jest dość powszechna podczas programowania i
może przydać się w przyszłości.
 Zaznaczyć, wykorzystując klawisz Shift, fragment kodu odpowiedzialny za
losowanie (oprócz stałej liczbowej równej 49).

 Pominięcie funkcji konwersji uczyni tworzony subVI bardziej ogólnym, gdyż


programista może dokonać konwersji do dowolnego typu liczbowego wedle
potrzeb.
 Następnie wybrać z menu głównego Edit → Create SubVI.
 Dwukrotnym kliknięciem otworzyć subVI. Zmodyfikować ikonę subVI oraz złączę
subVI (Connector Pane), aby subVI przyjmowało jeden argument wejściowy (n) i
zwracało jedną wartość (rand).

17
Pomarańczowe tło ikony świadczy o tym, iż funkcja operuje liczbami
zmiennoprzecinkowymi.
 Z menu głównego wybrać opcję File → VI Properties, po czym kategorię
Documentation. W polu VI description wpisać opis działania funkcji, przykładowo:
„Funkcja zwracająca liczbę losową (wyjście rand) z dowolnego zakresu od 1 do n
(wejście n)”. Opis ten będzie widoczny w pomocy kontekstowej.
Pola Help tag oraz Help path służą do dodania opisu funkcji do głównej pomocy.

 Zapisać funkcję pod nazwą Rand 1-n i zamknąć Panel Czołowy.


 Wyświetlić nazwę funkcji Rand 1-n w kodzie programu Lotto_ok.
 Analogicznie jak w poprzednim ćwiczeniu warto przypisać do subVI atrybut
inline. Dzięki temu program nie straci na szybkości wykonywania programu na
skutek utworzenia funkcji, do której normalnie musiałby zostać wykonany skok.
 Stałej liczbowej o wartości 49 nadać nazwę Zakres.
6. Umieści opisy połączeń w kodzie programu.
 Kliknąć dwukrotnie w pustym miejscu i utworzyć komentarz „Wylosowane
liczby”.

 Wywołać paletę narzędzi (View → Tools Palette).


 Kliknąć na górny kwadrat (odpowiada za kolor krawędzi) narzędzia Set Color i
wybrać kolor biały.

18
 W analogiczny sposób przypisać kolor biały dolnemu kwadratowi (odpowiada za
kolor tła)

 Kliknąć na komentarz „Wylosowane liczby” i umieścić go nad połączeniem


przenoszącym wartości tablicy od rejestru przesuwnego do funkcji Search 1D
Array.

 W analogiczny sposób utworzyć komentarz „Ilość wylosowanych liczb” i umieścić


go nad połączeniem zawierającym bieżący licznik liczb umieszczonych w tablicy.
7. Umieścić komentarze wewnątrz Case Structure.
 Kliknąć dwukrotnie na pusty obszar wewnątrz przypadku 0, Default. W ten sposób
zostanie utworzony komentarz. Przykładowa treść komentarza: „Wylosowana
liczba już jest w tablicy. Nic nie rób.”.
 Wewnątrz przypadku -1 umieścić dwa komentarze o treści: „Inkrementacja
licznika” oraz „Dodanie elementu do tablicy”
8. Ponumerować najistotniejsze fragmenty kodu programu korzystając z komentarzy.
Następnie pod pętlą główną umieścić duży komentarz opisujący działanie każdego
wypunktowanego kawałka kodu. Przykładowa treść komentarza:

19
„1. Utworzenie 6-elementowej tablicy liczb typu U8. Zostanie zapełniona wylosowanymi
liczbami.
2. Losowanie liczby z zakresu od 1 do 49.
3. Sprawdzenie, czy wylosowana liczba znajduje się już w tablicy, wynik tej funkcji
określa, który przypadek struktury Case zostanie wykonany.
4. Jeśli wylosowano nową liczbę to jest ona dopisana do końca tablicy i licznik
wylosowanych liczb jest inkrementowany. W przeciwnym razie tablica nie jest
modyfikowana.
5. Wyświetlenie zawartości tablicy po każdej iteracji pętli.
6. Zatrzymanie pętli następuje, gdy wylosowano 6 liczb, lub wciśnięto klawisz Stop.”
Warto komentować tylko główne fragmenty programu, pomijając kwestie oczywiste, takie
jak np. wyświetlanie bieżącego indeksu iteracji pętli.
9. Wylosowanie 6 liczb spośród 49 nie wymaga wielu iteracji pętli, dlatego też wprowadzone
opóźnienie można usunąć. Jednakże opóźnienie można wykorzystać do samodzielnego
debuggowania programu, zatem może się przydać w przyszłości. W językach tekstowych
stosuje się specjalne sekwencje znaków (// lub /* */ w C/C++, bądź % w Matlabie), aby
zachować fragment kodu „na później” bez jego wpływu na działanie programu.
W LabVIEW służy do tego struktura Diagram Disable Structure (Programming →
Structures).
 Wybrać tę strukturę i obwieść nią funkcję Wait Until Next ms Multiple wraz z
dołączoną do niej stałą. W ten sposób pozostanie ona w kodzie programu, jednak nie
będzie wykonywana po uruchomieniu programu.
 Aby ponownie włączyć ten fragment kodu należy wybrać z menu kontekstowego tej
struktury opcję Enable This Subdiagram.
10. Zapisać program.

Kod należy dokumentować w trakcie jego tworzenia, gdyż w ten sposób nie zostanie pominięta
żadna istotna informacja. Co więcej, proces ten będzie zdecydowanie szybszy niż tworzenie
opisu kodu po utworzeniu programu.

20
Ćwiczenie 4 – Invoke Node
Cel: Poznanie metod modyfikacji wyglądu interfejsu użytkownika podczas uruchamiania
aplikacji.

Jak można było dotychczas zauważyć programy tworzone w LabVIEW podczas ich
wykonywania uruchamiane są w Panelu Czołowym. Aplikacja posiada domyślnie wszystkie
elementy związane z edycją graficznego interfejsu użytkownika (ang. Graphical User Interface)
programu zarówno w postaci paska narzędzi, edytora ikony i złącza subVI jak również menu
głównego. Naturalnie funkcje te są bardzo przydatne podczas edycji i testowania kodu programu.
Wielokrotnie może się okazać, że pozostawienie tych domyślnych ustawień wyglądu Panelu
Czołowego nie jest wskazane. Przyczyną takich sytuacji mogą być wymagania projektowe, które
zakładają by interfejs użytkownika był możliwie jak najprostszy i czytelny. W LabVIEW
programista może decydować jak będzie wyglądało okno programu po jego uruchomieniu.
Dodatkowo użytkownik może zdefiniować własne menu główne aplikacji. Wspomniane zmiany
okna Panelu Czołowego mogą zostać dokonane w sposób statyczny (ustawienie trwałe przed
uruchomieniem programu), jak również dynamiczny (w oparciu o techniki programistyczne).

W programie zostaną zmodyfikowane następujące właściwości Panelu Czołowego aplikacji


należące do klasy VI (VI Class):

 ShowMenuBar – Jak sama nazwa wskazuje właściwość ta odpowiada za widoczność


menu głównego aplikacji. Jeśli do tego atrybutu przypisano wartość logiczną prawda,
wówczas menu główne jest widoczne, w przeciwnym razie jest ukryte.

 TitleBarVisible – jeśli tej właściwości przypisano prawdę, wówczas widoczny jest pasek
tytułu aplikacji, w przeciwnym razie jest on niewidoczny.

 RunVITransparently – właściwość tę można traktować jak flagę, która decyduje, czy


wprowadzona wartość przezroczystości (ang. transparency) okna VI ma znaczenie. Jeśli
tej właściwości przypisano fałsz, to wówczas okno Panelu Czołowego jest w pełni
widoczne, w przeciwnym razie przezroczystość wynosi wartości przypisanej do
właściwości Transparency (przezroczystość).
21
 Transparency – jak wspomniano wcześniej, ta właściwość określa przezroczystość okna
Panelu Czołowego i przyjmuje wartości od 0 do 100. Wartość 0 oznacza, że okno jest w
pełni widoczne (wartość domyślna), zaś 100 – pełną niewidoczność okna.

Zostanie również zastosowana jedna z metod wpływających na położenie okna Panelu


Czołowego. W odróżnieniu od właściwości (properties), którym przypisuje się jedną wartość
i nadpisywanie jej nie ma żadnego znaczenia, metody wykonują przypisaną do nich akcję
każdorazowo, gdy zostanie ona wywołana. Przykładowo, jeśli wewnątrz pętli zostanie
umieszczona prezentowana w ćwiczeniu metoda Center (jak nazwa wskazuje wywołanie tej
metody skutkuje wyśrodkowaniem okna na ekranie), to wówczas w każdej iteracji pętli okno
będzie wyśrodkowywane. W rezultacie po każdym przesunięciu okna, będzie ono uciążliwie
wracało do centralnego położenia. Dlatego też w kodzie programu należy używać struktur,
które będą uzależniały wykonywanie metod od wystąpienia pewnego zdarzenia (np.
wciśnięcie przycisku).

1. Otworzyć LabVIEW 2012 i utworzyć nowy VI. Zapisać go pod dowolną nazwą
(przykładowo GUI).
2. Przykładowy Panel Czołowy, który należy utworzyć w kolejnych krokach ćwiczenia
przedstawiono na poniższym rysunku.

3. Rozpocząć od utworzenia kontrolek logicznych służących do określania widoczności


wybranych elementów Panelu Czołowego oraz jego przezroczystości.
 Dodać przełącznik logiczny (Vertical Toggle Switch) i nazwać go Pokaż pasek
narzędzi?
 Umieścić, w postaci komentarza na Panelu Czołowym, napis „Tak
obok jego górnego położenia, oraz „Nie” w pobliżu dolnego położenia.
 Utworzyć kopię dotychczas utworzonych elementów. Zmienić nazwę
skopiowanego przełącznika na Pokaż pasek tytułu?.
22
 Utworzyć kolejną kopię przełącznika Pokaż pasek narzędzi? wraz z
komentarzami. Zmienić nazwę utworzonej kopii przełącznika logicznego na Okno
przezroczyste?
4. Dodać dwa przyciski, które posłużą do wyśrodkowywania ekranu, oraz zatrzymania jego
wykonywania.
 Umieścić na Panelu Czołowym przycisk OK (OK button) i nazwać go Środek.
 Napis umieszczony na przycisku zmienić z OK na Wyśrodkuj.
 Dodać przycisk Stop (Stop button).
 Upewnić się, że umieszczonym w tym punkcie przyciskom przypisany jest tryb
pracy Latch When Released. Dodatkowo wyłączyć widoczność ich nazw (Visible
Items → Label). Jak wiadomo, zagwarantuje to, iż po kliknięciu przycisku i
odczytaniu jego stanu podczas wykonywania programu, zostanie on przywrócony
do domyślnego stanu.

Jeśli zaznaczono kilka obiektów, na Panelu Czołowym bądź Diagramie, i wywołano


menu kontekstowe, to dostępne będą tylko te funkcje, które są wspólne dla
zaznaczonych typów. Aby szybko zmodyfikować właściwości dodanych przycisków
można zaznaczyć je i wybrać z menu kontekstowego (Visible Items → Label) –
wówczas zmiany będą dotyczyć obydwu elementów.

5. Korzystając z narzędzi Align (ang. wyrównać), Distribute (ang. rozmieścić) oraz Resize
(ang. zmień rozmiar) poprawić wygląd oraz rozmieszczenie utworzonego interfejsu
użytkownika.
6. Upewnić się, czy każda z kontrolek logicznych ustawiona jest w stan wysoki. Następnie
zaznaczyć wszystkie elementy na Panelu Czołowym i wybrać z menu głównego Edit →
Make Current Values Default.
7. Przejść do okna Diagramu i stworzyć kod programu z wykorzystaniem utworzonych na
Panelu Czołowym obiektów.

23
8. Obwieść pętlą While terminale wejściowe.
9. Utworzyć referencję do tworzonego VI. Pozwoli ona modyfikować właściwości oraz
korzystać z metod przypisanych dostępnych dla VI.
 W tym celu z palety Application Control (Programming → Application Control)
wybrać element VI Server Reference. Jeśli nie przypisano mu do tej pory referencji
This VI, to należy go kliknąć i z menu kontekstowego wybrać This VI.
10. Zmodyfikować właściwość RunTransparently korzystając z funkcji Property Node.
 Z menu kontekstowego referencji This VI wybrać następujące opcje: Create →
Property for VI Class → Front Panel Window → Run VI Transparently.
 Utworzoną instrukcję Property Node umieścić poza pętlą While, po jej prawej
stronie. Następnie, z jej menu kontekstowego wybrać opcję Change All to Write, aby
móc zmodyfikować tę właściwość.
 Do wejścia FP:RunTransparently instrukcji Property Node dołączyć stałą logiczną
prawda, zaś do wejścia reference – referencję This VI.
11. Utworzyć instrukcje Property Node służące do sterowania wyświetlaniem elementów
składowych Panelu Czołowego aplikacji.
 Z menu kontekstowego referencji This VI wybrać następujące opcje Create →
Property for VI Class → Front Panel Window → Show Menu Bar. W ten sposób
powstanie instrukcja modyfikująca widoczność paska narzędzi. Utworzoną instrukcję
Property Node umieścić wewnątrz pętli.

24
 Rozszerzyć w dół utworzoną instrukcję, aby pojawiły się dwie kolejne właściwości,
które będą modyfikowane.
 Kliknąć na drugi element i wybrać z opcję Front Panel Window → Title Bar Visible.
 Kliknąć na drugi element i wybrać z opcję Front Panel Window → Transparency.
 Z menu kontekstowego utworzonej w ten sposób instrukcji Property Node wybrać
Change All to Write.
 Połączyć odpowiednie logiczne terminale wejściowe z właściwymi wejściami
instrukcji Property Node,
 Korzystając z funkcji Select przypisać do właściwość Transparency wartość 0
(wejście f) bądź 40 (wejście t) w zależności od stanu terminalu wejściowego.
Selekcja dokonywana jest przez kontrolkę logiczną Okno przezroczyste?.
12. Utworzyć instrukcję Invoke Node wywołującą metodę Center.
 Z menu kontekstowego referencji This VI wybrać następujące opcje Create →
Method for VI Class → Front Panel → Center. W ten sposób powstanie instrukcja
wywołująca metodę - wyśrodkuj Panel Czołowy. Utworzoną instrukcję Invoke Node
umieścić wewnątrz pętli.
 Obwieść instrukcję Invoke Node za pomocą Case Structure. Do wejścia selektora
przypadku dołączyć terminal Środek.
13. Korzystając z rejestru przesuwnego (Shift Register) utworzyć odpowiednia połączenia w
kodzie programu.
14. Stosując dowolną funkcję czasową dodać do programu opóźnienie wynoszące 50
milisekund.
15. Zatrzymanie pętli głównej programu uzależnić od kliknięcia przycisku Stop lub
wystąpienia błędu w programie (skorzystać z funkcji alternatywy logicznej (Or)).
16. Na zakończenie sygnał błędu połączyć z funkcją Simple Error Handler VI.
17. Zapisać i uruchomić program. Sprawdzić działanie stworzonego programu.

25
Po wybraniu z menu głównego File → VI Properties i następnie kategorię Window
Appearance. Dostępne są tam opcje służące do modyfikacji wyglądu Panelu Czołowego
podczas pracy programu.

26
Ćwiczenie 5 – Stoper – własna kontrolka
Cel: Utworzenie wskaźnika o spersonalizowanym wyglądzie.

Wybór kontrolek oraz wskaźników na Panelu Czołowym nie jest tylko ograniczony do
elementów dostępnych w bibliotekach wbudowanych w LabVIEW. Programista w prosty sposób
może szybko utworzyć własną kontrolkę poprzez modyfikację już istniejących. W ćwiczeniu
zostanie utworzony wskaźnik numeryczny o wyglądzie analogowego stopera.

1. Ćwiczenie to zacznie się nietypowo od uruchomienia programu Paint i wczytania pliku


Stoper_cały.jpg z lokalizacji wskazanej przez prowadzącego. Usunąć z cyferblatu mały
zegarek wraz ze wskazówką.

2. Otworzyć LabVIEW 2012 i z menu głównego ekranu startowego wybrać opcję File → New….
Następnie zaznaczyć Custom Control z grupy Other Files i kliknąć OK. Zostanie otworzony
edytor kontrolek. Zapisać obecny stan pod dowolną nazwą (przykładowo Edycja stopera).
3. Umieścić w obszarze edycji wskaźnik numeryczny typu Gauge. Wywołanie palety kontrolek
przebiega identycznie jak w przypadku Panelu Czołowego.

27
4. Powiększyć wskaźnik, aby dopasować go do rozmiaru pliku graficznego.
5. Chwycić za podziałkę umieszczoną przy wartości 0 i obrócić skalę tak, aby podziałka ta
pokryła się z godziną 12.

6. W analogiczny sposób obrócić podziałkę przy wartości 10, aby pokryła się z zerem i nadal
pokrywała się z godziną 12.
7. Zmienić wartość 10 na 60.

28
8. Dwukrotnie kliknąć na wartość 2 i wpisać 5. W ten sposób zmieni się skok skali, który
odpowiada teraz skali zegarowej.
9. Zmienić nazwę obiektu z Gauge na Stoper i umieścić nad wskaźnikiem.

10. Następnie kliknąć ikonę opcji Change to Customize Mode. Spowoduje to rozbicie
wskaźnika na elementy składowe, takie jak m.in. wskazówka, tło, nazwa, wyświetlacz
numeryczny, etc.
11. Skopiować do schowka utworzony w programie Paint cyferblat Stopera.
12. Zaznaczyć wewnętrzny kwadrat klikając na dotychczasowe, białe tło wskaźnika.

29
Z menu kontekstowego wybrać opcję Import Picture From Clipboard.

13. W razie potrzeby przemieścić nazwę wskaźnika w nowe położenie.


14. Obecne położenie skali powoduje, iż cała kontrolka jest nieczytelna. Każda kontrolka, czy też
wskaźnik zbudowany jest z warstw umieszczonych w przestrzeni. Dlatego też po zaznaczeniu
umieszczonego tła można wybrać opcję Move Forward Ctrl + K.

30
15. Poskutkuje to przeniesieniem tła nad skalę.

16. Dwukrotnie kliknąć ikonę wskaźnika , aby dokonać jej edycji.

31
17. Zapisać wskaźnik i zamknąć edytor kontrolek.
18. Utworzyć nowy VI i zapisać go (przykładowo pod nazwą Prosty stoper). Stworzony zostanie
prosty program, który będzie odmierzał jednosekundowe odcinki czasu i wyświetlać
odmierzony czas na stoperze.
19. Na Panelu Czołowym dodać utworzony wskaźnik analogicznie jak subVI, tj. wybrać opcję

32
i wskazać utworzony wskaźnik.

Można również przeciągnąć wskaźnik na Panel Czołowy z folderu, w którym został zapisany.

20. Dodać przycisk Stop i wyłączyć wyświetlanie jego nazwy.


21. Korzystając z narzędzia Set Color zmienić kolor tła na biały.

22. Przejść do okna Diagramu, gdzie stworzony zostanie następujący kod programu.

23. Przejść do Panelu Czołowego i dopasować rozmiar okna, aby znajdował się na nim tylko
stoper i przycisk Stop.

33
24. Następnie wybrać z menu głównego opcję File → VI Properties. W kategorii Window
Appearance zaznaczyć opcję Dialog. Dzięki temu po uruchomieniu programu oprócz obszaru
roboczego będzie widoczny tylko pasek tytułu.
25. W kategorii Window Run-Time Position w polu Position wybrać opcję Centered.
26. W kategorii Window Size dokonać następujących ustawień:
 Kliknąć Set to Current Panel Size, wówczas zostanie zachowany bieżący rozmiar okna
Panelu Czołowego.
 Zaznaczyć opcję Maintain proportions of window for different monitor resolutions, co
pozwoli zachować proporcje okna, przy uruchamianiu aplikacji na monitorach o innej
rozdzielczości.
27. Kliknąć OK, aby zatwierdzić dokonane zmiany.
28. Uruchomić program i sprawdzić jego działanie.

29. Zapisać program i zamknąć środowisko.

34
Zadania do wykonania
1. Zapoznać się z przykładem Tab Control Properties, działaniem zakładek i zastosowanych
właściwości tego obiektu poprzez Property Node.
2. Program z ćwiczenia 2 może posłużyć do obliczania argumentu i modułu liczby
zespolonej. Wystarczy wówczas przyjąć, że współrzędne x1 oraz y1 są równe zero, zaś y2
to część urojona, a x2 to część rzeczywista.
Dokonać odpowiednich modyfikacji kodu oraz Panelu Czołowego.
3. Gra Catch Me if You Can. Gra polega na wyświetlaniu w losowych położeniach na
Panelu Czołowym przycisku. Każde kliknięcie ma zwiększać licznik trafień. Gra ma
zakończyć się po zdobyciu 10 trafień, bądź kliknięciu przycisku Stop.
 Skorzystać z modyfikacji następujących właściwości obiektu przycisk, poprzez
Property Node: Position → Top oraz Position → Left.
 Skorzystać z funkcji Rand 1-n służącej do losowania liczb z zakresu od 1 do n,
aby wylosować przesunięcie w poziomie i pionie kontrolki.
4. Zmodyfikować program 5 tak, aby wyświetlane były minuty oraz sekundy, w postaci
wskaźników numerycznych.

35

You might also like