Problem z uruchomieniem
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Problem z uruchomieniem
Witam ponownie. Tworzę aplikację która ma za zadanie wizualizować co dzieje się w pomieszczeniach domku jednorodzinnego. Jestem bliski ukończenia tego zadania jednak napotkałem pewien problem. Po wstawieniu pętli która miała za zadanie obracać wiatrak, pozostałe kontrolki przestały działać. To samo działo się po wstawieniu rejestratora zdarzeń odczytującego z pliku stan uruchamianych kontrolek, który na początek wstawiłem w zakładkę "Salon" i jedynie kontrolki z tej zakładki działały. Chciałbym jakoś rozwiązać ten problem ale skończyły mi się pomysły. Może znajdzie się ktoś, kto jest ode mnie mądrzejszy i mi pomoże. Bardzo proszę o ewentualne uwagi które pomogą mi zoptymalizować działanie programu. Proszę też o wyrozumiałość gdyż jest to mój pierwszy poważny program w LabVIEW. Pozdrawiam
- Załączniki
-
- Kontrolki.rar
- (311.15 KiB) Pobrany 390 razy
- smiga
- Administrator
- Posty: 824
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: Problem z uruchomieniem
No cóż, to wszystko jest "niezgodne z zasadami sztuki"
Wiatrak kręci się w pętli, która wykonuje się 1000 razy co 150ms - ten kawałek programu zajmuje więc 150s czasu.
Struktura całego programu nie jest "elegancka".
Proponuję wykorzystać gotowe templeat'y (File/New.../Design Patterns) jako bazę do zbudowania programu - polecam jeden z dwóch (drugi daje więcej możliwości):
- User Interface Event Handler
- Producer/Consumer Design Pattern (Events)
Proponuję trochę o tym poczytać.
Zauważ, że wszystkie programy w 99% przypadków zamknięte są w pętli While co pozwala na ich ciągle wykonywanie się.
Ty zbudowałeś program, który wykona się raz (wszystko poza pętlą Event), a później czeka na Event i tylko jeden z 3 Event'ów wykonuje.
Wiatrak kręci się w pętli, która wykonuje się 1000 razy co 150ms - ten kawałek programu zajmuje więc 150s czasu.
Struktura całego programu nie jest "elegancka".
Proponuję wykorzystać gotowe templeat'y (File/New.../Design Patterns) jako bazę do zbudowania programu - polecam jeden z dwóch (drugi daje więcej możliwości):
- User Interface Event Handler
- Producer/Consumer Design Pattern (Events)
Proponuję trochę o tym poczytać.
Zauważ, że wszystkie programy w 99% przypadków zamknięte są w pętli While co pozwala na ich ciągle wykonywanie się.
Ty zbudowałeś program, który wykona się raz (wszystko poza pętlą Event), a później czeka na Event i tylko jeden z 3 Event'ów wykonuje.
Ostatnio zmieniony 13 kwie 2010 20:26 przez smiga, łącznie zmieniany 1 raz.
Problem z uruchomieniem
Ok, czegoś nie rozumiem... Masz w programie strukturę Event, ale nie masz nawet jednej pętli While!
Czy w takim razie (aż strach się zapytać ;) ) uruchamiasz program za pomocą Run Continously? Jeśli tak, to moją pierwszą sugestią jest zapoznanie się z Helpem do LabVIEW, bo programów, które mają działać 'ciągle' w żadnym wypadku się w ten sposób nie uruchamia!
Jeśli faktycznie tak uruchamiasz ten program, to nic dziwnego, że 'przestał działać' po wstawieniu pętli For. W końcu każesz jej się wykonać 1000 razy, a w jej wnętrzu dałeś opóźnienie 150 ms... Poczekaj dwie i pół minuty, a program się pewnie odezwie ;)
EDIT:
Jeszcze dwie uwagi:
1. Przy debuggowaniu polecam korzystać z Highlight Execution - łatwo sprawdzić gdzie badany program się 'wiesza'
2. Polecam trochę ograniczyć 'rozłożystość' kodu. Póki co program jest rozbudowany, ale w pionie
Nawet naprawdę duże programy można zmieścić na jednym ekranie.
Czy w takim razie (aż strach się zapytać ;) ) uruchamiasz program za pomocą Run Continously? Jeśli tak, to moją pierwszą sugestią jest zapoznanie się z Helpem do LabVIEW, bo programów, które mają działać 'ciągle' w żadnym wypadku się w ten sposób nie uruchamia!
Jeśli faktycznie tak uruchamiasz ten program, to nic dziwnego, że 'przestał działać' po wstawieniu pętli For. W końcu każesz jej się wykonać 1000 razy, a w jej wnętrzu dałeś opóźnienie 150 ms... Poczekaj dwie i pół minuty, a program się pewnie odezwie ;)
EDIT:
Jeszcze dwie uwagi:
1. Przy debuggowaniu polecam korzystać z Highlight Execution - łatwo sprawdzić gdzie badany program się 'wiesza'
2. Polecam trochę ograniczyć 'rozłożystość' kodu. Póki co program jest rozbudowany, ale w pionie

Ostatnio zmieniony 13 kwie 2010 20:42 przez coolfon, łącznie zmieniany 2 razy.
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Re: Problem z uruchomieniem
ok, poprawiłem kilka rzeczy zgodnie ze wskazówkami. Korzystałem z 'Clean up diagram' i dlatego tak mi go rozciagnęło w pionie. Jednak w dalszym ciągu program strasznie się "muli"
. Co zrobić, żeby go trochę przyspieszyć i żeby efekty widoczne były w miarę jak najszybciej?

- Załączniki
-
- Kontrolki1.rar
- (312.5 KiB) Pobrany 375 razy
- smiga
- Administrator
- Posty: 824
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: Problem z uruchomieniem
Wciąż polecam zmienić architekturę programu.
W nowych pętlach While nie ma żadnego opóźnienia (wstaw tam jakiś Wait chociaż), więc zajmują "cały czas" procesorowi, a ponieważ działają równolegle to jeszcze go sobie "kradną" (pomijając inne wątki dziejące się w systemie).
Dalej szereg elementów (zakładek) wykona się tylko raz.smiga pisze: - User Interface Event Handler
- Producer/Consumer Design Pattern (Events)
Proponuję trochę o tym poczytać.
W nowych pętlach While nie ma żadnego opóźnienia (wstaw tam jakiś Wait chociaż), więc zajmują "cały czas" procesorowi, a ponieważ działają równolegle to jeszcze go sobie "kradną" (pomijając inne wątki dziejące się w systemie).
Problem z uruchomieniem
Naprawdę weź sobie do serca to, co Ci pisze smiga! Konieczna jest zmiana architektury programu, tym bardziej jeśli jest to praca magisterska (sądząc po ścieżce do pliku w programie...).
Te pętle While dołożyłeś chyba losowo. Każdy SubVI wykona się tylko raz, a chyba nie o to Ci chodzi. Zapoznaj się z Helpem, a zwłaszcza z zagadnieniami, o których napisał smiga.
TUTAJ masz przykład jak w prosty sposób obsługiwać przyciski na front panelu.
Mam jeszcze uwagę co do Twoich SubVI - wiele z nich zawiera w sobie niemal wyłącznie strukturę Case. W ten sposób tylko utrudniasz sobie pracę, bo zamykanie tego do SubVI nic Ci nie daje.
Naprawdę przysiądź chwilę nad tym programem. Zdecydowana większość kontrolek to boolean'y, obliczeń nie ma prawie wcale... Napisanie tego nie powinno Ci zająć więcej niż 2h.
Te pętle While dołożyłeś chyba losowo. Każdy SubVI wykona się tylko raz, a chyba nie o to Ci chodzi. Zapoznaj się z Helpem, a zwłaszcza z zagadnieniami, o których napisał smiga.
TUTAJ masz przykład jak w prosty sposób obsługiwać przyciski na front panelu.
Mam jeszcze uwagę co do Twoich SubVI - wiele z nich zawiera w sobie niemal wyłącznie strukturę Case. W ten sposób tylko utrudniasz sobie pracę, bo zamykanie tego do SubVI nic Ci nie daje.
Naprawdę przysiądź chwilę nad tym programem. Zdecydowana większość kontrolek to boolean'y, obliczeń nie ma prawie wcale... Napisanie tego nie powinno Ci zająć więcej niż 2h.
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Problem z uruchomieniem
Macie rację, właśnie trochę poczytałem i też doszedłem do wniosku, że trzeba będzie zmienić architekturę. Mam jeszcze pytanie. Czy Producer/Consumer Design Pattern (Events) wykorzystać tylko do jednej zakładki w moim programie, i tak po kolei do pozostałych zakładek (ale to chyba wyjdzie podobnie jak teraz??) czy może da się zwiększyć ilość 'producentów' i 'konsumentów' tak aby dostosować to do moich potrzeb (podobnie jak w przykładzie zamieszczonym przez coolfon'a:))? Jakie są ograniczenia w zastosowaniu tego Template? Ile może być producentów i konsumentów?
Ps. Wielkie dzięki za pomoc
Ps. Wielkie dzięki za pomoc

Re: Problem z uruchomieniem
Ponieważ w Twoim programie reakcją na większość Event'ów jest zmiana jakiegoś LED'a (boolean'a), całość da się zrobić na jednym 'producencie' i jednym 'konsumencie'.
Producentem jest w tym przypadku pętla While ze strukturą Event w środku. Po co Ci więcej niż jedna? Ograniczenia pojawiają się w momencie, gdy reakcją na naciśnięcie jest np jakieś długo trwające odliczanie (np kilka sekund), w trakcie którego chciałbyś wywołać jakieś inne działanie (zmiana boolean'a). Wtedy potrzebujesz osobnego konsumenta (dla tej 'długiej' akcji). Ale tylko wtedy! Ponownie odsyłam do zamieszczonego przeze mnie przykładu.Gorbaczov pisze: czy może da się zwiększyć ilość 'producentów' i 'konsumentów' tak aby dostosować to do moich potrzeb (podobnie jak w przykładzie zamieszczonym przez coolfon'a:))? Jakie są ograniczenia w zastosowaniu tego Template? Ile może być producentów i konsumentów?
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Re: Problem z uruchomieniem
Użyłem polecanego przez Was template i udało mi się stworzyć program wykorzystujący kolejkę. Jednak w dalszym ciągu program sie muli. Co poprawić, aby działał płynnie? Może wstawić jakieś opóźnienia czasowe? Mam też problem z Regulacją termometru. Wskaźnik stoi w miejscu, zmienia się jedynie kolor wskaźnika. Pewnie to dlatego, że w event structure przypisałem mu własność "Change value". Jak to ustawić aby płynnie przesuwał się wskaźnik? Jeśli macie jeszcze jakieś dodatkowe uwagi to bardzo chętnie je poznam 

- Załączniki
-
- Kolejka.vi
- (199.13 KiB) Pobrany 398 razy
- smiga
- Administrator
- Posty: 824
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: Problem z uruchomieniem
Podepnij regulacje temperatury do wskaźnika temperatura w Event'cie ... chyba że ma on reagować na coś innego - teraz nie jest ten wskaźnik podłączony do niczego.
W 2 górnych pętlach While wstaw jakieś opóźnienie np. 100ms Wait lub Wait Until Next.
Włącz sobie śledzenie (żarówka) i pooglądaj co program robi.
W 2 górnych pętlach While wstaw jakieś opóźnienie np. 100ms Wait lub Wait Until Next.
Włącz sobie śledzenie (żarówka) i pooglądaj co program robi.
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Problem z uruchomieniem
Hmmm, nie za bardzo to widzę, program nie działa poprawnie. Po wciśnięciu przycisku zapala się dioda, ale po wyciśnięciu nie dzieje się nic. Prześledziłem działanie programu za pomocą żarówki i zauważyłem że reaguje tylko na pierwszą czynność a nie reaguje na dalsze akcje.

Wiecie może jak to poprawić?
Ps. regulacja temperatury działa poprawnie ale wstawienie opóźnienia w górnych pętlach niewiele pomogło...

Wiecie może jak to poprawić?
Ps. regulacja temperatury działa poprawnie ale wstawienie opóźnienia w górnych pętlach niewiele pomogło...
- smiga
- Administrator
- Posty: 824
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: Problem z uruchomieniem
Przy kolejkach opóźnienie na górnych pętlach nie jest potrzebne i niczego nie zmieni, bo kolejki czekają - sorki za zamieszanie.
Zastosowanie 2 pętli czytających z kolejkami, czyli pobierających elementy z kolejki ma jedną wadę - nie wiemy która najpierw przeczyta.
W przypadku opisywanej "łazieniki" element trafia do pętli nie obsługującej "łazieniki" więc nic się nie dzieje.
Raz pobrany element z kolejki nie jest do pobrania ponownie w innym miejscu (kolejka jest pusta). To jest tak jakbyśmy odkładali elementy na stosie pamięci - jak coś zabrało to drugie "coś" nie weźmie już tego samego, weźmie kolejny element.
W takiej konstrukcji gdzie jest kilka pętli czytających polecam zastosowanie notyfikatorów.
Można też zostawić kolejkę i wywalić jedną pętlę, robiąc wszystko w jednej.
Zastosowanie 2 pętli czytających z kolejkami, czyli pobierających elementy z kolejki ma jedną wadę - nie wiemy która najpierw przeczyta.
W przypadku opisywanej "łazieniki" element trafia do pętli nie obsługującej "łazieniki" więc nic się nie dzieje.
Raz pobrany element z kolejki nie jest do pobrania ponownie w innym miejscu (kolejka jest pusta). To jest tak jakbyśmy odkładali elementy na stosie pamięci - jak coś zabrało to drugie "coś" nie weźmie już tego samego, weźmie kolejny element.
W takiej konstrukcji gdzie jest kilka pętli czytających polecam zastosowanie notyfikatorów.
Można też zostawić kolejkę i wywalić jedną pętlę, robiąc wszystko w jednej.
- Załączniki
-
- Kolejka.vi
- (198.45 KiB) Pobrany 378 razy
Ostatnio zmieniony 15 kwie 2010 16:55 przez smiga, łącznie zmieniany 1 raz.
-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Problem z uruchomieniem
Wielkie dzięki Smiga, Sam bym na to na pewno nie wpadł 

-
- Posty: 29
- Rejestracja: 21 gru 2009 13:23
- Wersja środowiska: LabVIEW 8.6
- Lokalizacja: Lublin
Re: Problem z uruchomieniem
Witam ponownie. Dokonałem modyfikacji wcześniejszego programu tak, aby była możliwość sterowania przyciskami za pomocą napięcia odczytywanego z karty. wcześniej ustawione napięcie będzie sprawdzane z napięciem zmierzonym i w zależności od otrzymanego stanu (true lub false) będzie wykonywana właściwa czynność. Mam problem związany z kolejką (tak myślę), ponieważ działa jedynie ta część która jest ustawiona na "default" w pętli Case. co zrobić zeby program działał poprawnie, czyli były wykrywane stany we wszystkich zakładkach?
- Załączniki
-
- Dom 8.6proba.vi
- (194.87 KiB) Pobrany 375 razy
- smiga
- Administrator
- Posty: 824
- Rejestracja: 04 paź 2009 12:41
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Słupsk
Re: Problem z uruchomieniem
Zauważ, że w pętli producenta do Case'a masz podłączoną stałą "Dom" - czyli wchodzi do case'a "dom" , a że takiego nie ma to Default "Salon".
Przełączanie zakładki Tab Control, a jeszcze lepiej zmiana wartości czujników dla danej zakładki, powinno wygenerować odpowiedni Case.
Jeżeli jest to symulacja i klikasz na każdy czujnik (każda zmiana napięcia jest ręcznie modyfikowana) to proponuję zastosować strukturę Event.
Najprościej to zrobić Eventy (Value Change) dla każdej kontrolki tak jak na obrazku:
Przełączanie zakładki Tab Control, a jeszcze lepiej zmiana wartości czujników dla danej zakładki, powinno wygenerować odpowiedni Case.
Jeżeli jest to symulacja i klikasz na każdy czujnik (każda zmiana napięcia jest ręcznie modyfikowana) to proponuję zastosować strukturę Event.
Najprościej to zrobić Eventy (Value Change) dla każdej kontrolki tak jak na obrazku:
- Załączniki
-
- Najprościej to zrobić Eventy (Value Change) dla każdej kontrolki tak jak na obrazku
. - kuchnia.png (8.8 KiB) Przejrzano 16078 razy