Ciągłe wykonywanie eventu z event structure

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011
Has thanked: 1 time

Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 » 31 sie 2017 15:38

Hej,

mam taką sprawę że mam kilka pętli while korzystających z kolejek. Jedna główna pętla chodzi na okrągło, a pozostałe są odpalane poprzez przyciski w głównej pętli. Te przyciski nie są do niczego podpięte, tylko jest jedna pętla z "Event structure", która w zależności jaki nacisnę przycisk to to wysyła, np. przycisk stop który wyłącza wszystkie pętle. I właśnie tu rodzi mi się pytanie: Mam pewien event reagujący na przycisk OK (załącznik 1), i za każdym razem gdy się go kliknie to wykonywany jest raz, wiadomo. Natomiast moim marzeniem jest coś takiego, aby dany event wykonywał się na okrągło co jakiś określony czas. Powiedzmy mamy przycisk z akcją 'switch when pressed', i jeżeli mamy na nim logiczną jedynkę to event się co chwila wykonuje, a jeżeli go odklikniemy to event nie wykonuje się. Ja wiem że może architektura z event structure nie jest najlepsza, ale zacząłem program robić dość dawno i wtedy o tym nie pomyślałem. Jeżeli ktoś coś by wiedział... to z góry dziękuję :D
Załączniki
Przechwytywanie.PNG

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 31 sie 2017 15:57

Najprościej (niekoniecznie najlepiej) byłoby brać wartość NewVal w zdarzeniu dla przycisku OK i w zależności od wartości (T/F) zrobić case.
Jeśli jest T (czyli wciśnięty) to zawołaj Prop. Node -> Value (Signaling). Jak F (czyli wyłączony) to nic nie rób.
Własność Value (Signaling) spowoduje ponowne uruchomienie Eventu.
Daj sobie na wszelki wypadek jakiś Wait w tym zdarzeniu, żeby nie chodziło to za szybko...
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011
Has thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 » 31 sie 2017 16:24

Tzn, jak ten Val(sgnl) podpiąć? Bo tak jak jest teraz, to działa co prawda, ale nie można nacisnąć innego przycisku (np stop), oraz pętla Buttons control działa na okrągło, a w zamyśle ma działać tylko przy wykonywaniu eventa.
Załączniki
Przechwytywanie.PNG

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 01 wrz 2017 09:00

To był głupi pomysł...
Nie chciało mi się odpalić LV i sprawdzić i wyszedł klops.
Jak coś wymyślę to dam znać ;)
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011
Has thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 » 01 wrz 2017 10:01

Byłbym wdzięczny ;)

Chodzi też o to aby program reagował na pozostałe przyciski. Siedzę nad tym i nic nie mogę wykminić, a nie chciałbym przerabiać architektury programu.

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 01 wrz 2017 11:51

No to bardziej toporne rozwiązanie...
Zrób sobie zdarzenie Timeout i je obsłuż w taki sam sposób jak Twój przycisk OK.
Timeout ustaw sobie na bardzo małą wartość, żeby latał dość często (niekoniecznie 1ms... wystarczy 10).
Wewnątrz zdarzenia sprawdzasz stan przycisku.
Jak jest TRUE, to sprawdzasz kiedy ostatni raz była wykonana funkcjonalność przycisku OK.
Jeśli czas nie minął, to nic nie rób, jeśli już czas, to wykonaj co trzeba...

Masakra... ale kombinuję :)
Załączniki
Event.png
Event.png (41.54 KiB) Przejrzano 1136 razy
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011
Has thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 » 01 wrz 2017 14:05

Zrobiłem tak jak zaproponowałeś i jest tak:
1 - po włączeniu programu nic się nie dzieje (tak ma być!), dopiero po włączeniu przycisku zaczyna wszystko ruszać, czyli jest OK. Natomiast po wyłączeniu go, program dalej działa, moze coś w falsach źle podpiąłem? Wrzuciłem domyślnie wartość 0 (załącznik).
2 - Pozostałe przyciski nie reagują, jak wspominałem program ma kilka pętli w których wykorzystuję kolejkowanie i przycisk STOP który ma je wszystkie wyłączyć nie działa.
Załączniki
Przechwytywanie.PNG

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 05 wrz 2017 08:32

Znowu nie przetestowałem... powinni mnie z roboty wylać.

No nic. W załączniku masz przykład (ten sam co w poprzednim poście), tylko przetestowany i działający.
Event.png
Event.png (52.02 KiB) Przejrzano 1061 razy
Jak jest OK wciśnięty, to wykonuje się akcja w zewnętrznym stanie TRUE. W nim sprawdzany jest czas od poprzedniego kliknięcia.
I tutaj jest mała zmiana w stosunku do poprzedniego postu: w stanie FALSE (w wewnętrznym case) jest przedrutowana poprzednia wartość CzasOstatniegoWykonaniaPrzyciskuOK. Poprzednio zapomniałem o tym.
A w stanie TRUE wewnętrznego case jest inkrementacja licznika.
U mnie to działa jak należy. Przetestuj i daj znać.
Załączniki
Test.vi
(8.61 KiB) Pobrany 18 razy
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

MK_Zuk
Posty: 80
Rejestracja: 01 gru 2009 11:53
Wersja środowiska: LabVIEW 2014
Has thanked: 1 time
Been thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: MK_Zuk » 06 wrz 2017 23:35

Witam,
proponuję w przycisku obsłużyć zmianę wartości Timeout terminal wartości -1
i jakąś zadaną.
Prosty przykład znajduje się w pliku:
cykliczna obsluga prosta.png
cykliczna obsluga prosta.png (28.33 KiB) Przejrzano 1017 razy
wersja rozwojowa z 4 przyciskami (z możliwością obsługi dwóch na raz - Akcja 1 oraz akcja 2)
znajduje się w pliku:
cykliczna obsluga kompleks.png
cykliczna obsluga kompleks.png (41.44 KiB) Przejrzano 1017 razy
Ta wersja jest rozwojowa a w dodatku łatwo wszystko na subVI porozrzucać bo kod powtarza się,
wersja poprawiona znajduje się w pliku:
cykliczna obsluga do sub.png
cykliczna obsluga do sub.png (48.67 KiB) Przejrzano 1017 razy
Pozdrawiam
Zuk

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 07 wrz 2017 08:11

Hej Zuk.
Jak już coś pokazujesz w sieci to posprzątaj chociaż diagram, co by inni złych nawyków nie nabierali.

A Twoje rozwiązanie ma jedną wadę:
Jeśli użytkownik będzie robił cokolwiek na panelu to Timeout się nie uruchomi, lub uruchomi rzadko.
Lepiej mieć szybki Timeout i w nim sprawdzać czy czas już minął.
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011
Has thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 » 07 wrz 2017 13:17

Pitol, może nie wywalą Cię z roboty (i mnie dzieki temu też :D), wszystko jak do tej pory działa jak należy, dzięki wielkie ;) Jeżeli coś by dalej sprawiało problemy to się odezwę.

MK_Zuk
Posty: 80
Rejestracja: 01 gru 2009 11:53
Wersja środowiska: LabVIEW 2014
Has thanked: 1 time
Been thanked: 1 time

Re: Ciągłe wykonywanie eventu z event structure

Post autor: MK_Zuk » 07 wrz 2017 14:53

Pitol pisze:
07 wrz 2017 08:11
Hej Zuk.
Jak już coś pokazujesz w sieci to posprzątaj chociaż diagram, co by inni złych nawyków nie nabierali.
Ok, postaram zapamiętać i poprawić się, kody pisałem na szybko przed snem... (-|

Nic też nie stoi na przeszkodzie, żeby w moim rozwiązaniu przyspieszyć timeouta
i wykonywać akcje co zadaną liczbę iteracji.

Pozdrawiam
Zuk

Awatar użytkownika
micard
Posty: 134
Rejestracja: 30 wrz 2011 11:28
Wersja środowiska: LabVIEW 2016
Has thanked: 4 times
Been thanked: 2 times
Kontakt:

Re: Ciągłe wykonywanie eventu z event structure

Post autor: micard » 07 wrz 2017 22:12

Generalnie zabawa z timeout'em to wielkie zuo.
Polecanym rozwiązaniem jest rejestracja "user event" w event structure i odpalenie w nowym wątku (np przez "run and forget") vi który po zadanym czasie wygeneruje owy event.
Jeśli jesteś zainteresowany takim podejściem to mogę jutro wydziergać przykładowy vi.

Awatar użytkownika
Pitol
Moderator
Posty: 916
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 1 time
Been thanked: 7 times

Re: Ciągłe wykonywanie eventu z event structure

Post autor: Pitol » 08 wrz 2017 09:22

micard pisze:
07 wrz 2017 22:12
Generalnie zabawa z timeout'em to wielkie zuo.
Zgadzam się z Tobą, jednak w tym przypadku kolega uzurpator12 nie chciał/nie mógł iść w bardziej "koszerne" rozwiązania.

Twoja propozycja jest ciekawa. Problem w tym, że dodała by sporo skomplikowania (chyba, że czegoś nie widzę).
Jak kontrolowałbyś ten nowy wątek? Zmienną globalną czy innym podobnym rozwiązaniem?

Timeout to zło... ale zło konieczne :YMDEVIL: w tym przypadku...

Ale chętnie zobaczyłbym Twoje rozwiązanie więc, śmiało, dodaj przykład.
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

Awatar użytkownika
micard
Posty: 134
Rejestracja: 30 wrz 2011 11:28
Wersja środowiska: LabVIEW 2016
Has thanked: 4 times
Been thanked: 2 times
Kontakt:

Re: Ciągłe wykonywanie eventu z event structure

Post autor: micard » 09 wrz 2017 20:33

Wszystko zależy od tego jak dużo "skomplikowania" zaczyna być problemem. Najważniejsze wg mnie jest to, żeby developer odpowiedzialny za późniejsze utrzymanie kodu nie miał z tym zbyt dużego problemu.

Załączony projekt pokazuje uruchomienie vi w trybie "call and forget", którego jedynym zadaniem jest wygenerowanie event'a po zadanym czasie. Clear error jest tam po to, żeby nie przejmować się błędem, gdy główne vi zostanie zatrzymane i event nie będzie już istniał.

Main vi obsługuje tego event'a (tu poprzez dodatnie linii do string'a) i wymusza kolejne odpalenie trigger.vi poprzez (nieeleganckie) ustawienie wartości guzika z flagą signalling.
Załączniki
loop.zip
(97.41 KiB) Pobrany 14 razy
trigger.png
trigger.png (19.71 KiB) Przejrzano 908 razy
main.png

ODPOWIEDZ