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

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.


Plan prezentacji.

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.

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ą

Jako szkielet programu wykorzystana będzie aplikacja z poprzedniej części ćwiczenia.

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

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.

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

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.

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.

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.

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.

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.

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.

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.

Na slajdzie przedstawiony został kod C funkcji Generuj() po dokonanej modyfikacji.

Przykład wygenerowanego zaszumianego przebiegu.

Etap 3 prezentuje sposób wysyłania danych do sieci.

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

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.

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.


Uruchamiane i programowe sterowanie aplikacją Data Socket Server

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ń

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).


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

Na slajdzie zostały przedstawione argumenty wywołania funkcji DS_Open.

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.

Kompletny kod funkcji obsługi zdarzenia przycisku Połącz.

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.

Opis argumentów wywołania funkcji DS_ SetDataValue.

Wypełniony danymi formularz funkcji DS_ SetDataValue.

Kod C funkcji Generuj().

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.

Aplikacja oraz program DataSocket Server w działaniu.

Etap 4 zajmuje się oprogramowaniem odbierania danych.

Dostawienie elementu pozwalającego na ustawienie aplikacji w tryb odbierania bądź wysyłania danych.

Modyfikacja właściwości przełącznika odczyt / wysyłanie.

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


Slajd przedstawia kod C instrukcji sterującej pracą Timera.

Opis argumentów wywołania funkcji SetCtrlAttribute

Opis pól formularza wyboru atrybutu.

Wypełniony formularz funkcji setCtrlAttribute.

Kod funkcji obsługi zdarzenia elementu OW.

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.


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).

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

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

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

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.