Projektowanie i uruchamianie prostego systemu pomiarowego z
Transkrypt
Projektowanie i uruchamianie prostego systemu pomiarowego z
LABORATORIUM SYSTEMÓW POMIAROWYCH KTP IR PW ŚRODOWISKO PROGRAMOWE LabView (materiały pomocnicze do ćwiczenia) Opracowali: mgr inż. Piotr Bilski dr inż. Wiesław Winiecki Warszawa 2003 1. Wstęp LabVIEW jest zintegrowanym środowiskiem programowania opracowanym (i sukcesywnie uprawnianym) przez firmę National Instruments. Jest to pakiet oprogramowania służący do projektowania wirtualnych przyrządów pomiarowych. Obecnie najnowszą dostępną wersją pakietu jest wersja 7.0. Główne cechy środowiska LabVIEW to: - - - - - obiektowe podejście do programowania (każdy element płyty czołowej, fukcji wewnętrznej programu lub podprzyrządu traktowany jest jak obiekt z właściwościami i metodami z nim związanymi), programowanie odbywa się w języku graficznym „G”, który w przeciwieństwie do klasycznych języków oferuje ikony funkcji łączone na diagramach przy pomocy „nitek” zamiast formy tekstowej wykorzystywanie bibliotek dołączanych dynamicznie (DLL) umożliwia korzystanie z funkcji standardowo niedostępnych w pakiecie LabVIEW. Jest to przydatne podczas tworzenia skomplikowanego lub nietypowego przyrządu wirtualnego łączność ze specjalizowanymi urządzeniami takimi jak karta akwizycji danych odbywa się przy pomocy standardu bibliotecznego wejścia/wyjścia VISA. Jest to standard uwzględniający wszystkie najważniejsze interfejsy wykorzystywane w metrologii, zapewniający uniwersalność pisanych aplikacji gotowy program może zostać skompilowany do postaci samodzielnego programu dzięki jednemu z wewnętrznych narzędzi pakietu. Dzięki temu może on być uruchamiany na komputerach bez zainstalowanego środowiska LabVIEW, jednak z pewnymi obostrzeniami (wymagana jest instalacja na stanowisku docelowym środowiska uruchomieniowego LabVIEW Run-Time) Przedstawione cechy czynią z LabVIEW środowisko niezwykle popularne, dostępne na wielu platformach programowych i sprzętowych (poczynając od Windows, poprzez UNIX-a, a kończąc na komputerach typu Macintosh). Pakiet jest stosunkowo łatwy w obsłudze, a intuicyjny sposób tworzenia kodu sprawia, iż jest w on w obrębie zainteresowań nie tylko inżynierów, ale również osób na co dzień nie związanych z projektowaniem przyrządów. 2. Opis wybranych ikon narzędziowych i funkcyjnych LabVIEW uruchamia się poprzez dwukrotne kliknięcie myszą na ikonie: lub też wybranie odpowiedniej pozycji z menu START Każdy przyrząd wirtualny (Virtual Instrument) od strony programowej składa się z dwóch głównych elementów: płyty czołowej przyrządu oraz okna (zwanego diagramem) edycji kodu. Pomiędzy tymi dwoma obiektami istnieje ścisły związek, bowiem elementy umieszczane na płycie czołowej są reprezentowane przez swoje odpowiedniki na diagramie. Podobnie, wyniki działania poszczególnych funkcji mogą być wizualizowane na płycie czołowej. 2 Obsługa obu przedstawionych okien odbywa się niemal wyłącznie przy pomocy myszy. Podczas pracy projektowej niezbędne stają się dodatkowe okienka, z których każde zostanie przedstawione poniżej: 2.1. Okno narzędziowe Okno to jest przydatne zarówno podczas pracy w trybie płyty czołowej, jak i diagramu. Najważniejsze ikonki znajdujące się w nim to: narzędzie operacyjne – służy do wybierania elementów, zmiany nastaw kontrolek itp. narzędzie pozycjonowania – służy do wybierania elementów, zmiany ich wielkości, przemieszczania itp. narzędzie tekstowe – służy do wpisywania tekstu w kodzie oraz na płycie czołowej, pozwala łatwo zmienić wartości kontrolek. narzędzie połączeniowe – służy do łączenia obiektów w diagramie „nitkami” przenoszącymi dane narzędzie przemieszczania – służy do sprawnego przesuwania obszaru płyty czołowej lub diagramu narzędzie zatrzymania programu – pozwala ustawić punkt przerwania (breakpoint) i sprawdzić np. stan zmiennych w wybranym momencie działania programu narzędzie pobierania koloru – służy do ustalania aktywnego kolory poprzez wybranie dowolnego punktu w oknie 3 2.2. Okno kontrolek Jest to okno aktywne tylko podczas pracy z płytą czołową. Zawiera wszystkie elementy potrzebne do stworzenia przejrzystego i funkcjonalnego panelu. Znajdują się tutaj kontrolki (czyli obiekty służące do zmiany nastaw przyrządu) oraz wskaźniki (obiekty wyświetlające wyniki działania przyrządu). Dodatkowo znajdują się tu również elementy dekoracyjne. Najważniejsze grupy obiektów to: kontrolki i wskaźniki numeryczne umożliwiające ustawienie lub odczytanie wartości liczbowych dowolnego typu obsługiwanego przez LabVIEW kontrolki i wskaźniki binarne, służące zwykle jako przełączniki wyzwalające przyrząd, uruchamiające poszczególne partie programu lub zatrzymujące pracę przyrządu kontrolki i wskaźniki tekstowe służące do umieszczania w zmiennych napisów oraz ścieżek dostępu do plików wyświetlacze graficzne służą do umieszczania na panelu wykresów dwu- i trójwymiarowych kontrolki cykliczne wykorzystywane są do tworzenia list, w których wybiera się jedną spośród kilku dostępnych opcji (np. kształt sygnału, rodzaj filtru itp.) Każda grupa elementów zawiera kilka kontrolek lub wskaźników, a także czasami kolejne podgrupy, dzięki czemu wszystkie elementy ułożone są w strukturze hierarchicznej. Ułatwia to znacząco dotarcie do wybranych obiektów. PRZYKŁAD Grupa wykresów (Graph) zawiera oprócz kilku rodzajów rysunków grupę kontrolek (controls), ta z kolei przechowuje grupę typów danych (datatypes). Dotarcie do tych ostatnich wymaga pojedynczych kliknięć lewym przyciskiem myszy na każdej z odpowiednich ikon: 4 2.3. Okno funkcji To okno aktywne jest tylko podczas pracy w trybie diagramu. Udostępnia ono wszystkie obiekty, jakie mogą zostać umieszczone na w kodzie, począwszy od zmiennych, poprzez funkcje, a skończywszy na podprzyrządach (subVI’s). Podobnie jak w przypadku okna kontrolek są one pogrupowane według kategorii i zhierarchizowane. Najważniejsze grupy to: obiekty sterowania przepływem programu (struktury). Tutaj znajdują się wszystkie obiekty potrzebne do zapewnienia właściwego przepływu danych pomiędzy funkcjami. W ogólności są to sekwencje, pętle, struktury decyzyjne. funkcje, zmienne i stałe związane z numerycznymi typami danych, takie jak mnożenie, dodawanie, zaokrąglanie, funkcje trygonometryczne, logarytmiczne itp. funkcje, zmienne i stałe związane z binarnym typem danych, takie jak operatory logiczne i funkcje zaokrąglenia. funkcje, zmienne i stałe związane z działaniami na łańcuchach znaków. Tutaj znajdują się funkcje konwersji, łączenia łańcuchów, wyszukiwanie wzorca itp. funkcje, zmienne i stałe związane z działaniami na macierzach i wektorach Tutaj znajdują się operacje inicjalizacji macierzy, zmiany wymiaru, łączenia, dodawania i mnożenia macierzy. operatory porównania. Tutaj znajdują się wszystkie potrzebne funkcje sprawdzające warunki logiczne, a także wyszukujące wartości ekstremalne w wektorze danych, sprawdzające typ danych itp. funkcje związane z tworzeniem i działaniem okien dialogowych oraz operacjami czasowymi. Tutaj znajdują się funkcje mierzące czas, opóźniające działanie programu, gotowe okna dialogowe, a także okna obsługi błędów. funkcje przetwarzania sygnałów. Ta bardzo obszerna grupa zawiera operacje związane z generacją sygnałów (konieczne podczas symulacji) a także funkcje standardowo wykorzystywane podczas analizy sygnału (okienkowanie, filtrowanie, transformaty, operacje statystyczne, takie jak liczenie średnich, odchyleń standardowych itp.) funkcje komunikacji ze sprzętem. Tutaj znajdują się gotowe sterowniki urządzeń (w razie potrzeby mogą zostać doinstalowane kolejne) oraz procedury umożliwiające komunikację z przyrządami zewnętrznymi poprzez magistralę GPIB, łącze szeregowe, a także uniwersalny standard VISA. 5 funkcje komunikacji zdalnej. Tutaj znajdują się procedury służące do ustanowienia komunikacji przez sieć komputerową (protokoły TCP, IP, UDP), łącze podczerwieni, Internet (mechanizm ActiveX itp.). funkcje obsługi przebiegów sygnałowych. Jest to nowość od wersji 6i, w której wprowadzono szereg ułatwień dla operacji na wektorach sygnałów. Znajdują się tu operacje generacji przebiegów, działań matematycznych (dodawanie, mnożenie itp.), uzyskiwania informacji o ich parametrach, działań z dziedziny cyfrowego przetwarzania sygnałów itp. Wszystkie trzy przedstawione okna mogą być zarówno ukrywane, jak i sprowadzane na pierwszy plan.. Można tego dokonać w menu Window (komendy Show Functions Palette, Show Controls Palette oraz Show Tools Palette). Dodatkowo, okna kontrolek i funkcji mogą zostać przywołane w każdej chwili przy pomocy prawego klawisza myszy (musi być naciśnięty na tle okna panelu czołowego lub diagramu). 2.4. Ikony sterowania programem Istnieją dwa dodatkowe obszary projektowe, które okazują się niezwykle pomocne podczas tworzenia nowego przyrządu wirtualnego. Pierwszym z nich jest pozioma belka pod menu tekstowym w górnej części obu okien: Ikony po lewej stronie odpowiadają procedurom uruchamiania i zatrzymywania pracy przyrządu. Są to odpowiednio: przycisk jednorazowego uruchomienia przyrządu. Po jego naciśnięciu przyrząd raz wykona zadanie, do którego został stworzony i zakończy działanie (chyb że zawiera pętle zmuszające go do dalszej pracy) przycisk pracy ciągłej. Po jego naciśnięciu przyrząd będzie działał w nieskończonej pętli aż do naciśnięcia przycisku zatrzymania przycisk zatrzymania pracy przyrządu. Jego naciśnięcie powoduje zakończenie pracy programu bez względu na jego stan wewnętrzny. przycisk wstrzymania (pauzowania) pracy przyrządu. Jego naciśnięcie powoduje zastopowanie pracy programu, jednak wszystkie zmienne pozostają w pamięci. Ponowne naciśnięcie przycisku spowoduje kontynuację pracy programu. Przycisk jednorazowego uruchomienia przyrządu posiada też właściwość sygnalizującą, iż w programie są błędy uniemożliwiające działanie przyrządu. W takiej sytuacji przycisk wygląda następująco: Jest to informacja dla użytkownika, iż musi poprawić kod. Przyciski na belce znajdujące się po prawej stronie służą do zmiany czcionki, jaką pisany jest tekst w kodzie i na panelu czołowym oraz grupowania na nim obiektów. Z kolei w oknie diagramu belka wygląda nieco inaczej: 6 Znajdują się tu cztery dodatkowe przyciski: Przycisk wizualizujący przepływ danych w kodzie. Początkujący programiści wykorzystują go aby dowiedzieć się, w jakiej kolejności wykonywane są poszczególne fragmenty kodu przyciski służące do sekwencyjnego uruchamiania kodu. Przydatne są w momencie, gdy do kodu wstawione zostaną punkty zatrzymania (breakpoints), dzięki czemu można obserwować uruchamianie kolejnych funkcji. Program zatrzymuje się po dotarciu do każdej funkcji i czeka na działanie projektanta. Drugie okno to okno pomocy kontekstowej. Jeśli jest ono otwarte, uaktywnienie większości funkcji (zaznaczenie ich poprzez kliknięcie na nich lewym przyciskiem myszy) powoduje pokazanie opisu funkcji wraz z omówieniem terminali. Pomoc kontekstowa uruchamiana jest poprzez komendę Show Context Help z menu Help. 2.5. Pętle i struktury sterujące Ze względu na krytyczne znaczenie tego bloku funkcji zostanie on przedstawiony nieco szerzej. Sterowanie kodem ilustrowanym na diagramie związane z przepływem danych pomiędzy funkcjami odbywa się również w postaci graficznej. Zarówno pętle, jak i struktury decyzyjne wykorzystywane są w następujący sposób: użytkownik wybiera jedną ze struktur sterujących z menu podręcznego, a następnie obramować kursorem o zmienionym wyglądzie ten fragment kodu, który ma znajdować się w jej obrębie. Wszystkie opcje dotyczące struktur dostępne są po naciśnięciu prawego przycisku myszy na krawędzi struktury. Następujące struktury sterujące dostępne są w menu: sekwencja stertowa (stacked sequence) – w LabVIEW do wersji 6.1 włącznie była to jedyna struktura synchronizująca przepływ danych. Należy ją wykorzystywać w większości przypadków, zwłaszcza wtedy, kiedy wydarzeń następujących po sobie jest dużo. Tworzone są tu po kolei „klatki filmowe”, które ułożone są w określonym porządku względem innych klatek. Dzięki temu projektant może zapewnić uruchamianie konkretnych funkcji przed innymi. W sekwencji stertowej jednocześnie widoczna jest tylko jedna klatka. Istnieje możliwość przekazywania danych pomiędzy klatkami przy pomocy zmiennej lokalnej sekwencji (sequence local). sekwencja płaska – nowość w LabVIEW 7.0, działa bardzo podobnie jak sekwencja stertowa, jednak wszystkie klatki ustawione są na diagramie obok siebie i widoczne jednocześnie. Należy jej używać wtedy, kiedy planowana liczba klatek jest stosunkowo niewielka. Poza tym sekwencja płaska ma takie samo znaczenie funkcjonalne jak sterowa. struktura decyzyjna CASE – ma ona takie samo znaczenie jak struktura CASE w każdym innym języku programowania, gdzie pole wyboru ma charakter wyliczeniowy. W LabVIEW można podejmować zarówno decyzje dwuwartościowe, jak i wielowartościowe. Uwaga: brak podłączenia nitki danych do pola wyboru generuje błąd kompilatora! pętla FOR - w LabVIEW istnieją tylko dwa rodzaje pętli. Pierwsza wykorzystywana jest w sytuacji, kiedy liczba iteracji została z góry ustalona. Możliwe jest wzajemne zagnieżdżanie pętli for, dzięki czemu da się np. tworzyć wielowymiarowe macierze. 7 pętla WHILE – ten rodzaj pętli używany jest w przypadku, kiedy liczba iteracji jest z góry nieznana, bądź też ustala się dopiero po uruchomieniu pętli. W tym przypadku konieczne jest podanie warunku zatrzymania. Pętla WHILE bardzo często wykorzystywana do tworzenia głównej pętli programu (przyrząd działa do momentu naciśnięcia przycisku STOP). struktura tworzenia wzorów (formula node) – LabVIEW umożliwia w prosty sposób tworzenie specjalnych rodzajów funkcji, których wykonanie polega na bezpośrednim obliczeniu wartości z podanych wzorów. PRZYKŁAD (UŻYCIE SEKWENCJI) Chcąc wyświetlić dwa okna dialogowe, jedno po drugim w ustalonej kolejności, należy w kodzie programu umieścić obiekt sekwencji (z grupy Structures np. Flat Sequence Structure). Następnie należy dodać drugą ramkę, klikając prawym przyciskiem myszy na krawędzi ramki i wybierając z menu kontekstowego opcję Add Frame After. Posiadając dwie ramki do obu trzeba wstawić funkcję okna dialogowego z grupy Time & Dialog (polecenie One Button Dialog) oraz stałe znakowe, do których wprowadzi się napisy wyświetlane w oknach dialogowych. Po wykonaniu wszystkich czynności kod powinien wyglądać następująco: Przykład wykorzystania pętli podany zostanie w dalszej części instrukcji. 2.6. Typy danych LabVIEW obsługuje większość typów danych właściwych innym językom programowania. W przeciwieństwie do nich, tutaj deklaracja typu reprezentowana jest przez kolor obiektu lub nitki łączącej. Generalnietypy danych można podzielić na proste i złożone 1. Podstawowe typy proste to: • • • • • typ całkowitoliczbowy. Obejmuje on zarówno typy ze znakiem (integer 8-, 16- i 32bitowy), jak i bez znaku (unsigned integer 8-, 16- i 32-bitowy). W kodzie reprezentowany jest on przez kolor niebieski. typ zmiennoprzeciwnkowy. Obejmuje zarówno liczby pojedynczej, jak i podwójnej precyzji. Reprezentowany jest przez kolor pomarańczowy.. typ binarny. Dotyczy obiektów o logice dwuwartościowej. Reprezentowany jest przez kolor zielony. typ łańcuchowy. Odpowiada za wszystkie operacje na łańcuch znakowych i pojedynczych znakach. Reprezentowany jest przez kolor fioletowy. typ wyliczeniowy. Dotyczy obiektów mogących posiadać tylko kilka wartości. Ponieważ typowi temu odpowiadają liczby całkowite, jest on również reprezentowany przez kolor niebieski. 8 • • • typ ścieżkowy. Właściwa dla LabVIEW odmiana typu łańcuchowego, która służy niemal wyłącznie do podawania ścieżek do plików i katalogów. Typ identyfikatora sesji VISA. Odmiana typu łańcuchowego służąca do obsługi funkcji odpowiedzialnych za sesję VISA. Reprezentuje ją kolor bordowy. W obrębie większości typów danych istnieje subtelne rozróżnienie pomiędzy typami jedno- i wielowymiarowymi. Te ostatnie mają ten sam kolor, co odpowiadające im typy jednowymiarowe, jednak ich nitki są grubsze. Do obsługi takich danych są oczywiście potrzebne inne kontrolki na panelu czołowym. PRZYKŁAD Chcąc stworzyć wektor wypełniony dowolną wartością (operacja taka nazywana jest inicjalizacją macierzy) można skorzystać z funkcji Initialize Array w menu Array. Wymaga ona dwóch argumentów: wartość wypełniająca oraz liczba elementów wektora. Ta pierwsza może być losową liczbą z przedziału (0;1), generowaną przez funkcję Random Number w menu Numeric. Drugi argument może być stałą typu integer o wartości np. 10. Po połączeniu zmiennych z funkcją należy jeszcze na panelu czołowym dodać kontrolkę wyświetlającą zawartość wektora. Dokonuje się tego przy pomocy kontrolki Array z menu Array & Cluster okna kontrolek panelu czołowego. Na płycie czołowej powstaje wówczas pusty prostokąt, który trzeba jeszcze wypełnić odpowiednim typem danych. W tym celu należy wybrać odpowiedni wyświetlacz, np. cyfrowy (Numeric Indicator) z menu Numeric i „upuścić” go nad prostokątem wektora. Wówczas pojawi się dopiero pełnowartościowa kontrolka obsługująca wygenerowany wektor: Na diagramie powinien znajdować się następujący kod: W przypadku gdybyśmy chcieli wygenerować nie wektor, lecz macierz, musimy dodać jeden argument do funkcji Initialize Array. W tym celu trzeba kursorem myszy uchwycić niebieski punkt na środku dolnej krawędzi ikony i przeciągnąć go w dół. Dzięki temu można będzie podać drugi wymiar macierzy, który powinien, tak jak poprzednio, być stałą typu integer. Aby program dał się skompilować trzeba jeszcze dodać wymiar do kontrolki na panelu czołowym. Należy prawym klawiszem myszy wywołać menu podręczne kontrolki i wybrać opcję Add Dimension. Wówczas można podłączyć wyjście funkcji generującej macierz z wejściem wyświetlacza. 9 Należy zwrócić uwagę na dwie rzeczy: nitka łącząca wyjście funkcji z wyświetlaczem jest grubsza niż poprzednio. Oznacza to, iż jest nią przesyłana macierz. Druga kwestia to możliwość rozciągania kontrolki wyświetlającej zawartość macierzy lub wektora. Wystarczy uchwycić ją na rogu i pociągnąć w dół lub na boki. 2. Typy złożone (inaczej klastry) to odpowiedniki struktur w klasycznych językach programowania. Są to zmienne zawierające w sobie więcej niż jedną zmienną (mogą być one różnych typów). Charakteryzują je grube, prążkowane linie. • struktura obsługi błędów, zawierająca trzy najważniejsze komponenty: - informacja o wystąpieniu błędu (typ binarny) - numer błędu (liczba całkowitoliczbowa: dodatnia, jeśli wystąpiło ostrzeżenie, ujemna dla błędu) - opis źródła błędu (zmienna łańcuchowa) Struktura obsługi błędów jest reprezentowana przez kolor fioletowy. • typ przebiegów sygnałowych (waveform). Jest to rodzaj klastra, który zawiera specyficzne dane dotyczące wektora sygnału. Są to przede wszystkim: - t0 – moment rozpoczęcia generacji sygnału (decyduje o offsecie) - dt – odległość na osi czasu między próbkami sygnału (determinowana przez częstotliwość próbkowania) - Y – wektor próbek sygnału Typ przebiegów sygnałowych jest reprezentowany przez kolor brązowy PRZYKŁAD (wykorzystanie typu waveform) Podczas projektowania prostego generatora sygnałowego w kodzie umieszczona została funkcja Basic Function Generator z grupy Waveform -> Waveform Generation. Aby uzyskać informacje na temat charakteru wygenerowanego sygnału, należy wykorzystać funkcję Get Waveform Components z grupy Waveform, a następnie połączyć ją z funkcją generacji sygnału. Aby uzyskać trzy terminale wyjściowe (odpowiadające t0, dt i Y), należy uchwycić ikonę Get Waveform Components za prawy dolny róg i pociągnąć w dół. Odczytanie uzyskiwanych wartości jest możliwe po umieszczeniu na panelu czołowym trzech wskaźników i połączeniu ich nitkami z terminalami poprzedzającej je funkcji. 10 Jedną z ważniejszych operacji na typach złożonych (klastrach) jest uzyskiwanie dostępu do zmiennych składowych oraz tworzenie klastra z kilku zmiennych prostych. Operacji tych dokonuje się poprzez funkcje bundle oraz unbundle (względnie bundle by name i unbundle by name) dostępnych w grupie Cluster w oknie Functions Palette. PRZYKŁAD (użycie funkcji dostępu do składowych klastra) Mając w kodzie klaster obsługi błędu możemy uzyskać dostęp do jego składowych używając funkcji unbundle (wyższa na rysunku) oraz unbundle by name. Należy zauważyć, że obie funkcje dopasowują liczbę terminali wyjściowych do liczby zmiennych składowych klastra. Różnica między funkcjami polega tylko na wizualnym oznaczeniu terminali wyjściowych (przez typ zmiennej, bądź jej nazwę w klastrze). LabVIEW oferuje wygodną lecz czasem zdradliwą właściwość automatycznej konwersji danych do typu akurat wymaganego. Oznacza to, że projektant, nie musi troszczyć się o ręczną zamianę typu, środowisko programowe zrobi to za niego. W niektórych sytuacjach może jednak dojść do niebezpiecznego w skutkach nieporozumienia, dlatego też na ogół zaleca się ręczną konwersję przy pomocy dostępnych w LabVIEW funkcji. 3. Struktura programu Najistotniejszymi elementami kodu LabVIEW są funkcje oraz podprzyrządy, które wykonują większość zadań programu. Zasadnicza funkcja między funkcjami a podprzyrządami test taka, że te ostatnie zawierają płytę czołową, przy pomocy której można dokonywać nastaw. Dodatkowo, mogą też działać jako samodzielne programy. W LabVIEW 7.0 wprowadzono nowy rodzaj przyrządu zwany ekspresowym. Po jego umieszczeniu w kodzie natychmiast pojawia się płyta czołowa umożliwiająca konfigurację. 11 Uwaga: Jakkolwiek przyrządy ekspresowe są bardzo wygodnymi narzędziami ze względu na wyjątkową prostotę obsługi, ze względu na niewielką kontrolę projektanta nad sposobem działania, nie zaleca się używania ich w wielu profesjonalnych zastosowaniach, np. wymagających synchronizacji czasowej (praca w trybie Real-Time). Interakcja pomiędzy płytą czołową i oknem diagramu ma charakter zdarzeń jednocześnie zachodzących na obu obiektach. Przykładem może być umieszczenie kontrolki na płycie czołowej. Operacji odpowiada pojawienie się w oknie kodu zmiennej związanej z tą kontrolką. Należy zauważyć, że kontrolki związane są z wejściami obiektów programowych, podczas gdy wyświetlacze odpowiadają wyjściom tych obiektów. Każdy obiekt w kodzie posiada zestaw wejść/wyjść zwanych terminalami. Odpowiadają one argumentom oraz wartościom zwracanym funkcji w klasycznych językach programowania. Oczywistym jest, że możliwe jest łączenie wyłącznie wejść z wyjściami, każda inna kombinacja wywołuje sprzeciw kompilatora. Łączenie obiektów programowych odbywa się przy pomocy narzędzia połączeniowego (po jego wybraniu kursor zmienia się kołowrotek). Po jego wybraniu należy najechać na obiekt, którego wyjście chcemy połączyć. Wówczas pokazane zostaną wszystkie terminale, rola użytkownika sprowadza się zaś do wybrania konkretnego. Następnie należy przemieścić kursor (od tej chwili będzie się za nim „ciągnąć” przerywana linia – „nitka”) nad obiekt, którego wejście chcemy połączyć z uprzednio wybranym wyjściem. Analogicznie trzeba dokonać wyboru odpowiedniego terminala. Jeśli wszystko zostało wykonane prawidłowo, w oknie kodu powinna pokazać się kolorowa linia łącząca obiekty. Jej kolor odpowiada konkretnemu typowi danych. W przypadku popełnienia błędu, np. połączenia dwóch terminali tego samego typu, pojawi się przerywana linia przekreślona czerwonym krzyżykiem. Oznacza to, że operacja została wykonana niewłaściwie a połączenie należy poprawić. PRZYKŁAD Stworzenie dwóch prostych kontrolek numerycznych na płycie czołowej wymaga użycia grupy Numeric w oknie kontrolek. Należy zwrócić uwagę na wybór odpowiedniego obiektu (kontrolki w przeciwieństwie do wyświetlaczy mają dwie małe strzałki po lewej stronie wyświetlacza, które pozwalają zmieniać jego wartość). Wybór odbywa się poprzez kliknięcie lewym przyciskiem myszy na odpowiednim obiekcie (kursor zmienia wówczas kształt na kontur tego właśnie obiektu), przeniesienie go nad okno płyty i powtórne kliknięcie w wybranym miejscu (co powoduje jego upuszczenie). Z kolei umieszczenie wskaźnika odbywa się w sposób analogiczny, należy jedynie pamiętać, aby wybrać obiekt bez strzałek po lewej stronie. W wyniku tych działań na oknie panelu powinny pojawić się trzy wyświetlacze, na diagramie zaś trzy odpowiadające im zmienne: 12 W celu stworzenia programu obliczającego iloczyn dwóch liczb należy jeszcze dodać funkcję mnożenia, dostępną w oknie funkcji, w grupie numerycznych typów danych: ostatnią operacją jest łączenie odpowiednich terminali. Funkcja mnożenia posiada dwa wejścia i jedno wyjście. Te pierwsze zostaną połączone z zmiennych powiązanych z kontrolkami, to ostatnie zaś ze zmienną odpowiadającą wskaźnikowi. Łączenie odbywa się w sposób pokazany na rysunku: 13 Ostatecznie kod powinien wyglądać w sposób następujący: Warto zauważyć, że w momencie umieszczenia w diagramie funkcji mnożenia przycisk uruchomienia programu zmienił postać na „zepsutą”, informując użytkownika, że w kodzie znajdują się błędy i w takiej postaci program nie zostanie skompilowany. Dopiero po połączeniu wszystkich terminali program może zostać uruchomiony, co sygnalizuje „cała” strzałka na przycisku uruchomienia. W przypadku popełnienia błędu przez projektanta oba okna LabVIEW mogą wyglądać następująco: Chcąc stworzyć program, który będzie działał cały czas (do momentu zatrzymania przez użytkownika), a nie tylko jednorazowo, należy wzbogacić powyższy diagram o pętlę WHILE. Wystarczy wybrać ją z menu podręcznego i objąć cały kod, aby otrzymać diagram o następującym wyglądzie: 14 Aby przyrząd działał prawidłowo, trzeba jeszcze dodać przycisk STOP, zatrzymujący jego pracę i połączyć go z warunkiem zatrzymania (czerwony kwadrat w prawym dolnym rogu pętli). Przycisk STOP znajduje się w grupie boolean okna kontrolek. Ostatecznie okna diagramu i płyty czołowej powinny wyglądać następująco: Błędy Kiedy projektant zdaje sobie sprawę z istnienia błędów w diagramie, jednak nie zna ich przyczyny, powinien skorzystać z okna listy błędów, w którym znajdują się opisy wszystkich problemów uniemożliwiających kompilację. Może ono zostać uruchomione poprzez polecenie Show Error List w menu Window, bądź też w wyniku naciśnięcia przycisku jednorazowego uruchomienia programu w momencie, kiedy strzałka na jego ikonie jest „złamana”. Każdy wiersz oznacza tam jeden błąd, przy czym jeden problem może być przyczyną wielu błędów. Dwukrotne kliknięcie lewym przyciskiem myszy na każdym wierszu (lub naciśnięcie przycisku Show Error) przenosi do obszaru diagramu, który należy poprawić. Lista wygląda następująco: 15 Sterowniki Specjalną odmianą funkcji są sterowniki programowe sprzętu dołączonego do komputera PC. Traktowane są one tak samo, jak wszystkie inne obiekty programowe, ich interpretacja jest jednak nieco inna. Sterownik to zestaw programów (funkcji) służących do komunikacji ze sprzętem, zatem każde jego użycie pociąga za sobą reakcję urządzenia zewnętrznego. W ramach sterownika znajdują się funkcje konfiguracji i wyzwolenia przyrządu, można je jednak rozbudować o dodatkowe możliwości. Przykładem sterownika jest instalowany standardowo w LabVIEW sterownik multimetru HP34401 (dostępny w grupie Instrument I/O w podgrupie Instrument Drivers). Zawiera on funkcje potrzebne do oprogramowania urządzenia od wstępnej konfiguracji, poprzez sterowanie jego pracą, aż po kończenie sesji. PRZYKŁAD (sterowanie pomiarami przy pomocy multimetru HP 34401) Chcąc zaprojektować aplikację wykonującą pomiary w trybie ciągłym aż do wyłączenia przyrządu, potrzebujemy cztery funkcje wchodzące w skład sterownika multimetru. Są to: HP 34401A Initialize, HP 34401A Configure Measurement, HP34401A Read Meas oraz HP34401A Close. Wszystkie one można znaleźć w grupie funkcji Instrument I/O w podgrupie Instrument Drivers. Funkcję inicjującą pracę multimetru umieszczamy przed główną pętlą programu, zaś kończącą jego pracę – za tą pętlą. Wewnątrz umieszczamy pozostałe funkcje, które działają do momentu naciśnięcia przycisku STOP. Wszystkie funkcje łączymy poprzez identyfikator sesji VISA (brązowa linia łącząca górne części ikon funkcji) oraz obsługę błędów poprzez obsługę błędów (fioletowa linia na dole). Uwaga: by zapewnić prawidłową obsługę błędów, należy ją umieścić zarówno wewnątrz pętli, jak i na zewnątrz, za ostatnią funkcją. Jeśli zabraknie jej wewnątrz pętli, do momentu zatrzymania programu nie będzie wiadomo, że wystąpił błąd! 16 Przepływ danych W przeciwieństwie do klasycznych języków programowania LabVIEW nie jest związany ze sztywnym sekwencyjnym uruchamianiem kodu. Wynika to z faktu, iż czasami trudno jest określić, które funkcje zostaną wywołane jako pierwsze. Ogólna zasada środowiska związana jest z istnieniem (lub nie) danych potrzebnych do uruchomienia funkcji na jej wejściu. Zawsze najpierw rozpoczynają działanie te funkcje, które mają dane na wszystkich terminalach wejściowych. Jeśli jednak jest to prawdą dla kilku funkcji, powstaje problem ustalenia, w jakiej kolejności zadziałają. Jeśli projektant chce wymusić określoną sekwencję, powinien użyć do tego celu struktury sekwencji 4. Informacje dodatkowe 4.1. Konfigurowanie obiektów na panelu czołowym Umieszczenie kontrolki lub wskaźnika na płycie czołowej przyrządu rzadko wyczerpuje oczekiwania projektanta. bardzo często zachodzi potrzeba np. zmiany zakresu liczb, które można wstawić do kontrolki, zmiany typu danych, umieszczenia w kodzie właściwości obiektu itp. Wszystkie operacje dokonuje się w menu kontekstowym, które uaktywniane jest przez prawy klawisz myszy naciśnięty nad elementem panelu. Poniżej przedstawione są najważniejsze pola tego menu: • • • • • • Visible Items – pozwala na skonfigurowanie, które elementy pomocnicze obiektu powinny być widoczne. Np. w przypadku listy zaznaczenie opcji Digital Display powoduje umieszczenie obok wybieranej nazwy również liczby jej odpowiadającej. Find Terminal – ułatwia znalezienie na diagramie zmiennej odpowiadającej kontrolce. To samo można osiągnąć klikając na niej dwukrotnie lewym przyciskiem myszy. Change to Indicator/ Change to Control – zmienia typ obiektu z wyświetlacza na kontrolkę i vice versa. Create – jest to podmenu, które umożliwia stworzenie kilku dodatkowych elementów związanych z kontrolką lub wyświetlaczem. Może to być np. zmienna lokalna (Local Variable), stanowiąca po prostu kopię zmiennej, która może zostać wykorzystana w innym miejscu kodu (jest to przydatne, gdy do tego samego obiektu z płyty czołowej trzeba się odwoływać z zupełnie różnych obszarów diagramu). Z drugiej strony menu to umożliwia tworzenie i manipulowanie właściwościami obiektów, takimi jak widoczność, czy blokowanie dostępu (Visible, Disabled). Działań tych dokonuje się przy pomocy polecenia Property Node. Representation – służy do zmiany typu danych reprezentowanego przez obiekt. Data Range – umożliwia ustalenie, jakie mogą być wartości zmiennej, zarówno krańcowe (minimalna i maksymalna), jak i początkowa (domyślna). 17 • • Format & Precision – umożliwia zmianę formatu wyświetlanych liczb (automatyczny, naukowy itp.), a także liczbę miejsc po przecinku. Data Operations – proste podmenu związane z działaniami na wartości aktualnie reprezentowanej przez zmienną. Może to być np. skopiowanie jej do schowka (Copy), lub uczynienie domyślną dla tej zmiennej (Make Current Value Default ). 4.2. Przydatne skróty klawiszowe Tworzenie programu w środowisku LabVIEW jest na ogół zajęciem czasochłonnym i żmudnym. Z tego powodu warto ułatwiać sobie pracę poprzez stoswanie skrótów klawiszowych, które przyspieszają niektóre działania: <ctrl+H> – pokazanie pomocy kontekstowej <ctrl+B> – usunięcie wszystkich źle podłączonych nitek danych <ctrl+?> – przełączenie okna w tryb pełnoekranowy <ctrl+E> – przełączanie pomiędzy oknami płyty czołowej i diagramu <ctrl-Z> – cofnięcie ostatnio wykonywanych operacji 18