Anulowanie działania podprogramu

Sprawy związane z interfejsem użytkownika - kontrolki, wskaźniki, wyświetlacze, wykresy oraz inne zagadnienia tego typu...
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Anulowanie działania podprogramu

Post autor: fajfi »

Cześć,
dopadł mnie następujący problem:
Mam pewien duży program główny, w którym naciśnięcie przycisków uruchamia odpowiednie podprogramy.
Niektóre z tych podprogramów odpalają własny panel użytkownika, w którym wybiera się różne ustawienia. Po wybraniu ustawień panel jest automatycznie zamykany - używam do tego celu: "subvi node setup". A program główny idzie dalej.
Czasami się zdarza, że użytkownik wciśnie nie ten przycisk, który zamierzał i wtedy musi wykonać pewną procedurę, aby zakończyć podprogram.
Wymyśliłem sobie, że jeśli ktoś błędnie kliknie i chce szybko opuścić podprogram, to dodam przycisk "Anuluj", który przerwie działanie podprogramu (niezależnie od stopnia jego wykonania).
Zastosowałem bloczek "stop" z rodziny "application control" w równoległej pętli w podprogramie i tu pojawia się problem:
Kiedy wcisnę przycisk "Anuluj" to zatrzymuje się nie tylko podprogram, ale również cały program główny.
Czy wobec tego da się jakoś zrobić, aby zatrzymać jedynie podprogram, a program główny idzie dalej i czeka na kolejne akcje?
Pozdrawiam
Fajfi
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

Re: Anulowanie działania podprogramu

Post autor: oczekp »

a próbowałeś zamykać subvi przez invoke node-> Front Panel->Close
w załączniku przykład
Załączniki
vi Folder.zip
(11.75 KiB) Pobrany 407 razy
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Re: Anulowanie działania podprogramu

Post autor: fajfi »

Dziękuję za odpowiedź.
Rozwiązanie przetestuję dopiero w poniedziałek, bo w domu mam tylko wersję 8.0.
Przyznaję, że 'invoke node' w ogóle nie przyszło mi do głowy, gdyż w zasadzie nigdy z niego nie korzystałem.
Próbowałem przed chwilą samemu coś wymyślić w mojej wersji, nawet znalazłem bardzo pouczający przykład użycia,
ale nie do końca zrozumiałem jaką referencję należy podłączyć do 'invoke node'.
Natomiast pojawia się pytanie: czy użycie tej metody spowoduje tylko "zniknięcie" front panelu czy rzeczywiste zakończenie
działania podprogramu i powrót do programu głównego?
Zresztą przekonam się w poniedziałek.
Czuję, że warto zagłębić się w 'invoke node' :)
Fajfi
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Re: Anulowanie działania podprogramu

Post autor: fajfi »

To jest prawie to o co mi chodziło.
Niestety występuje teraz inna trudność:
Jeśli podprogram wykona się normalnym trybem, tj. bez anulowania, to zmienna "anuluj" (ma wartość FALSE) bez problemu wychodzi do głównego programu.
Ale jak nacisnę przycisk "Anuluj", to z przerwanego podprogramu w ogóle nie wychodzi żadna zmienna do programu głównego (chciałbym, żeby wychodziło TRUE), która kończyłaby rozpoczętą akcję i umożliwiała przejście do następnej. Krótko mówiąc program główny w tym momencie zawisa i można go tylko wyłączyć.
Jak ominąć tę trudność?
Fajfi
Załączniki
fragment-sub-vi.jpg
anulowanie.jpg
anulowanie.jpg (13.78 KiB) Przejrzano 10321 razy
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

Re: Anulowanie działania podprogramu

Post autor: oczekp »

hmm nie wiem co tam jest źle, powinno działać. W załączniku przykład, jak się anuluje to wpisuje w kontrolke boolean i wysyla do programu głównego.
Załączniki
przykladzik.zip
(12.5 KiB) Pobrany 369 razy
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Re: Anulowanie działania podprogramu

Post autor: fajfi »

Dziękuję, ale u mnie wygląda to nieco inaczej: subvi w każdej akcji wykonuje się tylko raz i to użytkownik go zamyka poprzez ustawienie wszystkich parametrów.
Zamieszczam skrajnie uproszczoną symulację.
Uruchomienie konkretnej akcji włącza podprogram "parametry-sub" (w prawdziwym programie w jednych akcjach podobny subvi jest uruchamiany, w innych nie), tam są ustawiane rozmaite parametry, które następnie są przekazywane do programu głównego.
Zdarza się, że użytkownik wciśnie inną akcję niż zamierzał i teraz ma do wyboru dwie rzeczy: albo zamknąć cały program, albo przejść całą procedurę.
Z oczywistych względów sztuczne zamykanie jest złe, zaś w prawdziwym programie przechodzenie całej procedury tylko po to, żeby się wykonała jest uciążliwe.
Chciałbym móc anulować (wycofać) podprogram "parametry sub", ale tak, aby po anulowaniu program główny nadawał się do dalszej pracy.
Już próbowałem wielu rzeczy, ale jedyne co osiągnąłem, to:
1. anulowanie podprogramu zatrzymywało całość,
2. anulowanie podprogramu powodowało, że program główny zawisał, bo nie mógł dokończyć akcji, a próby wyprowadzenia zmiennej, która by informowała o zatrzymaniu akcji kończyły się niepowodzeniem.
Jak zatem w tym schemacie anulować wykonanie podprogramu?
Pozdrawiam
Fajfi
Załączniki
Symulacja.rar
(35.36 KiB) Pobrany 388 razy
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

Re: Anulowanie działania podprogramu

Post autor: oczekp »

Przypatrzyłem się załącznikowi i mam kilka pytań. Przede wszystkim czy wymagane jest, by dane operacje wykonywały się w tej kolejności? Nie może być po prostu jedna pętla z obsługą eventa? W załączniku nr 1 przykład takiego rozwiązania. Ja bym jeszcze w tym załączniku w podprogramie zmienił, że jak użytkownik zmieni ścieżkę do pliku to ona automatycznie się wczyta bez konieczności klikania wczytaj plik. Na razie zostawiłem tak jak było wcześniej. Ewentualnie jak bardzo zależy na tym by operacje wykonywały się w określonej kolejności można do zdarzeń i na wstępie poustawiać niektóre kontrolki na nieczynne i włączać je odpowiednio po dokonanych operacjach, a wyłączać te już użyte. Dodatkowo można dodać string indicatora, który by informował co należy w kolejnym kroku zrobić. (coś a'la to w załączniku vi3.zip)
Ewentualnie drugie rozwiązanie, które będzie się wykonywało w odpowiedniej kolejności to przykład w załączniku nr 2 oparty o maszynę stanów, która w odpowiedniej kolejności wykonuje swoje sekwencje.
Załączniki
vi3.zip
(33.78 KiB) Pobrany 393 razy
vi1.zip
(29.77 KiB) Pobrany 365 razy
vi2.zip
(31.67 KiB) Pobrany 378 razy
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Re: Anulowanie działania podprogramu

Post autor: fajfi »

Dzięki Oczekp
Jesteś wielki! :D
Już odpowiadam i przy okazji jeszcze o coś spytam:
Nie jest konieczne (a przynajmniej nikt tego nie wymaga), aby operacje były wykonywane w określonej kolejności.
Zrobiłem w ten sposób, bo nie umiałem inaczej :)
Odpowiedź na pierwsze pytanie w oczywisty sposób odpowiada również na drugie - tak, może być jedna pętla z obsługą eventa.
Muszę to wszystko przetrawić zanim zdecyduję się któreś z zaproponowanych rozwiązań.
Wydaje mi się, że maszyna stanów jest bardziej elegancką strukturą.
A teraz sam chciałem jeszcze spytać o parę rzeczy:
1. Jak to się dzieje, że subvi odpala a potem zamyka swój front panel, bo w "subVI node setup" nie zaznaczono żadnego z wyborów.
2. Proponujesz: "jak użytkownik zmieni ścieżkę do pliku to ona automatycznie się wczyta bez konieczności klikania wczytaj plik";
zrozumiałem z tego, że muszę dorobić zdarzenie dla zadajnika "Path" i z węzła danych tego zdarzenia wyciągnąć "New Val"?
Tylko jak to połączyć z przyciskiem "wczytaj plik", gdy z jakiegoś powodu będę chciał wczytać ponownie ten sam plik, ale użyć go w innej akcji? A może źle zrozumiałem?
3. Prawdę mówiąc chętnie pozbyłbym się tych guzików typu "wczytaj plik" lub "wczytaj polaryzację", ale niestety jeśi użyję eventa i nie zmienię np. polaryzacji, to jak mam opuścić zdarzenie i otrzymać "new val" z węzła danych? W tej chwili nie wiem, dlatego najpierw ustawiam odpowiednią wartość, a z pętli z ewentem wychodzę poprzez zmianę stanu tego nieszczęsnego przycisku "wczytaj polaryzację". Można lepiej [eleganciej :D ]?
Jeszcze raz dziękuję i pozdrawiam
Fajfi
oczekp
Posty: 161
Rejestracja: 22 lis 2009 15:12
Wersja środowiska: LabVIEW 2010

Re: Anulowanie działania podprogramu

Post autor: oczekp »

tak na szybko odpowiem, bo mi się spieszy na piwko i meczyk, jutro jak coś resztę dopisze:)
1) SubVi zamyka swój Front panel pewnie dlatego, że jest zaznaczone w:
Prawym myszy w prawy górny róg ikony, gdzie jest ikona subvi-> Vi Proporties->Window Appearance->Customize i zaznaczyć Show Front Panel when loaded oraz Close afterwards if originally closed.
2) Dokładnie tak, dodajesz zdarzenie Path-> Value change, ona się za każdym wywoła i wczyta nową scieżkę pliku, więc się nie trzeba martwić. W załączniku vi3.zip bodajże zrobiłem właśnie w ten sposób.
3) Jeżeli nie zmieni się wartości polaryzacji to na wyjściu otrzymasz po prostu taką wartość jaka jest ustawiona domyślnie, lub na front panelu

Co do struktury event to pętla się wykonuje tylko w przypadku, gdy pojawi się jakieś zdarzenie na front panelu i to zaleta, że nie żzera zasobów nipotrzebnie.
Maszyna stanów w tym przypadku co zamieściłem wykonuję się non stop. Oczywiście można połączyć jedno i drugie, ale nie ma też co przesadzać:) Jak coś to napizs, a ja jutro postaram się na spokojnie wszystko wyjaśnić.
Pozdrawiam i nie ma za co!
Awatar użytkownika
fajfi
Posty: 185
Rejestracja: 28 sty 2004 00:00
Wersja środowiska: LabVIEW 2010
Lokalizacja: Wrocław

Re: Anulowanie działania podprogramu

Post autor: fajfi »

Dopiero dzisiaj miałem możliwość obejrzeć vi3.zip.
I to jest chyba najładniejsze z rozwiązań. Prowadzi użytkownika niemal za rękę i elegancko blokuje to co w danej chwili niepotrzebne.
Chyba w pozostałych podprogramach i w innych krytycznych miejscach będę musiał zastosować to samo.
Oprócz tego bardzo mi się podoba sposób wczytywania ścieżki dostępu i pozbycie się przycisku "wczytaj plik" (mam go w paru miejscach) - w końcu po co mnożyć niepotrzebne byty? :)
Teraz już wszystko jasne.
Na koniec taka drobnostka, troszkę obok tematu:
Zamierzam pozbyć się przycisku "wczytaj polaryzację" i jemu podobnych. Zamiast przełącznika chcę wprowadzić dwa przyciski - np. "polaryzacja dodatnia" i "polaryzacja ujemna", i każdy z nich będzie uruchamiał inny proces, albo wysyłał inną wartość dalej.
Czy to dobry pomysł?
Fajfi
ODPOWIEDZ