Strona 1 z 2

Ciągłe wykonywanie eventu z event structure

: 31 sie 2017 15:38
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

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

: 31 sie 2017 15:57
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...

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

: 31 sie 2017 16:24
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.

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

: 01 wrz 2017 09:00
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ć ;)

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

: 01 wrz 2017 10:01
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.

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

: 01 wrz 2017 11:51
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ę :)

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

: 01 wrz 2017 14:05
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.

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

: 05 wrz 2017 08:32
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 15173 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ć.

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

: 06 wrz 2017 23:35
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 15129 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 15129 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 15129 razy
Pozdrawiam
Zuk

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

: 07 wrz 2017 08:11
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ął.

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

: 07 wrz 2017 13:17
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ę.

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

: 07 wrz 2017 14:53
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

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

: 07 wrz 2017 22:12
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.

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

: 08 wrz 2017 09:22
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.

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

: 09 wrz 2017 20:33
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.