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

Ciągłe wykonywanie eventu z event structure

Post autor: uzurpator12 »

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: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

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...
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011

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

Post autor: uzurpator12 »

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: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

To był głupi pomysł...
Nie chciało mi się odpalić LV i sprawdzić i wyszedł klops.
Jak coś wymyślę to dam znać ;)
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011

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

Post autor: uzurpator12 »

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: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

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 15168 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011

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

Post autor: uzurpator12 »

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: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

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 15093 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 404 razy
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
MK_Zuk
Posty: 83
Rejestracja: 01 gru 2009 11:53
Wersja środowiska: LabVIEW 2014

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

Post autor: MK_Zuk »

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 15049 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 15049 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 15049 razy
Pozdrawiam
Zuk
Awatar użytkownika
Pitol
Moderator
Posty: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

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ął.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
uzurpator12
Posty: 8
Rejestracja: 31 sie 2017 15:28
Wersja środowiska: LabVIEW 2011

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

Post autor: uzurpator12 »

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: 83
Rejestracja: 01 gru 2009 11:53
Wersja środowiska: LabVIEW 2014

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

Post autor: MK_Zuk »

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: 207
Rejestracja: 30 wrz 2011 11:28
Wersja środowiska: LabVIEW 2017
Kontakt:

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

Post autor: micard »

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: 982
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

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

Post autor: Pitol »

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.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Awatar użytkownika
micard
Posty: 207
Rejestracja: 30 wrz 2011 11:28
Wersja środowiska: LabVIEW 2017
Kontakt:

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

Post autor: micard »

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 353 razy
trigger.png
trigger.png (19.71 KiB) Przejrzano 14940 razy
main.png
ODPOWIEDZ