Laboratorium wirtualne 1/Moduł 2 - ćwiczenie 2/część 4: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Tomaszw (dyskusja | edycje)
Nie podano opisu zmian
Robert m (dyskusja | edycje)
Linia 11: Linia 11:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd_intro.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd_intro.png]]
|valign="top"|
|valign="top"|'''Temat ćwiczenia:'''
 
Generacja i wyświetlanie przebiegów
 
'''Cel ćwiczenia:'''
 
Materiał zaprezentowany w czasie prezentacji ma za zadanie zaznajomić użytkownika ze sposobem generacji przebiegów i możliwości wyświetlania wyników w środowisku LabWindows/CVI. Słuchacz posiądzie niezbędne wiadomości potrzebne do zbudowania prostego wirtualnego oscyloskopu.
 
|}
|}


Linia 18: Linia 25:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd01.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd01.png]]
|valign="top"|''opis slajdu''
|valign="top"|Plan prezentacji.
|}
|}


Linia 25: Linia 32:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd02.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd02.png]]
|valign="top"|''opis slajdu''
|valign="top"|Cel ćwiczenia
|}
|}
<hr width="100%">
<hr width="100%">
Linia 31: Linia 38:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd03.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd03.png]]
|valign="top"|''opis slajdu''
|valign="top"|Na podstawie umiejętności nabytych w poprzednich częściach ćwiczenia należy zbudować szkielet aplikacji. W czasie generacji kodu należy uwzględnić obsługę zdarzeń EVENT_COMMIT i EVENT_VAL_CHANGED.
|}
|}


Linia 38: Linia 45:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd04.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd04.png]]
|valign="top"|''opis slajdu''
|valign="top"|Budowa aplikacji została podzielona na etapy. Każdy z etapów jest pewnego rodzaju rozdziałem w którym zamknięty został pewien fragment funkcjonalności aplikacji. W etapie przedstawiony został sposób generacji przebiegów.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 44: Linia 51:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd05.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd05.png]]
|valign="top"|''opis slajdu''
|valign="top"|Na interfejsie należy dodać przycisk START i wygenerować dla niego funkcję obsługi zdarzenia. Przycisk posłuży do wygenerowania próbek sygnału.
|}
|}


Linia 51: Linia 58:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd06.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd06.png]]
|valign="top"|''opis slajdu''
|valign="top"|Na slajdzie przedstawione zostało miejsce gdzie należy wstawić funkcję generująca próbki sygnału sinusoidalnego. W przykładzie zostaną wygenerowane 256 próbki sygnału zawierające 2 okresy sinusoidy.
|}
|}


Linia 58: Linia 65:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd07.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd07.png]]
|valign="top"|''opis slajdu''
|valign="top"|Formularz konfiguracji argumentów wywołania funkcji Sine Wale.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 64: Linia 71:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd08.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd08.png]]
|valign="top"|''opis slajdu''
|valign="top"|Argumenty wywołania funkcji Sine Wave:
*Number of Elements – ilość próbek jaką chcemy wygenerować, wybieramy 256. Może powstać pytanie dlaczego zawsze wybieramy <math>2^n</math> próbek a nie na przykład 250. większość funkcji służących do analizy i obróbki danych operuje na wielkościach 2 do n. stosowanie wielokrotności 2 jest związane tez ze sprzętem kontrolno-pomiarowym używanym przy budowie wirtualnych przyrządów pomiarowych.
*Amplitude – amplituda generowanego sygnału. Jest to wartość typu double. Ustawiamy amplitudę przebiegu na wartość 10.
*Frequency – częstotliwość generowanego sygnału. Obliczana jest w następujący sposób: ilość okresów/ilość próbek . ponieważ chcemy wygenerować dwa okresy sinusoidy a do dyspozycji mamy tablicę o rozmiarze 256 próbek to podajemy 7.8125e-3 co jest równoważne wartości 2/256.
*Phase – faza sygnału. Jest to zmienna w której przechowywana jest wartość fazy na jakiej funkcja zakończyła generację przebiegu. Wartość fazy podawana na wejściu funkcji pozwala na generację przebiegu od określonej fazy (wartości kąta). Jest to wartość typu double która należy zadeklarować.
*Sine Wave – tablica w której zapisane zostaną wartości wygenerowanych próbek. Należy ją zadeklarować jako tablicę 256 elementów typu double.
 
|}
|}


Linia 71: Linia 84:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd09.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd09.png]]
|valign="top"|''opis slajdu''
|valign="top"|Deklaracja zmiennych potrzebnych do generacji syganłu.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 77: Linia 90:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd10.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd10.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wypełniony wartościami formularz funkcji SineWave. Pole status pozostawiamy puste.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 83: Linia 96:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd11.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd11.png]]
|valign="top"|''opis slajdu''
|valign="top"|Kompletny kod funkcji obsługi zdarzenia.
|}
|}


Linia 90: Linia 103:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd12.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd12.png]]
|valign="top"|''opis slajdu''
|valign="top"|
|}
|}
<hr width="100%">
<hr width="100%">
Linia 96: Linia 109:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd13.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd13.png]]
|valign="top"|''opis slajdu''
|valign="top"|W celu wyświetlenia okna graficznego zawierającego wykres wygenerowanej fnkcji na panelu potrzebny będzie przycisk Wyświetl dla którego należy wygenerować funkcję obsługi zdarzenia.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 102: Linia 115:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd14.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd14.png]]
|valign="top"|''opis slajdu''
|valign="top"|W kodzie obsługi zdarzenia EVENT_COMMIT przycisku Wyświetl zostanie wstawiona funkcja YGraphPopUp(…) wyświetlająca w oknie graficznym zawartość tablicy tab.
|}
|}


Linia 109: Linia 122:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd15.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd15.png]]
|valign="top"|''opis slajdu''
|valign="top"|Formularz funkcji Y Graph Popup.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 115: Linia 128:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd16.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd16.png]]
|valign="top"|''opis slajdu''
|valign="top"|Opis argumentów wywołania funkcji Y Graph Popup.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 121: Linia 134:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd17.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd17.png]]
|valign="top"|''opis slajdu''
|valign="top"|Na slajdzie przedstawiony został efekt działania aplikacji. Wyskakujące okno graficzne z wykresem funkcji umożliwia wydruk otrzymanego wykresu.
|}
|}


Linia 128: Linia 141:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd18.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd18.png]]
|valign="top"|''opis slajdu''
|valign="top"|Etap 2 rozbudowy aplikacji opisuje sposób generacji i wyboru różnych przebiegów.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 134: Linia 147:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd19.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd19.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wstawienie na interfejsie użytkownika elementu umożliwiającego wybór jednego z sygnałów jaki ma zostać wygenerowany.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 140: Linia 153:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd20.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd20.png]]
|valign="top"|''opis slajdu''
|valign="top"|Właściwości elementu Vertical Pointer Slide
|}
|}


Linia 147: Linia 160:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd21.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd21.png]]
|valign="top"|''opis slajdu''
|valign="top"|Definiowanie par danych (etykiet i odpowiadającym im wartości0 wyświetlanych na suwaku.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 153: Linia 166:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd22.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd22.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wypełniony formularz określający powiązania pomiędzy wyświetlanymi na suwaku etykietami a odpowiadającymi im wartościami.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 159: Linia 172:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd23.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd23.png]]
|valign="top"|''opis slajdu''
|valign="top"|Ustawienie wartości domyślnej jaka ma zostać wybrana na suwaku w momencie startu aplikacji.
|}
|}


Linia 166: Linia 179:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd24.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd24.png]]
|valign="top"|''opis slajdu''
|valign="top"|Po zmodyfikowaniu interfejsu użytkownika pozostaje modyfikacja kodu obsługi zdarzenia EVENT_COMMIT przycisku Start tak aby generowany był wybrany  przebieg.
 
W tym celu przed funkcją SineWave należy wstawić funkcję (Get Control Value) pobierającą położenie z suwaka SYGNAL. Wartość ma zostać zapisana w zmiennej sygnał (należy ją zadeklarować jako zmienną lokalną typu int).
 
Następnie po funkcji Get Control Value należy wstawić konstrukcję switch case która w zależności od wartości zmiennej sygnał wygeneruje odpowiedni przebieg.
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 172: Linia 190:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd25.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd25.png]]
|valign="top"|''opis slajdu''
|valign="top"|Na slajdzie zaprezentowano sposób definiowania wartości w instrukcji switch.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 178: Linia 196:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd26.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd26.png]]
|valign="top"|''opis slajdu''
|valign="top"|Kreator instrukcji switch case.
|}
|}


Linia 185: Linia 203:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd27.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd27.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wstawiony kod instrukcji switch case.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 191: Linia 209:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd28.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd28.png]]
|valign="top"|''opis slajdu''
|valign="top"|Ostatnią czynnością jaką należy wykonać w funkcji Start jest wstawienie odpowiednich funkcji generujących przebiegi w odpowiednie pozycje case. Funkcje do generacji przebiegów znajdują się w:
: ''Library > Advanced Analysis > Signal Generation''
 
W pozycje case wstawiamy następujące funkcje:
*case 0 – przenosimy funkcję SineWave którą wstawiliśmy w początkowej wersji funkcji Start.
*case 1 – wstawiamy funkcje Square Wave z następującymi parametrami: ilość elementów , amplituda, częstotliwość i faza jak w funkcji SineWave; Duty Cycle – jest to procentowe wypełnienie prostokąta (pozostawiamy 50.0); Square Wave – nazwa tablicy do której mają być zapisane wygenerowane próbki (wpisujemy tab)
*case 2 – wstawiamy funkcję Sawtooth Wave z parametrami jak funkcja Sine Wave.
*case 3 – wstawiamy funkcję White Noise z parametrami jak funkcja Sine Wave; seed ustawiamy na -1 aby przebieg był kontynuowany
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 197: Linia 223:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd29.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd29.png]]
|valign="top"|''opis slajdu''
|valign="top"|Kompletny kod C funkcji obsługi zdarzenia przycisku Start.
|}
|}


Linia 204: Linia 230:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd30.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd30.png]]
|valign="top"|''opis slajdu''
|valign="top"|Efekt wykonaych zmian.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 210: Linia 236:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd31.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd31.png]]
|valign="top"|''opis slajdu''
|valign="top"|Etap 4 rozbudowy aplikacji. Dodanie graficznego okna przedstawiającego wygenerowany przebieg bezposrednio na panelu.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 216: Linia 242:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd32.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd32.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wstawienie elementu typu Graph na panel.
|}
|}


Linia 223: Linia 249:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd33.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd33.png]]
|valign="top"|''opis slajdu''
|valign="top"|Kolejna modyfikacja funkcji Start. Przeniesienie kodu obsługi zdarzenia z funkcji Start do nowej funkcji Generuj. Jeżeli wstawimy funkcję Generuj przed miejscem jej pierwszego użycia nie będzie potrzebny prototyp funkcji. Prototyp funkcji wstawiamy zaraz po deklaracjach zmiennych na górze kodu C programu. Prototyp funkcji: void Generuj(void);
|}
|}
<hr width="100%">
<hr width="100%">
Linia 229: Linia 255:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd34.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd34.png]]
|valign="top"|''opis slajdu''
|valign="top"|Fragment kodu przedstawiający wykonane zmiany.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 235: Linia 261:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd35.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd35.png]]
|valign="top"|''opis slajdu''
|valign="top"|W kodzie funkcji Generuj należy wstawić funkcje która wyczyści zawartość ekranu okna wykresu.
|}
|}


Linia 242: Linia 268:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd36.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd36.png]]
|valign="top"|''opis slajdu''
|valign="top"|Argumenty funkcji Delete Graph Plot:
*Panel Handle – uchwyt do panelu, podajemy panelHandle
*Control ID – nazwa wykresu którego ekran chcemy wykasować, wybieramy PANEL_WYKRES
*Plot Handle – uchwyt do wykresu który chcemy wykasować, w naszym przypadku chcemy wyczyścić cały ekran wiec podajemy -1.
*Refresh – ustawiamy na IMMEDIATE DRAW aby wykres został natychmiast odświeżony (wyczyszczony). Można tez wybrać DELEYED DRAW wtedy wykres zostanie odświeżony gdy zajdzie jakiekolwiek zdarzenie związane z wykresem, np. wyrysowanie nowego wykresu, przeskalowanie itp.
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 248: Linia 279:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd37.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd37.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wypełniony formularz funkcji Delete Graph Plot. Pole status pozostawiamy puste.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 254: Linia 285:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd38.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd38.png]]
|valign="top"|''opis slajdu''
|valign="top"|Funkcja wyświetlająca tablice z próbkami w oknie graficznym. 
|}
|}


Linia 261: Linia 292:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd39.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd39.png]]
|valign="top"|''opis slajdu''
|valign="top"|Argumenty funkcji Delete Graph Plot:
*Panel Handle – uchwyt do panelu, podajemy panelHandle
*Control ID – nazwa wykresu którego ekran chcemy wykasować, wybieramy PANEL_WYKRES
*Y Array – tablica zawierająca próbki do wyświetlenia, wybieramy tab
*Number of Points – ilość próbek które chcemy wyświetlić, podajmy 256
*Y Data Type – typ danych w tablicy, ustawiamy double precision
 
Pozostałe właściwości pozostawiamy bez zmian. Dotyczą one sposobu wyświetlania wykresu (kolor, grubość i typ linii itp..)
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 267: Linia 306:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd40.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd40.png]]
|valign="top"|''opis slajdu''
|valign="top"|Wypełniony formularz funkcji Ploty.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 273: Linia 312:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd41.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd41.png]]
|valign="top"|''opis slajdu''
|valign="top"|Zmodyfikowany kod C funkcji Generuj.
|}
|}


Linia 280: Linia 319:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd42.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd42.png]]
|valign="top"|''opis slajdu''
|valign="top"|Przykładowy przebieg.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 286: Linia 325:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd43.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd43.png]]
|valign="top"|''opis slajdu''
|valign="top"|Etap 5 wprowadza możliwość regulacji amplitudy generowanych przebiegów.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 292: Linia 331:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd44.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd44.png]]
|valign="top"|''opis slajdu''
|valign="top"|Niezbędne zmiany na interfejsie użytkownika.
|}
|}


Linia 299: Linia 338:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd45.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd45.png]]
|valign="top"|''opis slajdu''
|valign="top"|Zmiana domyślnych właściwości elementu Knob:
*Constant name – zmieniamy nazwę na AMPLITUDA
*Callback function – definiujemy nową funkcję obsługi zdarzenia o nazwie Amplituda
*Zmieniamy etykietę elementu na Amplituda
 
Po dokonaniu zmian we właściwościach elementu należy wygenerować funkcję obsługi zdarzenia.
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 305: Linia 350:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd46.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd46.png]]
|valign="top"|''opis slajdu''
|valign="top"|Pobranie nastaw pokrętła Amplituda.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 311: Linia 356:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd47.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd47.png]]
|valign="top"|''opis slajdu''
|valign="top"|Niezbędne zmiany w kodzie funkcji Generuj aby pokrętło Amplituda miało możliwość zmiany amplitudy w generowanych przebiegach.
|}
|}


Linia 318: Linia 363:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd48.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd48.png]]
|valign="top"|''opis slajdu''
|valign="top"|Etap 6 prezentuje sposób odczytu wartości z wykresu za pomocą kursorów. Opisane także zostały dostępne tryby pracy elementów interfejsu użytkownika.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 324: Linia 369:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd49.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd49.png]]
|valign="top"|''opis slajdu''
|valign="top"|Rozbudowa interfejsu użytownika.
|}
|}
<hr width="100%">
<hr width="100%">
Linia 330: Linia 375:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd50.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd50.png]]
|valign="top"|''opis slajdu''
|valign="top"|Niezbędne zmiany jakie trzeba wykonać w ustawieniach wykresu aby była możliwa obsługa kursorów. Na początek należy zdefiniować funkcję obsługi zdarzenia – wpisujemy Wykres. Ponadto należy zmienić ilość wyświetlanych kursorów na wykresie.
 
W grupie właściwości Control Settings znajduje się przycisk o nazwie Cursors… - otwiera on okno konfiguracji kursorów. W formularzu konfiguracji kursorów należy zmienić ilość kursorów (Number of cursors) z wartości 0 (kursory wyłączone) na 1.
 
Kolejnym elementem we właściwościach wykresu jaki należy zmienić jest Control Mode znajdujący się w grupie właściwości Control Settings. Tryb ten powinien być ustawiony na HOT (opis trybów na następnych slajdach). 
 
Następnie należy wygenerować funkcję obsługi zdarzenia dla wykresu.
 
|}
|}


Linia 337: Linia 389:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd51.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd51.png]]
|valign="top"|''opis slajdu''
|valign="top"|W środowisku dostępne są następujące tryby pracy elementów:
*Indicator,
*Normal,
*Hot,
*Validate.
 
Tryb '''''Indicator''''' - element interfejsu użytkownika może być ustawiany (np. zmiana stanu logicznego dla diody, wyświetlanie wartości dla wyświetlacza, wyświetlanie wektora danych dla ekranu oscyloskopowego) jedynie z poziomu programu, gdyż dany element nie może wysłać zdarzeń: '''EVENT_COMMIT''' oraz '''EVENT_VAL_CHANGED'''. Dlatego jest on stosowny dla składników płyty czołowej programu, których funkcją jest jedynie przedstawianie określonych danych lub informacji beż możliwości ich pobierania od użytkownika z poziomu interfejsu. Alternatywnie tego typu elementy nazywa się: indykatorami, elementami biernymi lub wyświetlaczami.
 
|}
|}
<hr width="100%">
<hr width="100%">
Linia 343: Linia 402:
{| border="0" cellpadding="5" width="100%"
{| border="0" cellpadding="5" width="100%"
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd52.png]]
|valign="top" width="500px"|[[Grafika:LW1_M2_CZ4_Slajd52.png]]
|valign="top"|''opis slajdu''
|valign="top"|Tryb '''''Normal''''' - element pracujący w tym trybie może być ustawiany zarówno przez użytkownika aplikacji jak i z poziomu programu. Może on generować wszystkie zdarzenia oprócz '''EVENT_COMMIT'''. Alternatywnie tego typu elementy nazywa się: zadajnikami, elementami aktywnymi, przełącznikami lub ogólnie kontrolkami.
|}
|}
<hr width="100%">
<hr width="100%">

Wersja z 12:05, 29 sie 2006

wersja beta


LABORATORIUM WIRTUALNE 1

Ćwiczenie 2 - Środowisko programistyczne LabWindows/CVI

Część 4

Temat ćwiczenia:

Generacja i wyświetlanie przebiegów

Cel ćwiczenia:

Materiał zaprezentowany w czasie prezentacji ma za zadanie zaznajomić użytkownika ze sposobem generacji przebiegów i możliwości wyświetlania wyników w środowisku LabWindows/CVI. Słuchacz posiądzie niezbędne wiadomości potrzebne do zbudowania prostego wirtualnego oscyloskopu.


Plan prezentacji.

Cel ćwiczenia

Na podstawie umiejętności nabytych w poprzednich częściach ćwiczenia należy zbudować szkielet aplikacji. W czasie generacji kodu należy uwzględnić obsługę zdarzeń EVENT_COMMIT i EVENT_VAL_CHANGED.

Budowa aplikacji została podzielona na etapy. Każdy z etapów jest pewnego rodzaju rozdziałem w którym zamknięty został pewien fragment funkcjonalności aplikacji. W etapie przedstawiony został sposób generacji przebiegów.

Na interfejsie należy dodać przycisk START i wygenerować dla niego funkcję obsługi zdarzenia. Przycisk posłuży do wygenerowania próbek sygnału.

Na slajdzie przedstawione zostało miejsce gdzie należy wstawić funkcję generująca próbki sygnału sinusoidalnego. W przykładzie zostaną wygenerowane 256 próbki sygnału zawierające 2 okresy sinusoidy.

Formularz konfiguracji argumentów wywołania funkcji Sine Wale.

Argumenty wywołania funkcji Sine Wave:
  • Number of Elements – ilość próbek jaką chcemy wygenerować, wybieramy 256. Może powstać pytanie dlaczego zawsze wybieramy 2n próbek a nie na przykład 250. większość funkcji służących do analizy i obróbki danych operuje na wielkościach 2 do n. stosowanie wielokrotności 2 jest związane tez ze sprzętem kontrolno-pomiarowym używanym przy budowie wirtualnych przyrządów pomiarowych.
  • Amplitude – amplituda generowanego sygnału. Jest to wartość typu double. Ustawiamy amplitudę przebiegu na wartość 10.
  • Frequency – częstotliwość generowanego sygnału. Obliczana jest w następujący sposób: ilość okresów/ilość próbek . ponieważ chcemy wygenerować dwa okresy sinusoidy a do dyspozycji mamy tablicę o rozmiarze 256 próbek to podajemy 7.8125e-3 co jest równoważne wartości 2/256.
  • Phase – faza sygnału. Jest to zmienna w której przechowywana jest wartość fazy na jakiej funkcja zakończyła generację przebiegu. Wartość fazy podawana na wejściu funkcji pozwala na generację przebiegu od określonej fazy (wartości kąta). Jest to wartość typu double która należy zadeklarować.
  • Sine Wave – tablica w której zapisane zostaną wartości wygenerowanych próbek. Należy ją zadeklarować jako tablicę 256 elementów typu double.

Deklaracja zmiennych potrzebnych do generacji syganłu.

Wypełniony wartościami formularz funkcji SineWave. Pole status pozostawiamy puste.

Kompletny kod funkcji obsługi zdarzenia.


W celu wyświetlenia okna graficznego zawierającego wykres wygenerowanej fnkcji na panelu potrzebny będzie przycisk Wyświetl dla którego należy wygenerować funkcję obsługi zdarzenia.

W kodzie obsługi zdarzenia EVENT_COMMIT przycisku Wyświetl zostanie wstawiona funkcja YGraphPopUp(…) wyświetlająca w oknie graficznym zawartość tablicy tab.

Formularz funkcji Y Graph Popup.

Opis argumentów wywołania funkcji Y Graph Popup.

Na slajdzie przedstawiony został efekt działania aplikacji. Wyskakujące okno graficzne z wykresem funkcji umożliwia wydruk otrzymanego wykresu.

Etap 2 rozbudowy aplikacji opisuje sposób generacji i wyboru różnych przebiegów.

Wstawienie na interfejsie użytkownika elementu umożliwiającego wybór jednego z sygnałów jaki ma zostać wygenerowany.

Właściwości elementu Vertical Pointer Slide

Definiowanie par danych (etykiet i odpowiadającym im wartości0 wyświetlanych na suwaku.

Wypełniony formularz określający powiązania pomiędzy wyświetlanymi na suwaku etykietami a odpowiadającymi im wartościami.

Ustawienie wartości domyślnej jaka ma zostać wybrana na suwaku w momencie startu aplikacji.

Po zmodyfikowaniu interfejsu użytkownika pozostaje modyfikacja kodu obsługi zdarzenia EVENT_COMMIT przycisku Start tak aby generowany był wybrany przebieg.

W tym celu przed funkcją SineWave należy wstawić funkcję (Get Control Value) pobierającą położenie z suwaka SYGNAL. Wartość ma zostać zapisana w zmiennej sygnał (należy ją zadeklarować jako zmienną lokalną typu int).

Następnie po funkcji Get Control Value należy wstawić konstrukcję switch case która w zależności od wartości zmiennej sygnał wygeneruje odpowiedni przebieg.


Na slajdzie zaprezentowano sposób definiowania wartości w instrukcji switch.

Kreator instrukcji switch case.

Wstawiony kod instrukcji switch case.

Ostatnią czynnością jaką należy wykonać w funkcji Start jest wstawienie odpowiednich funkcji generujących przebiegi w odpowiednie pozycje case. Funkcje do generacji przebiegów znajdują się w:
Library > Advanced Analysis > Signal Generation

W pozycje case wstawiamy następujące funkcje:

  • case 0 – przenosimy funkcję SineWave którą wstawiliśmy w początkowej wersji funkcji Start.
  • case 1 – wstawiamy funkcje Square Wave z następującymi parametrami: ilość elementów , amplituda, częstotliwość i faza jak w funkcji SineWave; Duty Cycle – jest to procentowe wypełnienie prostokąta (pozostawiamy 50.0); Square Wave – nazwa tablicy do której mają być zapisane wygenerowane próbki (wpisujemy tab)
  • case 2 – wstawiamy funkcję Sawtooth Wave z parametrami jak funkcja Sine Wave.
  • case 3 – wstawiamy funkcję White Noise z parametrami jak funkcja Sine Wave; seed ustawiamy na -1 aby przebieg był kontynuowany

Kompletny kod C funkcji obsługi zdarzenia przycisku Start.

Efekt wykonaych zmian.

Etap 4 rozbudowy aplikacji. Dodanie graficznego okna przedstawiającego wygenerowany przebieg bezposrednio na panelu.

Wstawienie elementu typu Graph na panel.

Kolejna modyfikacja funkcji Start. Przeniesienie kodu obsługi zdarzenia z funkcji Start do nowej funkcji Generuj. Jeżeli wstawimy funkcję Generuj przed miejscem jej pierwszego użycia nie będzie potrzebny prototyp funkcji. Prototyp funkcji wstawiamy zaraz po deklaracjach zmiennych na górze kodu C programu. Prototyp funkcji: void Generuj(void);

Fragment kodu przedstawiający wykonane zmiany.

W kodzie funkcji Generuj należy wstawić funkcje która wyczyści zawartość ekranu okna wykresu.

Argumenty funkcji Delete Graph Plot:
  • Panel Handle – uchwyt do panelu, podajemy panelHandle
  • Control ID – nazwa wykresu którego ekran chcemy wykasować, wybieramy PANEL_WYKRES
  • Plot Handle – uchwyt do wykresu który chcemy wykasować, w naszym przypadku chcemy wyczyścić cały ekran wiec podajemy -1.
  • Refresh – ustawiamy na IMMEDIATE DRAW aby wykres został natychmiast odświeżony (wyczyszczony). Można tez wybrać DELEYED DRAW wtedy wykres zostanie odświeżony gdy zajdzie jakiekolwiek zdarzenie związane z wykresem, np. wyrysowanie nowego wykresu, przeskalowanie itp.

Wypełniony formularz funkcji Delete Graph Plot. Pole status pozostawiamy puste.

Funkcja wyświetlająca tablice z próbkami w oknie graficznym.

Argumenty funkcji Delete Graph Plot:
  • Panel Handle – uchwyt do panelu, podajemy panelHandle
  • Control ID – nazwa wykresu którego ekran chcemy wykasować, wybieramy PANEL_WYKRES
  • Y Array – tablica zawierająca próbki do wyświetlenia, wybieramy tab
  • Number of Points – ilość próbek które chcemy wyświetlić, podajmy 256
  • Y Data Type – typ danych w tablicy, ustawiamy double precision

Pozostałe właściwości pozostawiamy bez zmian. Dotyczą one sposobu wyświetlania wykresu (kolor, grubość i typ linii itp..)


Wypełniony formularz funkcji Ploty.

Zmodyfikowany kod C funkcji Generuj.

Przykładowy przebieg.

Etap 5 wprowadza możliwość regulacji amplitudy generowanych przebiegów.

Niezbędne zmiany na interfejsie użytkownika.

Zmiana domyślnych właściwości elementu Knob:
  • Constant name – zmieniamy nazwę na AMPLITUDA
  • Callback function – definiujemy nową funkcję obsługi zdarzenia o nazwie Amplituda
  • Zmieniamy etykietę elementu na Amplituda

Po dokonaniu zmian we właściwościach elementu należy wygenerować funkcję obsługi zdarzenia.


Pobranie nastaw pokrętła Amplituda.

Niezbędne zmiany w kodzie funkcji Generuj aby pokrętło Amplituda miało możliwość zmiany amplitudy w generowanych przebiegach.

Etap 6 prezentuje sposób odczytu wartości z wykresu za pomocą kursorów. Opisane także zostały dostępne tryby pracy elementów interfejsu użytkownika.

Rozbudowa interfejsu użytownika.

Niezbędne zmiany jakie trzeba wykonać w ustawieniach wykresu aby była możliwa obsługa kursorów. Na początek należy zdefiniować funkcję obsługi zdarzenia – wpisujemy Wykres. Ponadto należy zmienić ilość wyświetlanych kursorów na wykresie.

W grupie właściwości Control Settings znajduje się przycisk o nazwie Cursors… - otwiera on okno konfiguracji kursorów. W formularzu konfiguracji kursorów należy zmienić ilość kursorów (Number of cursors) z wartości 0 (kursory wyłączone) na 1.

Kolejnym elementem we właściwościach wykresu jaki należy zmienić jest Control Mode znajdujący się w grupie właściwości Control Settings. Tryb ten powinien być ustawiony na HOT (opis trybów na następnych slajdach).

Następnie należy wygenerować funkcję obsługi zdarzenia dla wykresu.


W środowisku dostępne są następujące tryby pracy elementów:
  • Indicator,
  • Normal,
  • Hot,
  • Validate.

Tryb Indicator - element interfejsu użytkownika może być ustawiany (np. zmiana stanu logicznego dla diody, wyświetlanie wartości dla wyświetlacza, wyświetlanie wektora danych dla ekranu oscyloskopowego) jedynie z poziomu programu, gdyż dany element nie może wysłać zdarzeń: EVENT_COMMIT oraz EVENT_VAL_CHANGED. Dlatego jest on stosowny dla składników płyty czołowej programu, których funkcją jest jedynie przedstawianie określonych danych lub informacji beż możliwości ich pobierania od użytkownika z poziomu interfejsu. Alternatywnie tego typu elementy nazywa się: indykatorami, elementami biernymi lub wyświetlaczami.


Tryb Normal - element pracujący w tym trybie może być ustawiany zarówno przez użytkownika aplikacji jak i z poziomu programu. Może on generować wszystkie zdarzenia oprócz EVENT_COMMIT. Alternatywnie tego typu elementy nazywa się: zadajnikami, elementami aktywnymi, przełącznikami lub ogólnie kontrolkami.

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu

opis slajdu