Ciągły odczyt danych z subvi

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
MrJack
Posty: 17
Rejestracja: 17 cze 2009 16:26
Lokalizacja: Gdańsk
Kontakt:

Ciągły odczyt danych z subvi

Post autor: MrJack »

Witam.

Mam problem z wyświetlaniem danych z podprogramu subvi w którym dane ciągle przyrastają. Subvi znajduje się w pętli for a subvi działa w petli while az do spelnienia warunków końcowych no i zgodnie z zasada fora kolejny raz subvi jest odpalany. Program w tym momencie wystawia mi tylko ostatnie dane które odczytały czujniki, w efekcie na wykresach ze 100 probek dostaje jedna ostatania i z oczekiwanych 4000 całościowo patrzac mam 400. Czy jest jakaś możliwość by wyniki były linkowane na wyjście ciągle wraz ze zmiana ich wartości. Wiem że jak wyciągnę bebechy z sub vi do głównego Vi to będzie to działało ale ze względu na to że program jest olbrzymi spróbowałem pod pliku dokonujacego pomiar.

Pozdrawiam i czekam na odpowiedź :)
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: coolfon »

Po pierwsze: wrzuć swój kod ;) Na podstawie samego opowiadania ciężko stwierdzić gdzie masz błąd.

Po drugie: trochę jaśniej pisz :-\
MrJack pisze:Subvi znajduje się w pętli for a subvi działa w petli while az do spelnienia warunków końcowych
Zgaduję, że SubVI jest w pętli For, natomiast sam w sobie zawiera pętlę While, tak? Idąc dalej tym tropem...

W jaki sposób przechowujesz dane w tym SubVI? Zapamiętujesz je gdzieś? W jaki sposób wyprowadzasz je poza SubVI? Jeśli wartość, którą odczytujesz np. 10 razy, podpinasz bezpośrednio na wyjście pętli While (nie stosując Shift Register albo indeksowania), to nic dziwnego, że dostajesz tylko ostatni uzyskany wynik. Przykład poniżej:
indexing off and on.png
indexing off and on.png (9.93 KiB) Przejrzano 12217 razy
Jeśli pętla While wykona 5 iteracji, a sygnał wyprowadzisz tak jak na przykładzie po lewej, to uzyskasz tylko ostatnią wartość. Jeśli tak jak po prawej (Enable Indexing), to dostaniesz 5-elementową tablicę z kolejnymi wynikami.

Ok, tyle zgadywania ;) Napisz czy trafiłem ;)
MrJack
Posty: 17
Rejestracja: 17 cze 2009 16:26
Lokalizacja: Gdańsk
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: MrJack »

Nie nie o to nie chodziło wiem że każdą daną mogę indeksować wstawić do tabeli i odczytać natomiast ja bym chciał żeby zmiany w sub Vi byly widoczne w glownym VI. Załączam pliki.

Main.vi to główny program odpalamy go, a przy okazji otwieramy sobie FP subvi.vi . W subvi.vi mierzony jest czas działania aplikacji który wystawiany jest po przejściu przez diagram sekwencyjny natomiast zmienna liczby zliczajaca numer petli w trakcie działania programu przyrasta do wartosci 600. Chciałbym ten dynamiczny przyrost zmiennej liczby obserwować w FP programu main.vi . Program ten to ofc tylko przykład problemu z którym się spotykam w pracy, a być może czegoś nie wiem o connectorach podprogramow vi.
TT.zip
(14.67 KiB) Pobrany 402 razy
Pozdrawiam
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: coolfon »

A możesz wrzucić te pliki zapisane w wersji 8.5? Zwracaj uwagę na to, z jakiej wersji środowiska korzysta osoba prosząca o kod ;)

Natomiast wstępnie wydaje mi się, że możesz rozwiązać swój problem korzystając np. z Property Node lub jakiejś zmiennej globalnej (VI Global, Shared Variable). Zobacz sobie załączony przykład.
node.rar
(9.59 KiB) Pobrany 559 razy
Obsługa Property Node zajmuje więcej czasu niż np. VI Global, ale nie wymaga dodatkowego wątku z odczytem aktualnej wartości zmiennej.
MrJack
Posty: 17
Rejestracja: 17 cze 2009 16:26
Lokalizacja: Gdańsk
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: MrJack »

Hej a więc to co zamieściłeś nie bardzo u mnie chodzi ;)

Zamieszczam moj program w wersji 8.5 no i faktycznie nie pomyslalem o tym ze nie kazdy to ma teraz bede pamietał.

Prosiłbym jeżeli bys mógł na tym przykładzie właśnie to zrobić moim :)

Pozdrawiam :)
Załączniki
main.zip
(10.4 KiB) Pobrany 389 razy
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: coolfon »

MrJack pisze:Hej a więc to co zamieściłeś nie bardzo u mnie chodzi ;)
Co dokładnie 'nie chodzi'? Tam zbyt wiele się zepsuć nie mogło.

Mam nadzieje, że to teraz zamieszczam zadziała, bo idea rozwiązania jest dokładnie taka sama. Zrobione na przykładzie zamieszczonym przez Ciebie.
main_poprawione.rar
(16.15 KiB) Pobrany 461 razy
Na panelu głównym main.vi wyświetlany jest numer kolejnych iteracji pętli znajdującej się w subvi, po 150 iteracjach wyświetlany jest całkowity czas. Daj znać czy wszystko ok. Jak coś 'nie działa', to chociaż trochę napisz w czym problem.

PS. do obsługi przycisków lepiej wykorzystać strukturę Event zamiast Case'ów, ale to tak na przyszłość ;)
Ostatnio zmieniony 01 lis 2009 11:03 przez coolfon, łącznie zmieniany 1 raz.
MrJack
Posty: 17
Rejestracja: 17 cze 2009 16:26
Lokalizacja: Gdańsk
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: MrJack »

Tak dokładnie o to chodziło :) teraz idzie jak trzeba :) Musze tę wiedzę teraz przyswoić :)

Co do case vs event . Ciagle staram sie nauczyć aby działało to tak jak chce z eventami ale nie jest to jakos super przedstawione w samym lab view przy okazji wiec moze powiesz mi prosze :

Czym rozni sie drag ended z zielona a czym z czerwona strzałką ? Jeżeli naruszam regulamin forum bo gdzieś było pisane o tym to przepraszam i zerkne zaraz po wyslaniu tego posta

Kolejnym problemem , z którym się borykam to problem wlaśnie case może będziesz w stanie mi pomóc . Chciałbym móc zatrzymać w dowolnym momencie program przyciskiem stop tak aby zakończył działanie. Domyślam się że jest to proste , no ale jako , że uczyłem się sam LV to zdarza się mi czasem prostych spraw nie wiedzieć.

Czy jest możliwe uruchomienie 2 case'ów współbieżnie. Może trzeba to zastapić event'ami ? Po krótce wyglada to tak że poruszam platformą pomiarową w jednym case a w tym czasie fajnie jak by użytkownik mógł np ogladać wykres z danymi który aktualnie jest w innym case. Teraz jest tak ze jak wątek jednego case jest obsługiwwany to innego watku nie mogę ruszyć aż do zakończenia poprzedniego case :)

Jeżeli będą potrzebne przykłądy to mogę oczywiście takie stworzyć :) myślę że teraz wyraziłem się w miarę jasno :)
Pozdrawiam
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: coolfon »

MrJack pisze:Czym rozni sie drag ended z zielona a czym z czerwona strzałką ?
Najważniejszą cechą Event'ów z czerwoną strzałką jest fakt, że możesz je odrzucić (Discard) w momencie wystąpienia. Opis co robi który Event masz TUTAJ.
MrJack pisze:Czy jest możliwe uruchomienie 2 case'ów współbieżnie. Może trzeba to zastapić event'ami ? Po krótce wyglada to tak że poruszam platformą pomiarową w jednym case a w tym czasie fajnie jak by użytkownik mógł np ogladać wykres z danymi który aktualnie jest w innym case. Teraz jest tak ze jak wątek jednego case jest obsługiwwany to innego watku nie mogę ruszyć aż do zakończenia poprzedniego case :)
Odpal sobie jakiś prosty przykład z włączonym Highlight Execution (włączona żarówa w oknie diagramu) to zobaczysz jak działa program, który w jednej pętli While ma dwie struktury Case. Jeśli w jedna z nich wykonuje się stosunkowo długo, to tak samo długo będzie trwała jedna iteracja pętli While. Case'ów nie trzeba zastąpić Event'ami, a JEDNYM Even'tem i kilkoma wątkami. Przykład masz poniżej:
threads.vi
(27.66 KiB) Pobrany 563 razy
Jeśli chcesz jednocześnie dokonywać nowego pomiaru oraz np. przeglądać wyniki poprzedniego, to musisz te zadania odpowiednio podzielić na różne wątki. W zamieszczonym przykładzie masz dość długo trwające odliczanie, w czasie którego masz możliwość zmieniania wartości kontrolki obok - właśnie dzięki wątkom. Generalnie polecam zapoznać się z ze strukturą producer - consumer, bardzo ułatwia ona programowanie.
MrJack pisze:Kolejnym problemem , z którym się borykam to problem wlaśnie case może będziesz w stanie mi pomóc . Chciałbym móc zatrzymać w dowolnym momencie program przyciskiem stop tak aby zakończył działanie.
Wszystko zależy od tego, co masz w programie, który chcesz tak 'nagle' zatrzymać. Jeśli masz np. pętlę For, której wykonanie trwa np 10 sekund (i nie ma żadnego warunkowego zatrzymania), to musi ona się wykonać do końca, dopiero potem można zakończyć program (zobacz sobie co się stanie w załączonym wyżej przykładzie, gdy uruchomisz Countdown i w trakcie jego trwania naciśniesz STOP). Jeśli jednak bardzo Ci na tym zależy, to zawsze pozostaje funkcja Quit LabVIEW ;)
Ostatnio zmieniony 05 lis 2009 15:53 przez coolfon, łącznie zmieniany 2 razy.
MrJack
Posty: 17
Rejestracja: 17 cze 2009 16:26
Lokalizacja: Gdańsk
Kontakt:

Re: Ciągły odczyt danych z subvi

Post autor: MrJack »

Chciałem podziękować za pomoc :) siedzę nad tymi wątkami bo się moga przydać w nowym projekcie :)

Pełen profesjonalizm.

Pozdrawiam i do kolejnego posta
komaro
Posty: 39
Rejestracja: 15 wrz 2010 18:50
Wersja środowiska: LabVIEW 8.6

Re: Ciągły odczyt danych z subvi

Post autor: komaro »

Witam, zaciekawił mnie ten wątek gdyż sam poszukuję informacji/pomocy z global variable. Jezeli mam dwa VI, i w tym drugim chce skorzystać ze zmiennych z pierwszego VI. Czy global variable da się tu wykorzystać i jak to zrobić ? Wiem jakogolnie korzytac z tej zmiennej ale nie bardzo wiem jak to zastosowac.
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Ciągły odczyt danych z subvi

Post autor: PiDi »

Na początek poszukiwania w indeksie helpa "global variable". A potem w przykładach można znaleźć... Przykład ;) Fundamentals -> Local And Global Variables -> Display Number oraz Generate Number.
ObrazekObrazekObrazekObrazek
ODPOWIEDZ