Wirtualne Instrumenty i Systemy Zmienne lokalne
Dr inż. Witold Nocoń
Przykład – z leksza bardziej zaawansowany - przedsmak przyszłego semestru: Używając dynamicznie ładowanych funkcji (w dowolnej ilości), potrzebny jest kontener w którym przechowywane będą referencja do wszystkich załadowanych funkcji.
Dynamiczne ładowanie funkcji omówimy później (przyszły semestr?).
To co zrobimy teraz to tablica o zmiennym rozmiarze, zawierająca klastry.
Klastry zawierać będą dane (nie ważne jakie) Zapewnić jednak musimy mechanizm, wstawiania nowych klastrów do kontenera, usuwanie istniejący klastrów z kontenera oraz edytowanie danych już w kontenerze się znajdujących.
Trzeba też jednoznacznie identyfikować elementy. W tym celu należy każdemu nowemu elementowi nadać niepowtarzalny number referencyjny.
Numer ten odróżniał będzie elementy od innych elementów Rozwiązanie: pro_05_04.vi.
Przykład – z leksza bardziej zaawansowany - przedsmak przyszłego semestru: Pojawia się jednak jeden problem. Jak edytować elementy znajdujące się już w kontenerze? Możemy wprawdzie wyprowadzać elementy kontenera na oddzielnym wyświetlaczu, ale nie mamy możliwości wpisania wartości z kontenera do kontrolki umożliwiającej nam wprowadzanie danych.
Musieli byśmy więc od nowa, ręcznie wprowadzać wszystkie elementy znajdujące się w danym klastrze, aby poprawić lub zmienić tylko jeden z nich.
Aby uniknąć tego problemu trzeba wpisywać wartości do kontrolki !!!
Co do tej pory nie było możliwe...
...ale jest możliwe za pomocą Zmiennych Lokalnych (Local Variables)
Po stworzeniu zmiennej lokalnej kontrolki lub wyświetlacza, możliwe jest wpisywanie wartości do kontrolki oraz czytanie wartości z wyświetlaczy.
Generalnie, LabVIEW posiada zmienne lokalne i globalne. Zmiennymi globalnymi zajmiemy się po omówieniu podprogramów (subVI’s) Zmienne lokalne umożliwiają dostęp do wartości obiektów panelu bez użycia połączenia z terminalem tego obiektu (w różnych miejscach diagramu – np. w oddzielnych pętlach while)
Jest kilka powodów, dla których stosowanie zmiennych lokalnych może być uzasadnione:
• umożliwiaja tworzenie struktur nie dających się zaimplementować bez ich użycia (np. sterowanie wykonaniem niezależnych pętli while)
• w zasadzie każda kontrolka może być używa jako wyświetlacz (i vice versa)
• można więc też rozwiązać problem jaki wystąpił przy okazji poprzedniego przykładu
Zmienne lokalne
Rozważmy najpierw następujący przykład:
Chcemy zakończyć wykonanie dwóch pętli while za pomocą jednego przycisku.
Jak to zrobić?
Zmienne lokalne
Rozwiązanie 1: Połączmy terminale zakończenia wykonywanie pętli do jednego przycisku:
Nic to nie da, bo wartość przycisku nie będzie miała znaczenia po rozpoczęciu wykonywania pętli.
Zmienne lokalne
Rozwiązanie 2: Może umieścić przycisk wewnątrz jednej z pętli i poprowadzić przewód do kolejnej?
To też nic nie da, bo druga pętla nie zacznie się wykonywać dopóki nie zakończy się wykonywanie pierwszej pętli (po czym druga pętla od razu się zakończy)
Zmienne lokalne
Rozwiązanie 3 (wreszcie działające): trzeba użyć zmiennej lokalnej...
W jednej pętli użyjemy terminala przycisku a w drugiej zmiennej lokalnej tej kontrolki.
Zmienna lokalna
Przykład: pro_05_05.vi.
Option 3 (solution): use a local variable...
Zmienne lokalne w każdej chwili posiadają najświeższą wartość danej kontrolki.
Trzeba jednak pamiętać że:
Jeśli kontrolka logiczna ma powiązaną ze sobą zmienną lokalną, nie może używać działania mechanicznego typu „latch”. Dzieje się tak dlatego, że stan takiej kontrolki zależy od tego, czy wartość jej została przez program odczytana czy nie. Mogłoby się zdarzyć, że po przeczytaniu wartości przez jedną ze zmiennych lokalnych, (co spowodowałoby powrót kontroli do poprzedniego stanu) inne zmienne lokalne tej samej kontrolki (w zasadzie ta sama zmienna, ale różne jej instancje na diagramie) nie zwróciły by już poprawnej wartości.
Zmienne lokalne
Zmienną lokalną można utworzyć poprzez wstawienie na diagramie zmiennej lokalnej dostępnej na palecie struktur.
Taka zmienna nie jest powiązana z żadnym konkretnym obiektem (stąd znak zapytania “?”)
Z menu podręcznego można teraz
wybrać obiekt z którym zmienna ta
ma być powiązana
Można też tworzyć zmienne lokalne wybierając z menu podręcznego kontrolki (lub jej terminala) polecenie Create -> Local Variable.
Zmienne lokalne
Niewątpliwą zaletą jest to, że można wpisywać wartości do kontrolki oraz czytać wartości z wyświetlacza (co już ma mniejszą wartość praktyczną).
W tym przypadku można wpisywać wartość:
… a w tym czytać wartość.
Trzeba jednak pamiętać:
• Zmiennych lokalnych nie należy nadużywać, gdyż każda zmienna to dodatkowa alokacja pamięci (co może być niekorzystne w przypadku dużych zmiennych (np. tablic).
• Łatwo też o „race condition”
Przykład: pro_05_06.vi.
Przykład – pro_04_05.vi za pomocą zmiennych lokalnych: Rozwiązanie problemu edycji danych znajdujących się już w kontenerze: Przykład: pro_05_07.vi.
Można się pozbyć przewodów (ale tak nie należy robić!!!): Przykład: pro_05_08.vi.
Kilka uwag do poprzedniego przykładu:
Nie trudno zauważyć, że w wielu miejscach stosujemy diagram robiący to samo, jak np.:
- pętla zwracająca numery referencyjne wszystkich elementów w kontenerze.
Aby uniknąć ponownego pisania tego samego kodu należy stosować SubVI
...patrz następny wykład