Laboratorium wirtualne 1/Moduł 2 - ćwiczenie 2/część 5

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

wersja beta



LABORATORIUM WIRTUALNE 1

Ćwiczenie 2 - Środowisko programistyczne LabWindows/CVI

Część 5

LW1 M2 CZ5 Slajd intro.png Temat ćwiczenia:

Komunikacja sieciowa

Cel ćwiczenia:

W ćwiczeniu zaprezentowany zostanie sposób wysyłania i odbierania danych z sieci. W oparciu o program zbudowany w poprzedniej części ćwiczenia zostanie zbudowana aplikacja typu P2P.


LW1 M2 CZ5 Slajd01.png Plan prezentacji.

LW1 M2 CZ5 Slajd02.png W ćwiczeniu zaprezentowany zostanie sposób wysyłania i odbierania danych z sieci. W oparciu o program zbudowany w poprzedniej części ćwiczenia zostanie zbudowana aplikacja typu P2P.

LW1 M2 CZ5 Slajd03.png Etap 1 – Zbudowanie szkieletu programu oraz rozbudowa go elementy potrzebne do realizacji wirtualnego generatora przebiegów z możliwością wysyłania danych poprzez sieć komputerową

LW1 M2 CZ5 Slajd04.png Jako szkielet programu wykorzystana będzie aplikacja z poprzedniej części ćwiczenia.

LW1 M2 CZ5 Slajd05.png Aplikacja będzie wymagała pewnych drobnych zmian interfejsu. Na początek zostanie wyłączona legenda i nazwa wykresu.

LW1 M2 CZ5 Slajd06.png Dostosowywanie interfejsu. Aplikacja do realizacji połączenia sieciowego będzie potrzebowała element tekstowy do wprowadzania przez użytkownika adresu połączenia. Ponadto potrzebne będzie pole gdzie wyświetlany będzie status połączenie i ewentualne błędy.

LW1 M2 CZ5 Slajd07.png Panel aplikacji po dodaniu wszystkich niezbędnych elementów. Dioda LED ma sygnalizować status połączenia.

LW1 M2 CZ5 Slajd08.png Etap 2 prezentuje sposób wykonywania cyklicznych czynności. W środowisku LabWindows/CVI element o nazwie Timer umożliwia wywoływanie co określony czas funkcji obsługi zdarzenia.

LW1 M2 CZ5 Slajd09.png Element umożliwia wywoływanie funkcji obsługi zdarzenia EVENT_TIMER_TICK co określoną chwilę czasową. W aplikacji może być dowolna ilość Timerów. Jeśli w aplikacji zdefiniowane zostaną np. dwa timery z identycznym odstępem czasowym to kolejność wywoływania zdarzeń poszczególnych timerów jest nieprzewidywalna.

LW1 M2 CZ5 Slajd10.png Opis właściwości elementu typu timer. Timer jest elementem nie widocznym na interfejsie użytkownika po uruchomieniu aplikacji. Włączanie lub wyłącznie generacji zdarzeń umożliwia pole Enabled, którego sterowaniem zajmiemy się w dalszej części ćwiczenia.

LW1 M2 CZ5 Slajd11.png Wszystkie funkcje związane z generacją i wyświetlaniem przebiegów umieszczone zostały w zewnętrznej funkcji Generuj(). W kodzie obsługi zdarzenia EVENT_TIMER_TICK elementu Timera należy wstawić wywołanie funkcji Generuj(). Od tej pory przebiegi będą generowane i wyświetlane co jedną sekundę. Całość kodu funkcja obsługi zdarzenia Timera została przedstawiona na slajdzie.

LW1 M2 CZ5 Slajd12.png Aby generowane przebiegi nie były idealne i choć trochę przypominały prawdziwe, zostaną zaszumiane. Na slajdzie przedstawione zostało miejsce gdzie będzie wstawiany kod generujący szum.

LW1 M2 CZ5 Slajd13.png Aby wygenerować szum należy wstawić jedną z dostępnych funkcji generujących próbki losowe. Do dyspozycji są: szum Gaussowski i biały szum. Można też wygenerować próbki ręcznie korzystając ze standardowej funkcji ANSI C rand(). W przykładzie wykorzystana zostanie funkcja GaussianNoise. Argumenty wywołania funkcji zostały przedstawione na slajdzie.

LW1 M2 CZ5 Slajd14.png Aby przebieg został zaszumiany należy dodać do siebie wartości każdej próbki o indeksie i przebiegu z próbka o indeksie i szumu. Zadanie to realizuje funkcja Add1D. sposób użycia i argumenty funkcji przedstawione zostały na slajdzie.

LW1 M2 CZ5 Slajd15.png Na slajdzie przedstawiony został kod C funkcji Generuj() po dokonanej modyfikacji.

LW1 M2 CZ5 Slajd16.png Przykład wygenerowanego zaszumianego przebiegu.

LW1 M2 CZ5 Slajd17.png Etap 3 prezentuje sposób wysyłania danych do sieci.

LW1 M2 CZ5 Slajd18.png W środowisku LabWindows/CVI wysyłanie i odbieranie danych zazwyczaj realizuje się przy wykorzystaniu protokołu dstp (DataSocket transfer protocol). W oparciu o protokół dstp będzie też zbudowana aplikacja P2P.w środowisku LabWindows/CVI do dyspozycji są też popularne protokoły:
  • http - hypertext transfer protocol
  • ftp - file transfer protocol
  • file - local files
  • opc - OPC (OLE for Process control) servers
  • logos – wewnętrzny standard do transmisji danych opracowany przez firmę National Instruments

LW1 M2 CZ5 Slajd19.png Budowanie aplikacji P2P zaczniemy od dodania funkcji startującej Data Socket Server (w skrócie nazywany DSServerem). Jest to mechanizm za pomocą którego odbywa się komunikacja za pośrednictwem gniazdek. Aplikacja łączy się z DSServerm i do niego wysyła dane. Nie ma tu jawnie zdefiniowanego portu po którym odbywa się komunikacja.

LW1 M2 CZ5 Slajd20.png Zainicjowanie DSServera zostanie dodane w głównej funkcji WinMain aplikacji zaraz po instrukcji RunUserInterface(…). Funkcja Control Local Server znajduje się w:
Library > DataSocket > Local Server

Funkcję należy wstawić z opcją DSConst_ServerLaunch.

Natomiast po funkcji DiscardPanel(…) należy dodać funkcję Control Local Server z opcją DSConst_ServerClose.


LW1 M2 CZ5 Slajd21.png Uruchamiane i programowe sterowanie aplikacją Data Socket Server

LW1 M2 CZ5 Slajd22.png Kolejnym krokiem jest zbudowanie funkcji obsługującej komunikaty pochodzące z DSServera. Niestety nie ma kreatora pozwalającego zrobić tą czynność automatycznie. Funkcję należy zbudować ręcznie wg schematu przedstawionego na slajdzie. W początkowej fazie funkcja zajmuje się jedynie obsługa komunikatów gdyż tylko takie zdarzenie znajduje się na liście (funkcja obsługi zdarzenia posiada tylko kod obsługi zdarzenia DS_EVENT_STATUSUPDATED) obsługiwanych zdarzeń

LW1 M2 CZ5 Slajd23.png W funkcji obsługi zdarzenia przycisku Połącz należy wstawić funkcje inicjujące połączenie z DSServerem.

Modyfikację kodu obsługi zdarzenia EVENT_COMMIT zaczniemy od sprawdzenia czy połączenie jest już zainicjowane – jeśli tak to zostanie zamknięte i nastąpi zwolnienie używanych wskaźników (pamięci).


LW1 M2 CZ5 Slajd24.png Aby zainicjować połączenie potrzebny jest adres z którym ma ono nastąpić. Trzeba go pobrać do tablicy znaków url.

LW1 M2 CZ5 Slajd25.png Na slajdzie zostały przedstawione argumenty wywołania funkcji DS_Open.

LW1 M2 CZ5 Slajd26.png Prawidłowo wypełniony formularz funkcji DS_Open. Pole status na razie pozostawiamy puste. W przyszłości status operacji zostanie sprawdzony a informacja o tym wyświetlona.

LW1 M2 CZ5 Slajd27.png Kompletny kod funkcji obsługi zdarzenia przycisku Połącz.

LW1 M2 CZ5 Slajd28.png Potrzebną otoczkę do nawiązywania połączenia z DSServerem mamy już za sobą. Ostatnim elementem jaki pozostał aby aplikacja mogła wysyłać dane jest wstawienie funkcji DS_SetDataValue. Umiejscowienie DS_SetDataValue w funkcji Generuj przedstawione zostało na slajdzie.

LW1 M2 CZ5 Slajd29.png Opis argumentów wywołania funkcji DS_ SetDataValue.

LW1 M2 CZ5 Slajd30.png Wypełniony danymi formularz funkcji DS_ SetDataValue.

LW1 M2 CZ5 Slajd31.png Kod C funkcji Generuj().

LW1 M2 CZ5 Slajd32.png Po uruchomieniu aplikacji należy w oknie Adres URL wpisać adres dstp Data Socket Servera. Na ogół DSServer znajduje się tam gdzie aplikacja nadająca dane więc wystarczy podać dstp://localhost/wave. Po adresie IP znajduje się nazwa dojścia (można porównać ja do numeru gniazdka). Aby sprawdzić czy aplikacja wysyła dane do DSServera należy sprawdzić status wysyłanych pakietów. Jeżeli wartość sukcesywnie się zwiększa oznacza to że aplikacja wysyła dane.

LW1 M2 CZ5 Slajd33.png Aplikacja oraz program DataSocket Server w działaniu.

LW1 M2 CZ5 Slajd34.png Etap 4 zajmuje się oprogramowaniem odbierania danych.

LW1 M2 CZ5 Slajd35.png Dostawienie elementu pozwalającego na ustawienie aplikacji w tryb odbierania bądź wysyłania danych.

LW1 M2 CZ5 Slajd36.png Modyfikacja właściwości przełącznika odczyt / wysyłanie.

LW1 M2 CZ5 Slajd37.png W kodzie obsługi zdarzenia EVENT_COMMIT elemetu OW należy pobrać położenie przełącznika do zmiennej globalnej ow zadeklarowanej jako zmienną typu integer.

Następnie należy wysterować element Timer w następujący sposób:

  • Wysyłanie – właściwość Enabled Timera ma być włączona. Pozwoli to na cykliczne wysyłanie danych do sieci.
  • Odbieranie – właściwość Enabled Timera ma być (odznaczona) wyłączona. Jeżeli przyjdą dane z sieci to wykres sam się będzie odświeżał.

Sterowanie właściwościami elementów realizuje się przy wykorzystaniu funkcji SetCtrlAtribute.

Pozwala ona na zmianę paktycznie dowolnej właściwości elementu


LW1 M2 CZ5 Slajd38.png Slajd przedstawia kod C instrukcji sterującej pracą Timera.

LW1 M2 CZ5 Slajd39.png Opis argumentów wywołania funkcji SetCtrlAttribute

LW1 M2 CZ5 Slajd40.png Opis pól formularza wyboru atrybutu.

LW1 M2 CZ5 Slajd41.png Wypełniony formularz funkcji setCtrlAttribute.

LW1 M2 CZ5 Slajd42.png Kod funkcji obsługi zdarzenia elementu OW.

LW1 M2 CZ5 Slajd43.png Wrócimy na chwilę do funkcji połącz. Zmodyfikujemy kod tak aby dioda LED była koloru czerwonego gdy system nie uzyskał połączenia z DSServerem oraz koloru zielonego gdy połączenie jest aktywne.

W tym celu należy odszukać funkcje DS_Open i przywołać formularz właściwości funkcji (klawisz Ctrl+P).

Następnie w polu status wpisujemy nazwę zmiennej dsStatus która należy zadeklarować jako zmienną lokalną. Należy zmienną dsStatus zainicjować wartością S_OK (HRESULT dsStatus = S_OK;)

Następnie należy zbudować warunek sprawdzający czy polecenie DS_Open zwróciło S_OK czy nie i w zależności od tego wysterować diodę LED.


LW1 M2 CZ5 Slajd44.png Na slajdzie przestawiony został kod C umożliwiający odczyt i sprawdzenie statusu wykonania operacji. Nowa funkcja SUCCEEDED(status) sprawdza czy działanie funkcji zakończyło się sukcesem (czy funkcja zwróciła 0 czy jakiś kod błedu).

LW1 M2 CZ5 Slajd45.png W funkcji DS_Open należy zmienić typ połączenia w zależności od tego czy ma być odczyt czy wysyłanie danych.

LW1 M2 CZ5 Slajd46.png Ostatnią modyfikacją jaką należy wykonać jest zmodyfikowanie funkcji DSCallback tak aby po pojawieniu się danych w DSServerze wyrysowała przebieg na ekranie.

LW1 M2 CZ5 Slajd47.png Aby przetestować działanie aplikacji należy uruchomić dwa programy jeden w trybie wysyłanie drugi w trybie odczyt.

LW1 M2 CZ5 Slajd48.png Zbudowany program prezentuje najprostsza metodę budowania aplikacji typu klient serwer czy aplikacji P2P. Na jej podstawie można rozbudowywać metodę komunikacji oraz sterowania wirtualnym przyrządem pomiarowym. W przykładzie wykorzystano jedynie przesyłanie tablic z elementami typu double. Istnieje też możliwość przesyłania dowolnych typów danych.

LW1 M2 CZ5 Slajd49.png