Temat: LabVIEW – zdarzeniowa obsługa przycisku

Dostępna w środowisku LabVIEW struktura zdarzeniowa (Event Structure), pozwala nam w wygodny sposób oprogramować interakcję użytkownika z kontrolkami znajdującymi się na panelu frontowym. Dzięki tej strukturze nie ma potrzeby ciągłego odpytywanie poszczególnych kontrolek w celu stwierdzenia zmiany ich stanu (tzw. polling). Oprócz tego, zdarzenia są rejestrowane nawet w sytuacji, gdy program zajęty jest wykonywaniem innych operacji, co w przypadku pollingu może łatwo spowodować „przegapienie” przez program zmiany stanu kontrolki.

Co jednak zrobić, jeżeli chcemy strukturę zdarzeniową wykorzystać do obsługi przycisku zewnętrznego, podłączonego do wejścia cyfrowego?

Załóżmy, że mamy prosty program zdarzeniowy, w którym naciśnięcie przycisku „Process” powoduje wykonanie operacji wylosowania liczby, natomiast przycisk „Stop” zamyka program.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse012dj76koegbl050g3.png
Rysunek 1 Panel frontowy programu

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse0g7f6j41jfv1m3i1p8r4.png
Rysunek 2 Zdarzenie "Stop"

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse01sjg18eq8h4l3t13v55.png
Rysunek 3 Zdarzenie "Process"

Chcemy rozbudować ten program w taki sposób, aby funkcjonalność przycisku „Process” na panelu frontowym była zdublowana przez przycisk fizyczny, podłączony do wejścia cyfrowego urządzenia typu Multifunctional I/O.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqh2bgvri1v071bs099e3s9h.png
Rysunek 4 Przykład podłączenia przycisku do urządzenia Multifunctional I/O

Aby umożliwić odczyt sygnałów z wejść cyfrowych, należy upewnić się, że zainstalowana jest biblioteka akwizycji danych DAQmx.

W pierwszym kroku dodamy do programu dodatkową pętlę równoległą, w której będziemy odczytywać stan jednego z wejść cyfrowych urządzenia. W tym celu korzystamy z kontrolek palety Measurement I/O -> NI-DAQmx.

Umieszczamy na diagramie blokowym kolejno bloczki:

  • DAQmx Create Task – utworzenie nowego zadania pomiarowego.

  • DAQmx Create Channel – utworzenie nowego kanału. Określamy, które z wejść cyfrowych ma być odczytywane. W przykładzie była to linia Dev1/port1/line3. Jako instancję bloczka ustawiamy Digital Input.

  • DAQmx Start Task – uruchomienie zadania pomiarowego.

  • DAQmx Read – odczyt danych z portu. Jako instancję wybieramy Digital -> Single Channel -> Single Sample -> Boolean (1 Line).

  • DAQmx Stop Task – zatrzymanie zadania pomiarowego.

  • DAQmx Clear Task – usunięcie zadania pomiarowego.

Bloczek  DAQmx Read zapętlamy w pętli while. Cykl działania pętli ustawiamy na 25 milisekund (bloczek  Wait until next ms multiple). Tworzymy dodatkową kontrolkę umożliwiająca zatrzymanie pętli równoległej – DI Stop. Wartość tej kontrolki przed pętlą ustawiamy na false. W zdarzeniu „Stop” pętli głównej zapisujemy do tej kontrolki wartość true, co umożliwi zatrzymanie pętli równoległej. Kontrolkę DI Stop chowamy, aby nie była widoczna na panelu frontowym.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse01lesb8sp6c57p4ea6.png
Rysunek 5 Odczyt stanu wejścia cyfrowego   

Aby zrealizować zdarzeniową obsługę zmiany stanu linii cyfrowej, skorzystamy z mechanizmu zdarzeń użytkownika. W tym celu klikamy prawym przyciskiem myszy na brzeg struktury Event i wybieramy opcję Show Dynamic Event Terminals.

Kontrolki do obsługi zdarzeń użytkownika znajdują się w palecie Dialog & User Interface -> Events.

Nowe zdarzenie użytkownika tworzymy umieszczając na diagramie blokowym bloczek Create User Event. W LabVIEW, oprócz informacji o wystąpieniu zdarzenia, możemy przesłać również dodatkowego dane, potrzebne do jego obsłużenia. Zdefiniowany typ danych należy podłączyć do wejścia user event data type bloczka Create User Event. W naszym przypadku nie ma potrzeby definiowania takiego typu, ponieważ wystarczająca dla nas będzie informacja, że zdarzenie wystąpiło. Ponieważ jednak wejście to jest wymagane, podłączamy do niego jeden z podstawowych typów danych – stałą boolowską.  Aktywujemy etykietę tej stałej (poprzez kliknięcie prawym przyciskiem myszy i wybór opcji Visible items -> Label) i wpisujemy do niej nazwę (np. DI) , która będzie jednocześnie nazwą zdarzenia użytkownika. Ułatwi to jego identyfikację na liście zdarzeń.

Aby zarejestrować nowo utworzone zdarzenie, umieszczamy na diagramie blokowym bloczek Register For Events i podpinamy do jego wejścia wyjście z dodanego wcześniej bloczka Create User Event. Wyjście event registration refnum podłączamy do wejścia rejestracji zdarzeń dynamicznych struktury Event.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse15nh8hn12ucor41o6d7.png
Rysunek 6 Utworzenie i zarejestrowanie zdarzenia użytkownika

Aby nowo utworzone zdarzenie było obsługiwane przez ten sam kod, co zdarzenie dla przycisku „Process”, klikamy prawym przyciskiem myszy na nagłówku struktury Event i wybieramy opcję Edit Events Handled By This Case… Następnie klikamy przycisk Add Event i dodajemy do listy zdarzenie Dynamic <DI>.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse1783157714vt0482s8.png
Rysunek 7 Dodanie obsługi zdarzenia użytkownika

Nowo dodane zdarzenie użytkownika chcemy uruchamiać w sytuacji, gdy stan wejścia cyfrowego zmieni się z 0 na 1. Aby wykryć zmianę stanu linii stosujemy mechanizm rejestru przesuwnego, przy pomocy którego porównujemy aktualnie odczytaną wartość z wartością z poprzedniej iteracji pętli while. Jeżeli aktualna wartość jest większa niż poprzednia to znaczy, że mamy do czynienia z narastającym zboczem sygnału i należy wywołać zdarzenie.

Wywołanie zdarzenia użytkownika realizujemy przy pomocy bloczka Generate User Event, do którego podpinamy nitkę z utworzonym wcześniej zdarzeniem użytkownika oraz jakąkolwiek wartość odpowiadającą określonemu wcześniej typowi danych zdarzenia.

Na końcu, kiedy użytkownik wybierze opcję „Stop”, poza pętlą while niszczymy utworzone wcześniej zdarzenie użytkownika przy pomocy bloczka Destroy User Event.

http://www.student.mvlab.pl/wiedza/img/m/2/t/p17umqgse1v15tbho1k1g3k1teu9.png
Rysunek 8 Ostateczny diagram programu obsługi przycisku

Propozycje ćwiczeń i modyfikacji
1. Do sprawdzania stanu przycisku zastosować Stosowy Rejestr Przesuwny (Stacked Shift Register)
2. Zmodyfikować program tak, aby zdarzenie wywoływane było po przytrzymaniu przycisku przez określony czas.
3. Dodać do programu obsługę drugiego przycisku.
4. Dodać do programu obsługę błędów

Załączniki posta

Przycisk.vi 27.98 kB, 729 pobrań od 2013-07-05