PRACOWNIA METROLOGII
Podstawy programowania w środowisku
LabView
™
(Laboratory Virtual Instrumentation
Engineering Workbench)
ĆWICZENIE 1:
Podstawy projektowania przyrządów
wirtualnych I
Cel ćwiczenia:
Zapoznanie się z podstawami projektowania w środowisku LabView.
Wprowadzenie
Podstawowe składniki programu VI.
Program napisany w LabVIEW jest nazywany przyrządem wirtualnym ( virtual instrument )
lub krótko programem VI. Określenie to wynika z analogii wizualnego obrazu aplikacji oraz
jej działania do fizycznego przyrządu takiego jak oscyloskop czy multimetr.
Każda aplikacja VI używa elementy nastawcze, które wprowadzają dane z interfejsu
użytkownika lub innych źródeł oraz elementy prezentacyjne, które wyświetlają dane
wyjściowe na pulpicie interfejsu użytkownika lub wyprowadzają je do innych odbiorców.
Program VI składa się z trzech komponentów:
•
Pulpitu (front panel), który pełni rolę interfejsu użytkownika;
•
Diagramu (block diagram), który jest graficznym zapisem kodu programu. Definiuje
funkcjonalność aplikacji w języku graficznym G.
•
Ikony i złącza (icon & connector panel). Ikona identyfikuje VI tak, że dany VI
można użyć w innym programie VI. Tak użyty program VI jest określany
podprogramem VI ( subVI ). Odpowiada on procedurze w tekstowych językach
programowania. Złącze ( connector panel ) definiuje wejścia i wyjścia podprogramu
oraz ich przyporządkowanie i odpowiada definicji argumentów procedury w językach
tekstowych.
Pulpit jest graficzną formą interfejsu użytkownika. Wizualnie odpowiada rozwiązaniom płyt
przednich urządzeń pomiarowych. Buduje się go za pomocą elementów kontrolnych
i prezentacyjnych, które stanowią odpowiednio końcówki wejściowe i wyjściowe programu
VI. Elementami kontrolnymi są pokrętła nastawcze, przyciski, przełączniki itp. Symulują one
elementy nastawcze fizycznych urządzeń i dostarczają danych wejściowych do diagramu VI.
Do elementów prezentacyjnych zalicza się wyświetlacze numeryczne, alfanumeryczne, diody,
2
wyświetlacze graficzne (wykresy), tabele itp. Symulują one elementy prezentacyjne
fizycznych urządzeń i wyświetlają dane dostarczane przez diagram.
Widok Pulpitu i Diagramu
Przyciski:
3
Elementy nastawcze:
Wskaźniki:
Wykresy:
Diody:
W większości przypadków możliwa jest zmiana trybu pracy danego elementu z elementu
kontrolnego (control) na wskaźnik (indicator) i na odwrót.
4
Diagram blokowy składa się z terminali, funkcji, struktur i przewodów. Budowanie programu
w języku G polega na ich odpowiednim łączeniu. Kolejność wykonywania poszczególnych
operacji jest uzależniona od przepływu danych – najpierw wykonywane są te elementy
programu, które nie wymagają żadnych danych wejściowych.
Diagram blokowy i jego odpowiednik na panelu
Terminale są wejściowym i wyjściowym portem wymieniającym informację pomiędzy
panelem frontowym a diagramem blokowym. Reprezentują one typ danej kontrolki lub
wskaźnika. Można zmodyfikować terminale tak, aby widoczne były na diagramie jako ikony
typu danych lub jako ikony kontrolek widocznych na panelu frontowym (ustawienie
domyślne).
Przykład terminala w postaci ikony kontrolki panelu frontowego i ikony typu danych.
W LabView podobnie jak w klasycznych językach programowania istnieje wiele różnych
typów danych: logiczne, całkowite, rzeczywiste, łańcuchy itp., każdy z nich ma inną
reprezentację graficzną:
5
Aby wykonywać operacje na elementach programu (łączenie, kopiowanie, zmiana nazw,
rozmiarów itp.) niezbędne jest użycie narzędzi dostępnych w polu narzędzi (Tools Palette).
Pole narzędzi – Tools Palette
Poszczególne narzędzia służą do:
1) Manipulator - obsługa panelu sterowania, zmiana wartości liczbowych, zmiana
położenia suwaków potencjometrów, włączanie/wyłączanie przełączników
2) Selektor (strzałka) - zaznaczanie obiektów, zmiana rozmiarów, przesuwanie
3) Wskaźnik edycji tekstu – edycja tekstu po kliknięciu
4) Szpulka – łączenie poszczególnych obiektów (ikon)
5) Wskaźnik menu – rozwijanie podręcznego menu odnoszącego się do wskazanego
obiektu (podobnie działa prawy przycisk myszy)
6) Wskaźnik przewijania – przewijanie zawartości okna
7) Wskaźnik przerwań – zatrzymanie programu w miejscu zaznaczenia
8) Sonda – podgląd danych w dowolnym miejscu programu
9) Wskaźnik – próbnik kolorów umożliwia zmianę kolorów poszczególnych elementów
panelu (górny kwadrat) lub samego tła (dolny kwadrat)
Górny przycisk służy do ustalenia trybu przełączania między narzędziami: ręcznego (przy
pomocy klawisza Tab)/automatycznego (program dostosowuje wskaźnik do danego obiektu).
6
Pisanie programu wiąże się z używaniem różnych funkcji, które w tradycyjnych językach
tekstowych są po prostu wpisywane (np. +, =, mean). Aby w LabVIEW użyć określonej
funkcji należy ją znaleźć na palecie funkcji i umieścić na diagramie.
Paleta funkcji (Function Palette) jest zbiorem wszystkich dostępnych funkcji środowiska
LabVIEW. Funkcje są reprezentowane przez jasnożółte ikony z czarnym rysunkiem. Nie
mają panelu czołowego ani diagramu i nie można ich edytować (po dwukrotnym kliknięciu
myszą)
Dostępne funkcje to:
funkcje numeryczne do arytmetycznych, trygonometrycznych, logarytmicznych,
zespolonych operacji matematycznych na liczbach jak również do konwersji ich
typów
funkcje logiczne pozwalające na obliczanie wartości jednej zmiennej, lub tablicy
wartości logicznych takich jak: zmiana wartości na przeciwną, operacje na
„bramkach”
logicznych, konwersja wartości logicznych do numerycznych i odwrotnie
funkcje operujące na ciągach znaków (String). Pozwalają one na: łączenie, dzielenie,
przeszukiwanie, zamienianie ciągów znaków, zamienianie ich na wartości
numeryczne i odwrotnie
funkcje operujące na tablicach (Array), pozwalające miedzy innymi na:
utworzenie tablicy, sprawdzenie jej, wymiaru, dzielenie, dodawanie, usuwanie
elementów tablicy
funkcje operujące na zbiorach (Cluster), czyli obiektach odpowiadających strukturom
języka C, lub rekordom Pascala. Pozwalają one na umieszczanie i wyciąganie
pojedynczych elementów ze zbioru, konwersję zbiorów na tablice i odwrotnie
funkcje porównujące służące do porównywania wartości numerycznych, logicznych,
ciągów znaków, tablic i zbiorów. Zwracane wartości to najczęściej wartości logiczne
– prawda, jeżeli parametry funkcji spełniają dany warunek, fałsz, jeżeli tego warunku
nie spełniają
funkcje do obsługi czasu i funkcje dialogowe stosowane do określania prędkości
wykonywania struktur, pobierania wartości czasu z zegara systemowego, tworzenie
okien dialogowych
funkcje do operacji plikowych - służące między innymi do: zapisywania
i odczytywania z pliku, pozwalające na otwieranie, zamykanie, zapisanie, odczytanie,
stworzenie, usunięcie pliku, stworzenie, usunięcie, przeszukanie katalogu
7
funkcje do komunikacji pozwalające na wymianę danych pomiędzy aplikacjami
(niekoniecznie napisanymi w LabVIEW). Znajdują się tu między innymi funkcje do
komunikacji przez TCP/IP, UDP, IrDA, DS, Bt i inne
funkcje do obsługi urządzeń pozwalają na komunikację z urządzeniem przy użyciu
architektury Virtual Instrument Software Architecture (VISA). Funkcje te pozwalaj_
na wysyłanie i odbieranie ciągu znaków (string) oraz kontrolowanie komunikacji. W
szczególności są to gotowe funkcje do komunikacji szeregowej przez GPIB oraz VXI
funkcje do obsługi urządzeń pomiarowych firmy NI – czyli głównie kart
pomiarowych. Znajdują się tutaj sterowniki Traditional DAQ oraz NI DAQmx.
Wymienione wyżej funkcje można podzieli na dwie kategorie: funkcje do obróbki
danych, oraz funkcje komunikujące się ze sprzętem i pozwalające na zbieranie danych
lub ich wysyłanie na zewnątrz komputera. Do tej kategorii należą między innymi
grupy: Communication, Instrument I/O, NI Measurement.
Funkcje LabView
8
Oprócz funkcji w środowisku LabView istniejące ikony reprezentują również tzw. programy
VI biblioteczne, które składają się z odpowiednio połączonych funkcji. Po kliknięciu ikony
reprezentującej VI mamy możliwość jego edycji:
Przykład bibliotecznego VI SineWave.vi (z lewej) i wygląd jego panelu oraz diagramu
(z prawej)
Użytkownik ma również możliwość tworzenia własnych podprogramów VI, które będzie
mógł wykorzystywać w innych projektach.
Obsługa programu z paska narzędziowego.
Poszczególne ikony służą do:
1) jednokrotnego uruchomienia programu
2) uruchomienia programu w pętli
3) całkowitego zatrzymania programu
4) pauzy
Poza tym istnieje możliwość ustawienia stylu czcionki i jej rozmiaru oraz rozmieszczenia
elementów.
9
Najczęściej używane skróty klawiszowe podczas pracy z programem LabView:
Ctrl + E – przełączanie między panelem a diagramem
Ctrl + T – rozmieszczenie panelu i diagramu obok siebie
Ctrl + B – usunięcie błędnych połączeń
Ctrl + H – menu pomocy kontekstowej
LabView jest wyposażony w rozbudowany system pomocy:
Pomoc kontekstowa uruchamiana skrótem Ctrl + H (lub poleceniem Help>>Show Context
Help dostępnym z paska menu). Podaje podstawowe informacje o aktywnym obiekcie.
Widok okna pomocy kontekstowej
Chcąc uzyskać pełne informacje o danym elemencie należy przejść do pomocy szczegółowej
klikając na odnośnik Detailed Help. Pomoc szczegółowa wyposażona jest w spis treści,
indeks oraz w funkcję wyszukującą – dostępna jest również po wciśnięciu F1 lub Search
LabView Help.
Kolejnym narzędziem ułatwiającym znalezienie przyczyn błędu jest polecenie Explain
error… , która umożliwia identyfikację błędu i jego prawdopodobnych przyczyn na
podstawie numeru błędu. Jeśli program zawiera błędy logiczne strzałka służąca do
uruchomienia programu jest koloru szarego – po kliknięciu na nią pokazuje się okno
z wykazem błędów – kliknięcie na opis błędu spowoduje przejście do diagramu i zaznaczenie
prawdopodobnej przyczyny.
Niewątpliwie bardzo przydatną cechą środowiska w dużym stopniu ułatwiającą pisanie
programów jest bogato wyposażona biblioteka z przykładami, dostępna z menu Help>>Find
10
Examples. Odnośniki do przykładów wykorzystania poszczególnych ikon umieszczone są
również w pomocy szczegółowej.
Zadania do wykonania:
I. Nauka obsługi programu graficznego:
1. Uruchomić program LabView Start>>Programy>>National
Instruments>>LabVIEW 8.0>>LabView
2. Po uruchomieniu środowiska LabView wybrać Help>>Find Examples…
Wybierz Analyzing and Processing Signals>>Signal
Processing>>Signal Generation and Processing.vi.
3. Utworzyć kopię programu o nazwie Zad1 w katalogu roboczym
Cwiczenie1 korzystając z menu File>>Save As..>>
4. Uruchomić program przyciskiem jednokrotnego uruchamiania
5. Zmieniać wartości częstotliwości oraz wyboru typu filtru, zwracając
uwagę na zmiany zachodzące na wykresach
6. Zatrzymać działanie programu wciskając przycisk STOP lub naciskając
klawisz F4
7. Przełączyć się do diagramu przy pomocy skrótu klawiszowego Ctrl+E lub
z menu Window>>Show Block Diagram
11
8. Diagram składa się z kilkunastu elementów różnego rodzaju, które będą
omawiane w dalszych ćwiczeniach
9. Przejść ponownie do panelu wciskając Ctrl+R
10. Zmienić kolor tła na niebieski - klikając na dolny kwadrat próbnika
kolorów z palety Tools, wybierając kolor, a następnie klikając na front
panel
11. Zmienić kolor przycisku stop na zielony klikając górny kwadrat,
wybierając kolor a następnie klikając przycisk
12. Pozmieniać rozmiary poszczególnych elementów panelu. Uporządkować
elementy przy pomocy narzędzia do rozmieszczania elementów
13. Zmienić czcionkę dowolnej etykiety klikając na nią dwukrotnie, bądź przy
pomocy narzędzia do edycji tekstu z palety Tools, następnie wybierając
rozmiar i typ czcionki z paska narzędzi
14.Zmienić ustawienia przycisku STOP, tak aby działał na wciśnięcie
klawisza F2. Kliknąć na przycisk prawym przyciskiem myszy wybrać
Properties następnie kartę Key Navigation i właściwość Toggle zmienić
na F2
15. Uruchomić program i sprawdzić jego działanie
16. Zamknąć program nie zapisując zmian
II. Budowa własnego programu
Zbudować program służący do konwersji temperatury w skali Celsjusza na
Fahrenheita według następującego opisu:
1. Z ekranu startowego środowiska LabView wybrać Blank VI
2. Umieścić na panelu frontowym obiekt Numeric Control z palety
Controls>>Numeric. Obiekt ten będzie służył do ustawiania wartości
12
temperatury w stopniach Celsjusza. Zmienić nazwę etykiety z Numeric na
Temperatura w stopniach Celsjusza
3. Umieścić na panelu frontowym obiekt Numeric Indicator z palety
Controls>>Numeric. Obiekt ten będzie służył do wyświetlenia wartości
temperatury w stopniach Fahrenheita. Zmienić nazwę etykiety na
Temperatura w stopniach Fahrenheita
4. LabView utworzy analogiczną kontrolkę i wskaźnik na diagramie
5. Przejść do diagramu
Block Diagram
6. Przeliczenie skal odbywa się wg wzoru T[F] = T[C]*1,8 + 32. Diagram
programu przedstawia się następująco:
7. Z palety Functions>>Numeric należy wybrać funkcje dodawania oraz
mnożenia i wstawić do diagramu. Wykonać połączenia przy pomocy
szpulki. Stałe 1,8 oraz 32 na wejściach ikon należy utworzyć klikając
prawym przyciskiem myszy na wejście i wybierając Create Constant.
Kliknięcie na stałą umożliwia jej edycję. Należy zwrócić uwagę, że
separatorem dziesiętnym w LabView jest przecinek.
8. Zachować plik pod nazwą Zad2.vi w katalogu Ćwiczenie1
9. Uruchomić program w pętli nieskończonej i sprawdzić działanie
10.Na panelu kliknąć prawym przyciskiem myszy na kontrolkę temperatury w
stopniach Celsjusza następnie z menu kontekstowego wybrać Replace i
zamienić na kontrolkę numeryczną typu Knob
11. Ponownie sprawdzić działanie programu
III. Utworzenie podprogramu
1. Otworzyć uprzednio utworzony program Zad2.vi. Kliknąć prawym
przyciskiem myszy na ikonę znajdującą się w prawym, górnym rogu
panelu frontowego i wybrać Edit Icon. Usunąć istniejące ikony przy
pomocy menu Edit>>Clear.
13
2. Wybrać ikonę typu B & W i utworzyć ikonę według następującego wzoru:
3. Następnie zaznaczając ikony 16 Colors i 256 Colors skopiować utworzoną
ikonę przy pomocy polecenia Copy from: Black & White. Po utworzeniu
ikony kliknąć przycisk OK – nowa ikona pojawi się w rogu panelu.
4. Kliknąć prawym przyciskiem myszy na ikonie i wybrać Show Connector
z menu kontekstowego. Ponieważ podprogram wymaga jednego terminala
wejściowego i jednego wyjściowego należy z menu kontekstowego wybrać
Patterns i wybrać odpowiednią ikonę :
Wejścia/wyjścia można dodawać usuwać przy pomocy poleceń
Add/Remove terminal.
5. Najechać wskaźnikiem myszy na ikonę spowoduje to zmianę wskaźnika
myszy na szpulkę. Kliknąć lewy (wejściowy) terminal i poprowadzić nitkę
do kontrolki na panelu a następnie kliknąć na nią tworząc w ten sposób
połączenie. Podobnie połączyć prawy (wyjściowy) terminal ze
wskaźnikiem na panelu. Po połączeniu obydwa terminale przyjmą kolor
pomarańczowy typowy dla zmiennych typu Double
6. Zapisać tak utworzony podprogram pod nazwą Zad3_podprogram.vi
14
IV. Wykorzystanie własnego podprogramu w innym projekcie
1. Utworzyć nowy program, przejść do diagramu
2. Z palety Functions wybrać polecenie Select VI…, znaleźć utworzony
wcześniej podprogram i umieścić go na diagramie
3. Na wejściu ikony utworzyć kontrolkę przy pomocy polecenia Create
Control
4. Na wyjściu ikony utworzyć wskaźnik przy pomocy polecenia Create
Indicator
5. Zapisać program w katalogu Cwiczenie1 pod nazwą Zad4.vi
6. Przejść do panelu i uruchom program w pętli nieskończonej
7. Sprawdzić poprawność działania programu
15
ĆWICZENIE 2:
Podstawy projektowania przyrządów
wirtualnych II
Cel ćwiczenia:
Nauka wykorzystania pętli FOR i WHILE w budowie przyrządu wirtualnego oraz
poszerzenie wiadomości z programowania w środowisku LabView.
Wprowadzenie
Konstrukcję pętli FOR stosuje się w celu cyklicznego wykonania wybranego bloku kodu, gdy
liczba wymaganych powtórzeń (iteracji) wykonania jest znana w danym miejscu programu.
W środowisku LabVIEW pętla FOR ma postać ramki obejmującej poddiagram stanowiący
blok kodu programu, który ma być wykonany określoną ilość razy.
Pętla FOR Loop po wstawieniu do programu wymaga zadeklarowania liczby iteracji na
wejściu ikony N. Program objęty pętlą z liczbą iteracji N zostanie wykonany N-krotnie, a
numery kolejno wykonywanych operacji, poczynając od 0, a kończąc na N-1, będą
udostępniane w każdej iteracji na wyjściu ikony i.
Konstrukcję pętli while stosuje się w celu cyklicznego wykonania wybranego bloku kodu,
gdy liczba wymaganych powtórzeń (iteracji) wykonania nie jest znana. Pętla while ma postać
ramki obejmującej diagram stanowiący blok kodu programu, którego wykonanie jest
powtarzane aż do momentu przerwania działania pętli. Ramka pętli while posiada
predefiniowany terminal wyjścia licznika iteracji oraz terminal warunku kontynuowania
działania pętli. Licznik iteracji, zerowany w momencie rozpoczęcia działania pętli, dostarcza
aktualny numer wykonywanej iteracji (od 0) i jest inkrementowany po każdej iteracji.
16
Terminal kontynuacji działania pętli korzysta z wartości logicznych (boolowskich)
wypracowanych przez diagram pętli. Konfigurowanie terminala kontynuacji pozwala ustalić
wartość logiczną przerywającą działanie pętli (Continue IF True lub Stop If True).
Sprawdzenie warunku zakończenia jest realizowane po wykonaniu każdej iteracji, dlatego
zawsze jest wykonana przynajmniej jedna iteracja pętli. Działanie pętli jest podobne jak pętli
do...while języka C.
W programach VI zaleca się zatrzymywanie programu za pomocą wyłącznika umieszczonego
na panelu sterowania. Program zatrzymany przyciskiem Abort Execution (na pasku) zostaje
przerwany natychmiast, co może okazać się niebezpieczne dla urządzenia kontrolowanego
przez ten program. Zatrzymanie programu za pomocą wyłącznika przeznaczonego do tego
celu zapewnia wykonanie programu do końca i jego zatrzymanie w sposób bezpieczny dla
urządzenia zewnętrznego. Można to osiągnąć właśnie przy pomocy pętli WHILE Loop.
Najprostszym sposobem umieszczenia wyłącznika sterującego pracą pętli jest kliknięcie
prawym przyciskiem myszy na terminal kontynuacji i z menu podręcznego wybrać Create
Control. Pętle dostępne są w palecie Functions>>Structures.
Tunele wejściowe i wyjściowe konstrukcji pętlowych, auto-indeksacja
Konstrukcje pętli for i while mogą posiadać wejścia i wyjścia danych. Tunel wejściowy
danych tworzy się automatycznie w momencie prowadzenia połączenia pomiędzy wyjściem
węzła znajdującego się na zewnątrz pętli a wejściem węzła poddiagramu pętli. Podobnie tunel
wyjścia danych powstaje podczas łączenia wyjścia węzła poddiagramu pętli z wejściem węzła
znajdującego się poza konstrukcją pętli.
17
Pętla FOR i WHILE z tunelami wejściowymi
Pętla rozpoczyna działanie po otrzymaniu wszystkich danych wejściowych. W tym momencie
są one też przekazywane do pętli i ich wartości są takie same we wszystkich iteracjach pętli.
Jeśli zatem do tunelu wejściowego pętli jest dołączony terminal obiektu nastawczego to pętla
dysponuje jego stanem uzyskanym w momencie rozpoczęcia swojego działania. Zatem
zmiany stanu tego obiektu nastawczego w czasie działania pętli nie są w niej zauważane. Jeśli
pętla ma reagować na aktualny stan obiektu nastawczego, to jego terminal musi być
umieszczony wewnątrz pętli. Wtedy każda iteracja pętli dysponuje aktualnym stanem
nastawnika.
W przypadku tuneli wejściowych przekazujących tablice można ustalić charakter wejścia tak,
aby pętla uzyskała całą tablicę (Disable Indexing) lub określone elementy tablicy dla
kolejnych iteracji (Enable Indexing). Auto-indeksowanie wejściowe rozpoczyna się od zera i
polega na przekazaniu kolejnym iteracjom pętli danych o rozmiarze zmniejszonym o 1 z N
wymiarowej tablicy wejściowej (rozkładanie tablicy). W przypadku tablicy N wymiarowej
iteracje dostają kolejne podtablice o rozmiarze N-1. Iteracja i otrzymuje i-ty skalarny element
z jednowymiarowej tablicy, i-tą jednowymiarową tablicę z dwuwymiarowej tablicy, itd.
Rozbiór tablicy na elementarne składniki za pomocą wejść z auto-indeksacją
Wejście z auto-indeksowaniem wpływa na liczbę iteracji pętli for, która jest wtedy określona
przez wartość z wejścia liczby iteracji lub rozmiaru tablicy wejściowej. Obowiązuje mniejsza
z tych wartości. Wejście liczby iteracji może pozostać niepołączone, jeśli pętla korzysta z
18
auto-indeksowanego wejścia. W przypadku kilku wejść z auto-indeksowaniem liczba iteracji
jest określona rozmiarem najmniejszej tablicy. Stąd jeśli dwie tablice 20- i 50-elementowa
poprzez wejścia z auto-indeksacją inicjują działanie pętli for z zadeklarowaną liczbą 25
iteracji, to pętla realizuje 20 iteracji wykorzystując w nich wszystkie elementy tablicy
pierwszej oraz 20 pierwszych elementów tablicy drugiej.
Auto-indeksowanie dotyczy także tuneli wejściowych pętli while. Obowiązują te same zasady
z wyjątkiem ograniczenia liczby iteracji. Rozmiar tablicy nie ma wpływu na liczbę iteracji
pętli while, ponieważ są one realizowane dopóki terminal przerwania otrzymuje określoną
wartość boolowską. Kiedy liczba iteracji przekroczy rozmiar tablicy, wejście dostarcza
wartości domyślne tego samego typu jak dostarczane dotąd. W przypadku jednowymiarowej
tablicy double są to zerowe wartości numeryczne.
Wyjścia pętli z i bez auto-indeksacji
Dane wyjściowe są generowane po zakończeniu działania pętli. Tunel wyjściowy pętli for i
while może pracować z auto-indeksacją lub bez niej, niezależnie od rodzaju danych
doprowadzonych z wnętrza pętli. Jeśli pracuje bez auto-indeksacji dostarcza wartość
wyprowadzoną na wyjście podczas ostatniej iteracji wykonanej przez pętlę. Tryb auto-
indeksacji tworzy na wyjściu tablicę z danych dostarczanych na wyjście po każdej iteracji
pętli. Tablica wyjściowa dostępna po zakończeniu działania pętli ma rozmiar równy liczbie
wykonanych iteracji. Jej wymiar zależy od wymiaru danych produkowanych w iteracjach. W
przypadku produkcji danych skalarnych powstają tablice jednowymiarowe. Jednowymiarowe
tablice są gromadzone w dwuwymiarowej, itd.
Pętle for są wydajniejsze od pętli while w obsłudze operacji tablicowych. Wynika to stąd, że
liczba iteracji pętli for jest znana w momencie rozpoczęcia jej działania i można
zarezerwować odpowiednie obszary pamięci dla tworzonych tablic. W przypadku pętli while
w każdej iteracji trzeba rozszerzyć rozmiary tworzonych tablic czyli musi być wykonana
realokacja pamięci oraz przeniesienie dotychczasowych danych do nowego obszaru. Skutkuje
to mniejszą wydajnością operacji tablicowych. Mimo tego mankamentu pętle while są
19
niezbędne do realizacji algorytmów, w których nie można z góry określić liczby wymaganych
iteracji.
Pętle for są domyślnie przystosowane do tworzenia tablic. Kreowany tunel wyjściowy pętli
for jest domyślnie ustawiany w trybie auto-indeksacji niezależnie od rodzaju
wyprowadzanych danych. Również tunele wejściowe przekazujące tablice uzyskują
domyślnie tryb auto-indeksacji. Tunele wejściowe i wyjściowe pętli while domyślnie pracują
bez auto-indeksacji.
Operator rejestru przesuwnego konstrukcji pętlowych (shift registers).
Operator rejestru przesuwnego służy do przenoszenia danych pomiędzy kolejnymi iteracjami
pętli FOR i WHILE. Składa się z dwóch terminali umiejscowionych na przeciwległych
stronach ramki konstrukcji pętli. Terminal ze strzałką skierowaną w górę jest wejściem
rejestru. Do niego realizuje się połączenie z wyjściem wybranego węzła poddiagramu pętli,
który dostarcza danej przekazywanej do następnej iteracji. Wyjściem rejestru jest terminal ze
strzałką skierowaną w dół. Dostarcza on danej z poprzedniej iteracji lub wartość początkową
w pierwszej iteracji.
Rejestr można inicjalizować daną z węzła lub terminala znajdującego się na zewnątrz pętli
dołączonego do terminala ze strzałką skierowaną w dół. Jeśli rejestr nie jest jawnie
inicjalizowany przyjmuje domyślne wartości początkowe danego typu (0 dla typów
numerycznych) lub korzysta z danych uzyskanych podczas wcześniejszego działania pętli,
jeśli program wykonuje pętlę wielokrotnie. Rejestr przesuwny można stosować do dowolnego
typu danych, ale utworzony rejestr dotyczy jednego typu danych.
Rejestr tworzy się wybierając z menu dostępnego pętli pozycję Add Shift Register. Można
utworzyć wieloelementowy rejestr przesuwny wybierając z menu terminala rejestru pozycję
Add Element. Każde dodanie elementu tworzy dodatkowy terminal ze strzałką skierowaną w
dół. Terminale te są sklejone ze sobą. Utworzenie wieloelementowego rejestru pozwala
korzystać z kilku danych pochodzących z kolejnych poprzedzających iteracji. Pętla może
korzystać z wielu rejestrów przesuwnych.
Typowym zastosowaniem pętli FOR jest sytuacja, w której chcemy odczytywać określoną
ilość razy z przyrządu pomiarowego wartości jakiejś wielkości w zadanych odstępach czasu.
Testowanie przyrządu wirtualnego
Śledzenie przebiegu programu jest możliwe po kliknięciu żarówki – w czasie wykonywania
programu na wyjściach z węzłów pojawią się wartości danych, a kropki biegnące po
20
przewodach pokażą przepływ danych. Podgląd pojedynczych wartości jest możliwy przy
pomocy narzędzia Probe wybranego z palety Tools. Po wybraniu wskaźnika i kliknięciu na
dany przewód pojawi się próbnik, w którym wyświetlane będą wartości przechodzących
przez przewód danych.
W LabView istnieje też możliwość ustawiania przerwń – breakpoint. Należy kliknąć prawym
przyciskiem myszy na dany przewód i wybrać Set Breakpoint lub też z palety narzędzi Tools
wybrać Set/Clear Breakpoint. W obu przypadkach na przewodzie pojawi się czerwona
kropka. Gdy do tego punktu dotrą dane, program zatrzyma się, przewód i najbliższy węzeł
będą mrugać oczekując na kolejny krok – wejdź do, przeskocz, wyjdź:
Widok paska służącego do śledzenia przebiegu programu
Zadania do wykonania:
UWAGA Należy prześledzić działanie wszystkich programów przy pomocy
omówionych narzędzi.
I. Zastosowanie pętli WHILE i wykresu typu Waveform Chart do zbudowania programu
demonstrującego zastosowanie opóźnień.
Front Panel
1. Otworzyć nowy projekt VI
2. Zbudować panel wg następującego rysunku
3. Wybrać horizontal pointer slide znajdujący się w palecie Controls»Numeric
Controls. Wpisać opóźnienie na jego etykiecie. Zmienić górną wartość na 1000
4. Wstawić przycisk Stop z palety Controls»Buttons
5. Wstawić wykres Waveform Chart z palety Controls»Graph Indicators
21
6. Zmienić etykietę osi Y na Temperatura [st. Celsjusza], a osi X na Czas [s], zmienić
nazwę legendy na Temperatura
7. Na osi Y zmienić dolną wartość -10 na 0, a wartość górną 1 na 100
Block Diagram
8. Otoczyć znajdujące się na diagramie elementy pętlą WHILE z palety
Functions»Structures
9. Wstawić generator liczb losowych Random Number (0-1) z palety
Functions»Numeric. Połączyć go z wykresem jak pokazano na rysunku.
10. Wstawić opóźnienie czasowe Wait (ms) z palety Functions»Timing. Połączyć
z horizontal pointer slide tak jak pokazano na rysunku.
11. Przejść do panelu frontowego i uruchomić program. Zmieniać wartość opóźnienia
i obserwować działanie programu.
12. Zakończyć działanie programu. Utworzony program zapisać pod nazwą Zad2.vi w
katalogu Cwiczenie2.
II. Zastosowanie pętli FOR do utworzenia macierzy
Block Diagram
1. Otworzyć nowy projekt VI
2. Wstawić dwie pętle FOR (jedna wewnątrz drugiej) Functions»Structures»For
Loop
22
13. Kliknąć prawym przyciskiem myszy na terminal wejściowy N zewnętrznej pętli
FOR i wybrać
Create Control, zmienić nazwę na Kolumny.
To samo zrobić z pętlą wewnętrzną - nazwę kontrolki zmienić na Wiersze
14. Wstawić generator liczb losowych Random Number (0-1) z palety
Functions»Numeric. Połączenia poprowadzić tak, jak pokazano na rysunku.
15. Kliknąć prawym przyciskiem myszy na teminalu wyjściowym zewnętrznej pętli
FOR i wybrać Create Indicator
Front Panel
16. Przejść do panelu frontowego, ustawić ilość generowanych wierszy i kolumn
i uruchomić program
17. Po wykonaniu programu przejrzeć wygenerowane wartości
18. Następnie z Controls»Array,Matrix & Cluster wstawić Real Matrix
19. Kliknąć prawym przyciskiem myszy na elemencie i wybrać Change To Indicator
20. Przejść do diagramu i podłączyć element na wyjście pętli FOR
21. Uruchomić program i sprawdzić jego działanie
22. Zapisać program na dysku pod nazwą Zad2.vi w katalogu Cwiczenie2.
III. Program liczący średnią arytmetyczną z liczb generowanych losowo. Wykorzystanie
elementów Shift Register.
23
1. Utworzyć program wg następującego schematu:
2. Na diagramie umieścić pętlę FOR, na terminalu wejściowym N utworzyć stałą
przy pomocy polecenia Create Constant, umieścić w niej wartość 10
3. Wewnątrz pętli wstawić odpowiednie operatory dodawania, dzielenia
i inkrementacji dostępne z palety funkcji Numeric
4. Wstawić generator liczb losowych Random Number (0-1). Połączyć zgodnie
z rysunkiem.
5. Kliknąć prawym przyciskiem myszy na prawej krawędzi pętli FOR i z menu
podręcznego wybrać polecenie Add Shift Register
6. Połączyć elementy jak na rysunku, na wejściu elementu Shift Register z lewej
strony pętli utworzyć stałą za pomocą polecenia Create Constant
7. Na wyjściu ikony symbolizującej dzielenie utworzyć wskaźnik poleceniem
Create Indicator
8. Zapisać program pod nazwą Zad3.vi w katalogu Cwiczenie2
9. Uruchomić program i sprawdzić działanie. W programie generowane są
losowe liczby z zakresu 0 do 1 i liczona jest średnia arytmetyczna
wylosowanych liczb. W związku z tym, aby przekonać się o poprawności
zbudowanego programu należy ustawić dużą wartość licznika pętli, gdyż dla
dużego N średnia arytmetyczna powinna zmierzać do wartości 0,5. Sprawdzić
działanie programu dla różnych wartości N
IV. Ilustracja działania elementów Shift Register i sposobu testowania poprawności
działania programu
1. Zbudować program według następującego schematu
24
2. Dodatkowe elementy Shift Register uzyskuje się ‘rozciągając’
pojedynczy element przy pomocy myszy
3. Po wykonaniu połączeń jak na rysunku należy zmienić format liczb z
typu Double (rzeczywiste) na Long (całkowite). W tym celu należy
klikać na daną stałą prawym przyciskiem myszy i z menu podręcznego
wybrać Representation a następnie Long (I32)
4. Zapisać program pod nazwą Zad4.vi
5. Ustawić okna diagramu i panelu obok siebie, wcisnąć żółtą żarówkę
znajdującą się na pasku diagramu i uruchomić program
6. Prześledzić działanie programu
25
ĆWICZENIE 3:
Podstawy projektowania przyrządów
wirtualnych III
Cel ćwiczenia:
Nauka korzystania z systemu Express VI, poznanie konstrukcji Formula Node oraz
zastosowanie funkcji i procedur do budowy przyrządu wirtualnego.
Wprowadzenie
System Express VI
System Express VI wprowadzony w LabView od wersji 7 umożliwia bardzo szybkie
i wygodne projektowanie z użyciem gotowych funkcji, które wystarczy tylko zmodyfikować
dla własnych potrzeb.
Pliki Express VI upraszczają konfigurację funkcji poprzez interaktywne okna dialogowe dla
każdego pliku VI. Jeśli przeniesiemy Express VI do naszego schematu otwiera się okno,
w którym możemy wybrać parametry i ustawienia dla funkcji i natychmiast zobaczyć wynik
jej działania. LabVIEW pobiera wybrane ustawienia i automatycznie tworzy kod, który
normalnie byłby stworzony przez użytkownika przy tworzeniu ze standardowych plików VI.
Niektóre pliki Express VI pozwalają na dostęp do urządzeń we/wy - I/O Assisntant (asystenta
konfiguracji), rozszerzając interaktywną konfigurację o akwizycję danych (DAQ Assistant)
lub kontrolę urządzeń (Instrument I/O Assistant). standardowych plików VI.
26
Przykładem posłużenia się systemem Express VI może być utworzenie wirtualnego
generatora sygnału.
Konstrukcje Formula Node i Expression Node
Konstrukcję formuły używa się do utworzenia węzła diagramu realizującego operacje
zdefiniowane w ramce konstrukcji i zapisane w formie tekstowej, np.:
y = 3 * x - 2 + x * log(x)
Konstukcja Formula Node dostępna z palety Functions>>Structures jest użyteczna do
realizacji operacji, które korzystają z wielu zmiennych oraz produkują jeden lub więcej
rodzajów danych wyjściowych. Syntaktyka zapisu bloku programu w konstrukcji Formula
jest podobna do zapisu bloku instrukcji programu w języku C. Blok może zawierać deklaracje
zmiennych (dostępny tylko typ float oraz int) oraz wyrażenia. Można korzystać z instrukcji
sterujących if...else, switch..case, pętli for, while, do..while itp. Wyrażenia wykorzystują takie
same operatory jak język C (te same oznaczenia i priorytety). Wyjątkiem jest dodatkowy
operator podnoszenia do potęgi ( wyrażenie x**y oznacza x do potęgi y ). Można stosować
komentarze. Menu konstrukcji formuły posiada pozycje służące do kreowania wejść i wyjść
węzła (odpowiednio Add Input oraz Add Output). Po wykreowaniu należy w polu
utworzonego wejścia lub wyjścia wpisać jego nazwę. Stanowią one zmienne formuły,
domyślnie są typu float. Nazwy muszą być unikalne w ramach danej konstrukcji, ale nazwa
27
wyjścia może być taka sama jak jednego z wejść. Formula Node jest również dostępna w
wersji ekspresowej, która jednak nie posiada możliwości korzystania z instrukcji języka C.
Trzy sposoby na obliczenie wartości jednej funkcji: konstrukcje Formula Node
klasyczna i ekspresowa oraz Expression Node zawarte w pętli While
Konstrukcja Expression Node dostępna służy do obliczenia pojedynczego wyrażenia
korzystającego z jednej zmiennej wejściowej. Węzeł posiada predefiniowane wejście i
wyjście typu float. Nazwa zmiennej użyta w wyrażeniu jest automatycznie kojarzona z
wejściem węzła. Wyjściu jest przypisywany wynik wyrażenia.
28
Zadania do wykonania:
I. Utworzenie wirtualnego generatora sygnału
1. Z palety funkcji (Functions) wybrać Express, następnie Input i ikonę Simulate
Signal
2. Zmienić typ sygnału na sinusoidę – sine. Pozostałe wartości zostawić bez
zmian
3. Na wyjściu ikony utworzyć wykres (Graph Idicator).
4. Uruchomić program w pętli nieskończonej i prześledzić jego działanie
5. Kliknąć dwukrotnie na ikonę Simulate Signal
6. Po pojawieniu się okna dialogowego zmienić typ sygnału na trójkąt – triangle.
Ustawić częstotliwość na 1 Hz. Zaznaczyć opcję Simulate accquisition
timing, pozostałe wartości pozostawić bez zmian
7. Uruchomić program w pętli nieskończonej i prześledzić jego działanie
Ikona reprezentująca plik Express VI - Simulate Signal oraz interaktywne okno
dialogowe
29
8. Na wejściowych terminalach ikony Simulate Signal utworzyć kontrolki dla
amplitudy sygnału oraz częstotliwości
9. Uruchomić program w pętli nieskończonej i prześledzić jego działanie
10. Zapisać program pod nazwą Zad1.vi w katalogu roboczym Cwiczenie3
II. Skalowanie sygnału
1. Otworzyć poprzednio utworzony projekt i zapisać go pod nazwą Zad2.vi w
katalogu roboczym
2. Przejść do diagramu
3. Z palety funkcji Functions>>Express>>Exec Control wybrać pętlę While
Loop, kliknąć na diagramie i otoczyć elementy znajdujące się na diagramie
4. W celu wyskalowania wykresu wstawić ikonę Scaling and Mapping dostępną
z palety funkcji Express>>Arith & Compar. Zaznaczyć opcję Linear i
ustawić parametr Slope na 0,1
5. Na wyjściu ikony utworzyć wykres przy pomocy polecenia Create Graph
Indicator
6. Uruchomić program przy pomocy przycisku jednokrotnego uruchamiania
i prześledzić działanie programu dla różnych typów sygnału (piła, sinusoida,
prostokąt, trójkąt)
III. Wyświetlanie dwóch przebiegów na jednym wykresie
1. Otworzyć poprzednio utworzony projekt i zapisać go pod nazwą Zad3.vi
w katalogu roboczym
30
2. Na diagramie wstawić element Merge Signals z palety funkcji
Express>>Signal Manipulation. Dokonać połączenia jak pokazano na
rysunku. Na wyjściu Merge Signals utworzyć wykres
3. Aby przebiegi wyskalowany i oryginalny były różnych kolorów należy
zmienić właściwości wykresu Properties dostępne po kliknięciu na wykres
(lub odpowiadającą mu ikonę na diagramie) prawym przyciskiem myszy.
Należy wybrać zakładkę Plots z rozwijalnego menu wybrać dany wykres np.
sine (scaled) i wybrać kolor linii Line. Wybranie jest możliwe po
wcześniejszym jednokrotnym uruchomieniu programu.
4. Aby na panelu frontowym była widoczna legenda dla przebiegu
wyskalowanego należy zmienić wysokość (rozszerzyć granicę) legendy
znajdującej się nad wykresem
5. Uruchomić program i sprawdzić jego działanie
6. Zapisać zmiany i zamknąć projekt
31
IV. Prosta analiza przebiegów
To zadanie polega na zbudowaniu programu, który będzie generował sygnał i na
wskaźniku będzie sygnalizował przekroczenie pewnej ustalonej wartości.
1. Zamknąć wszystkie projekty i pozostawić ekran startowy środowiska LabView
2. Wybrać
New>>VI From Template>>Tutorial (Getting
Started)>>Generate, Analyze, and Display. Ten projekt symuluje a analizuje
sygnał pod kątem średniej wartości skutecznej (RMS). Kliknąć OK.
3. Zapisać program pod nazwą Zad4.vi w katalogu roboczym
4. Wyświetlić diagram. Skonfigurować Simulate Signal zgodnie z rysunkiem
poniżej – generowany będzie sygnał stały z nałożonym na niego szumem
białym. Po zaakceptowaniu zmian przejść do panelu.
Widok okna dialogowego ikony ekspresowej Simulate Signal
5. Usunąć liczbowy wskaźnik wartości RMS. Usunąć niepołączone linie (broken
lines) przy pomocy skrótu klawiszowego Ctrl+B. Wstawić wskaźnik
Boolean>>Round LED. Ponownie przejść do diagramu
6. Kliknąć dwukrotnie na ikonę ekspresową Amplitude and Level
Measurements. Usunąć zaznaczenie RMS w sekcji Amplitude
Measurements, zaznaczyć opcję Peak To Peak (wartość szczytowa).
Zachować zmiany.
32
7. Z palety funkcji Express>>Arith & Compar>>Comparison wybrać ikonę
ekspresową Comparison. W sekcji Compare Condition wybrać opcję
Greater (większe). W sekcji Comparison Inputs wybrać Use Constant
Value i wpisać 0,195.
8. Podłączyć wyjścia zgodnie ze schematem poniżej, na wyjściu ikony
Amplitude and Level Measurements utworzyć wskaźnik numeryczny.
Wskaźnik LED podłączyć na wyjście ikony Greater.
9. Przejść do panelu i uporządkować elementy.
10. Uruchomić program i sprawdzić poprawność działania
11. Zapisać zmiany wprowadzone w programie
V. Zapisywanie danych do pliku
1. Zachować wcześniej utworzony program pod nazwą Zad5.vi
2. Przejść do diagramu i z palety funkcji File I/O wybrać Write Meas File
3. Po ukazaniu się okn dialogowego wybrać odpowiednią ścieżkę dostępu do
pliku i nazwę, tak aby plik został zapisany w katalogu roboczym Cwiczenie3
4. Następnie zaznaczyć opcje:
If a file already exists – Append to file (dopisywanie do pliku w przypadku gdy
istnieje)
Segment Headers – One header only (jeden nagłówek)
Pozostałe ustawienia pozostawić bez zmian.
5. Zamknąć okno dialogowe i powrócić do diagramu
6. Do wejścia nowo utworzonej ikony podłączyć sygnał z ikony Simulate Signal
7. Zapisać zmiany, uruchomić program i sprawdzić jego działanie
33
8. Obejrzeć w notatniku wygenerowany plik. Pozmieniać ustawienia w oknie
dialogowym ikony Write Meas File i sprawdzić ich działanie uruchamiając
ponownie program
VI. Zapisywanie danych do pliku na wciśnięcie przycisku
Jeśli chcemy aby dane zapisywane były tylko w momencie naciśnięcia przycisku
napisany wcześniej program należy zmodyfikować:
1. Zapisać poprzednio utworzony program pod nazwą Zad6.vi
2. Kliknąć prawym przyciskiem myszy na wejściu Signal ikony Write Meas File
i wybrać Insert Input/Output. Po ukazaniu się wejścia Comment kliknąć
prawym przyciskiem myszy i wybrać Select Input/Output>>Enable.
3. Utworzyć kontrolkę na wejściu uzyskanego terminala przy pomocy polecenia
Create>>Control. Diagram powinien wyglądać jak na poniższym rysunku
4. Należy zmienić ustawienia Properties przycisku Enable tak aby zapisywać do
pliku tylko wybrane dane. Na karcie Operation należy wybrać Latched
When Pressed – działanie każdego z ustawień można prześledzić w oknie
dialogowym
5. Zapisać zmiany w programie i sprawdzić jego działanie. W odróżnieniu od
poprzedniego dane zapisywane są do pliku tylko wtedy gdy naciśnięty jest
przycisk Enable.
34
ĆWICZENIE 4:
Podstawy projektowania przyrządów
wirtualnych IV
Cel ćwiczenia:
Celem ćwiczenia jest zapoznanie się z pojęciami i sposobem tworzenia zmiennych lokalnych
i globalnych, przepływem danych w środowisku LabView, strukturą hierarchiczną programu.
Zapoznanie się z jednym ze sposobów budowania systemu pomiarowego – maszyny
o skończonej liczbie stanów.
Wprowadzenie
Zmienne globalne i lokalne.
W czasie tworzenia programu zachodzi niekiedy potrzeba przyjmowania danych
pochodzących z rożnych miejsc programu przez jedną i tę samą kontrolkę, co jest niemożliwe
do zrealizowania za pomocą zwykłych połączeń. Dodatkową trudność w przekazywaniu
danych mogą stanowić umieszczone w programie struktury ograniczające dostęp z zewnątrz
do obiektów zanjdujących się w ich obrębie. Podobna sytuacja może zaistnieć, kiedy trzeba
przesłać dane między niezależnymi programami działającymi równolegle. Realizacja
wymienionych zadań jest możliwa za pomocą zmiennych lokalnych w obrębie jednego
programu i za pomocą zmiennych globalnych w przypadku programów działających
niezależnie.
Zmienne lokalne można tworzyć przy pomocy polecenia Create>>Local Variable
dostępnego w podręcznym menu wskazanego kursorem myszki obiektu, albo wybierając z
palety Functions>>Structures elementu Local Variable (wyłącznie w oknie diagramu).
35
Na rysunku przedstawiono program, który wykonuje jednocześnie dwie pętle WHILE –
w jednej zmienia wartość licznika co 1000 ms (1 sekunda) w drugim co 2000 ms (2 sekundy).
Dzięki zastosowaniu zmiennej lokalnej istnieje możliwość równoczesnego zatrzymania
obydwu pętli, przy pomocy jednego przycisku.
Za pomocą zmiennych globalnych można przekazać informację do innych działających
równolegle programów lub ją przyjąć od programów działających niezależnie.
Wstawianie zmiennej globalnej do programu jest możliwe wyłącznie w oknie diagramu przez
wybranie z palety Functions>>Structures elementu Global Variable.
Zmienne globalne wymagają utworzenia programu pośredniczącego w przekazywaniu
informacji. Program pośredniczący skojarzony ze zmienną globalną można utworzyć, po jej
wstawieniu do programu głównego. Następnie po kliknięciu prawym przyciskiem myszy na
zmiennej globalnej należy wybrać polecenie Open Front Panel. Po otwarciu należy w nim
umieścić obiekty, które będą pośredniczyć w przekazywaniu danych między innymi
programami co oznacza, że muszą to być obiekty zdolne przyjąć lub wysłać dane określonego
typu. W programach, które będą wykorzystywać zmienne globalne należy umieścić VI,
w którym umieszczono zmienną globalną (menu kontekstowe Select a VI...).
36
Trzy programy VI ze zmienną globalną – a) panel zmiennej globalnej b) program
ustawiający wartość zmiennej globalnej c) program wyświetlający wartość zmiennej
globalnej
Można powiedzieć, że zmienna globalna w środowisku LabView jest w rzeczywistości
zbiorem zmiennych globalnych a to jaką z nich udostępniamy zależy od wybrania z menu
kontekstowego (dostępnego po kliknięciu prawym przyciskiem myszy) Select Item.
37
Tak jak w innych językach programowania używanie zmiennych globalnych powinno być
ograniczone do minimum, gdyż łatwo można stracić kontrolę nad danymi.
Programowanie przepływu danych, sekwencja wykonywania operacji.
Konstrukcja sekwencji operacji.
Konstrukcja sekwencyjna wygląda jak ramka filmu i składa się z jednej lub kilku ramek
(klatek filmu). Wykonuje ona kolejno kody programu umieszczone w ramkach 0, 1, 2, 3 itd.
Konstrukcje sekwencyjne stosuje się do wymuszenia określonej kolejności wykonywania
fragmentów kodu, gdy nie daje się tego uzyskać przepływem danych. Diagramy kodu
umieszczone w ramkach konstrukcji są realizowane kolejno, zgodnie z numerami ramek.
Sekwencję można rozbudowywać do dowolnej liczby ramek.
LabView rozróżnia dwa rodzaje konstrukcji sekwencyjnych płaską Flat składającą się
z umieszczonych obok siebie ramek i piętrową Stacked z ponumerowanymi ramkami,
działanie obu konstrukcji jest identyczne. W każdej chwili możliwa jest zmiana z konstrukcji
płaskiej na piętrową i na odwrót przy pomocy polecenia Replace With … dostępnego z menu
podręcznego.
Konstrukcja sekwencyjna – Stacked i Flat
Dodawanie kolejnych ramek jest możliwe przy pomocy poleceń dostępnych z menu
podręcznego po kliknięciu prawym przyciskiem myszy na krawędzi struktury:
•
add frame after
•
add frame before
•
insert frame
38
Tunele wejść i wyjść konstrukcji tworzą się automatycznie podczas prowadzenia połączeń
przez kontury konstrukcji. Dane wejściowe konstrukcji są dostępne dla wszystkich jej ramek.
Wyjścia danych z konstrukcji mogą mieć tylko jedno źródło informacji, czyli każde z wyjść
struktury jest związane z jedną z ramek, ale tunele wyjściowe są widoczne we wszystkich
ramkach. Dane opuszczają strukturę w momencie, gdy ostatnia ramka zakończy wykonanie
zawartego w niej kodu. Oznacza to, że dane wyjściowe określonej ramki opuszczają strukturę
po jej całkowitym wykonaniu, a nie kiedy skończy się wykonanie danej ramki.
Przykład konstrukcji sekwencyjnej oraz kolejne jej ramki
Przekazywanie danych z jednej ramki do ramek występujących po niej realizuje się za
pomocą terminala zwanego lokalną sekwencją. Do uzyskania lokalnej sekwencji,
wykorzystuje się operację Add Sequence Local ze specjalnego menu, uaktywnianego
przyciśnięciem prawego klawisza myszki. Lokalna sekwencja jest zaznaczona końcówką
przenoszenia danych we wszystkich ramkach sekwencji. W ramce będącej źródłem danych
dla lokalnej sekwencji punkt przekazywania danych jest zaznaczony zewnętrznym zwrotem
strzałki a w ramce odbiorczej strzałką zwróconą do jej wnętrza. Ramki poprzedzające ramkę
będącą źródłem danych nie mogą oczywiście korzystać z danych przenoszonych lokalną
sekwencją i w nich punkt przenoszenia nie jest zaznaczony strzałką. Konstrukcja
sekwencyjna może wykorzystywać kilka lokalnych sekwencji przekazywania danych.
Konstrukcja wyboru (case)
Konstrukcja sterująca case umożliwia alternatywne wykonywanie bloków kodu objętych tą
konstrukcją. Funkcjonalnie odpowiada instrukcji if...then...else lub switch języka C.
Konstrukcja posiada minimum dwie ramki. Każda ramka zawiera blok programowy
39
realizujący określone operacje oraz deklarację wartości wybierających. Wykonanie
konstrukcji polega na wykonaniu kodu jednej z jej ramek. Wybór ramki jest realizowany na
podstawie danej dostarczonej do wejścia selekcyjnego konstrukcji case.
Postać graficzna konstrukcji Case
Wejście selektora może przyjmować dane boolowskie (domyślny typ), całkowite, stringowe
oraz enumeryczne. W przypadku, gdy wejście selektora korzysta z danych boolowskich
konstrukcja posiada dwie ramki odpowiednio dla wartości FALSE i TRUE. Jeśli selektor
korzysta z pozostałych typów danych struktura może mieć do 2^32-1 przypadków (ramek).
Konstrukcja case z selektorem Int32 oraz przykładem deklaracji wartości
wybierających
Dla każdej z możliwych wartości selektora musi być przypisana jedna z ramek konstrukcji
case. Określenie wartości wybierających daną ramkę realizuje się przez wpisanie ich listy w
okienku wartości wybierających. W konstrukcji case z selektorem boolowskim ramkom
przypisane są wartości True i False. W sytuacji wyboru przy użyciu danych całkowitych pole
wartości wybierającej daną ramkę może mieć postać:
•
Pojedynczej wartości całkowitej, np. 12 - ramka jest wykonywana, gdy selektor
konstrukcji otrzyma wartość 12.
40
•
Listy wartości całkowitych, np. 2, 4, 6, 7 - ramka jest wykonywana, gdy selektor
konstrukcji otrzyma jedną z wartości podanej w liście.
•
Listy wartości określonych zakresem, np. 5..25 - ramka jest wykonywana, gdy
selektor konstrukcji otrzyma wartość z podanego zakresu.
•
Wartości domyślnej (Default) - ramka jest wykonywana, gdy selektor konstrukcji
otrzyma wartość różną od wartości określonych dla innych ramek konstrukcji.
Konstrukcja wyboru musi obsłużyć wszystkie możliwe przypadki. Zatem przy wyborze
różnym od boolowskiego, kiedy liczba możliwych przypadków jest bardzo duża, jednej z
ramek należy przypisać wszystkie wartości nieokreślone dla pozostałych ramek. Przykładowo
w konstrukcji złożonej z czterech ramek wybieranych odpowiednio wartościami 1, 2, 3, 4
należy jednej z nich np. pierwszej przypisać wartości wybierające 1, Default. Oznacza to, że
ramka pierwsza będzie wykonywana, gdy selektor uzyska wartość całkowitą różną od 2, 3 lub
4. Tunele wejść i wyjść konstrukcji tworzą się automatycznie podczas prowadzenia połączeń
przez kontury konstrukcji. Tunele wejść danych tworzą wejścia dla wszystkich ramek
konstrukcji, ale diagram danej ramki korzysta tylko z tych, które są potrzebne. Struktura
realizuje swoje zadania po uzyskaniu danych na wszystkich wejściach. Wszystkie wejścia
danych oraz wejście selektora muszą być dołączone do źródeł danych.
Konstrukcja Case może w niektórych przypadkach zastąpić konstrukcję sekwencyjną.
Maszyna stanów – automat stanów definiowany jest jako model formalny dyskretnego
systemu lub procesu przebiegającego w dyskretnych chwilach czasu. Automat nazywamy
skończonym, bo działa w oparciu o skończony zbiór stanów wewnętrznych automatu.
Automat skończony najlepiej rozpatrywać jako czarna skrzynka
Q - zbiór stanów wewnętrznych automatu, Z – zbiór sygnałów wejściowych, Y – zbiór
sygnałów wyjściowych.
Maszynę stanów łatwo zrealizować o konstrukcję sekwencyjną, bądź też konstrukcję Case.
41
Zadania do wykonania:
I. Utworzyć program z wykorzystaniem zmiennej lokalnej na podstawie opisu i
rysunków we wprowadzeniu. Przetestować działanie.
II. Utworzyć program z wykorzystaniem zmiennej globalnej na podstawie opisu
i rysunków we wprowadzeniu. Przetestować działanie.
III. Utworzyć program, który w kolejnych dwunastu krokach wykonywanych co
sekundę wypisuje w postaci łańcuchów nazwy miesiąca.
Diagram
1. Wstawić strukturę Case z Function>>Structures
2. Wstawić pętlę FOR Loop z Function>>Structures obejmując strukturę Case
Ustawić wartość licznika pętli na 12.
3. Wstawić ikonę Add z Function>>Numeric. Połączyć z wejściem struktury
Case jak na rysunku. Struktura Case będzie od tej chwili przyjmować wartości
numeryczne. Usunąć przypadek 0, default klikając prawym przyciskiem myszy
na selektor struktury Case i wybierając z menu podręcznego Delete This Case.
Następnie jako domyślną wartość ustawić 0 przy pomocy polecenia Make
This The Default Case. Dodać kolejne przypadki do struktury Case (1 do 12)
przy pomocy polecenia Add Case After.
42
4. Dla każdego z przypadków wstawić stałą łańcuchową z nazwą miesiąca i
połączyć z terminalem wyjściowym. Na wyjściowym terminalu przy pomocy
polecenia Create Indicator utworzyć wskaźnik pokazujący nazwę miesiąca.
5. Zapisać program pod nazwą Zad1.vi w katalogu Cwiczenie4, uruchomić
i sprawdzić działanie programu.
IV. Inny sposób budowy maszyny stanów polega na wykorzystaniu gotowego wzorca.
1. Z ekranu startowego LabView wybrać New>>VI from Template
>>Frameworks>>Design Patterns>>Standard State Machine
2. Zapisać plik pod nazwą Zad2.vi. w katalogu Cwiczenie4
3. Kliknąć prawym przyciskiem myszy na stałą wyliczeniową i wybrać polecenie
Open Type Def.
4. Na panelu frontowym StateMachinesStates.ctl kliknąć prawym przyciskiem
myszy na stałą wyliczeniową i wybrać Edit Items…
5. Zmienić nazwę pierwszego stanu z Initialize na Inicjalizacja.
43
6. Następnie przy pomocy przycisku Insert dodać stany o nazwach Stan1 i Stan2.
7. Zapisać zmiany.
8. Przejść do diagramu, kliknąć prawym przyciskiem myszy na stałe
wyliczeniowe i wybrać polecenie Update From Type Def.
9. Dodać kolejne ramki struktury Case (Stan1, Stan2) klikając prawym
przyciskiem myszy na selektor struktury Case i wybierając polecenie
Duplicate Case.
10. Do pętli WHILE wstawić opóźnienie 2000 ms
11. Kliknąć prawym przyciskiem myszy na element Shif Register z lewej strony
pętli i wybrać polecenie Create Indicator. Wskaźnikowi nadać nazwę Stan
aktualny.
12. W ramce Inicjalizacja struktury Case wstawić One Button Dialog
z Functions>>Dialog & User Interface. Na wejściu funkcji utworzyć stałą
łańcuchową z tekstem Rozpoczęcie testu
13. Przejść do kolejnej ramki Stan1 i zmienić wartość stałej wyliczeniowej na
Stan2
14. Przejść do ramki Stan2 i wewnątrz niej utworzyć program jak na rysunku
15. Zapisać zmiany w projekcie, uruchomić i sprawdzić działanie programu.
44
Źródła:
•
Getting Started with LabView - podręcznik National Instruments
•
User Manual - podręcznik National Instruments
•
Tłaczała Wiesław, Środowisko LabVIEW w eksperymencie wspomaganym
komputerowo, Wydawnictwo Naukowo - Techniczne
•
materiały dostępne w Internecie:
i inne
Opracował mgr Grzegorz Śmigielski
45
SPIS TREŚCI
ĆWICZENIE 1:
PODSTAWY PROJEKTOWANIA PRZYRZĄDÓW WIRTUALNYCH I
.....................................................
ĆWICZENIE 2:
PODSTAWY PROJEKTOWANIA PRZYRZĄDÓW WIRTUALNYCH II
..................................................
ĆWICZENIE 3:
PODSTAWY PROJEKTOWANIA PRZYRZĄDÓW WIRTUALNYCH III
................................................
ĆWICZENIE 4:
PODSTAWY PROJEKTOWANIA PRZYRZĄDÓW WIRTUALNYCH IV
................................................
46