Laboratorium wirtualne 1/Moduł 2 - ćwiczenie 2/część 4: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
| 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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"|'' | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"| | |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"|'' | |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"|'' | |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
|
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. |
|
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. |
|
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. |
|
Na slajdzie zaprezentowano sposób definiowania wartości w instrukcji switch. |
|
Kreator instrukcji switch case. |
|
Wstawiony kod instrukcji switch case. |
|
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. |
|
Fragment kodu przedstawiający wykonane zmiany. |
|
W kodzie funkcji Generuj należy wstawić funkcje która wyczyści zawartość ekranu okna wykresu. |
|
Wypełniony formularz funkcji Delete Graph Plot. Pole status pozostawiamy puste. |
|
Funkcja wyświetlająca tablice z próbkami w oknie graficznym. |
|
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. |
|
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. |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |
|
opis slajdu |





























































