Opóźnianie sygnałów 0-1
Opóźnianie sygnałów 0-1
Witam, mam pewien prosty problem. Chciałbym stworzyć blok, do którego dostarczany jest sygnał 0-1. W momencie, gdy nastąpi zmiana z 0 na 1, układ odczekuje wskazaną ilość milisekund, a następnie przesyła sygnał dalej. Zaś gdy nastąpi zmiana z 1 na 0, układ zmienia analogicznie swój stan na wyjściu natychmiast, bez żadnego zwlekania. Czyli takie proste oczekiwanie na sygnał i przepuszczanie go dalej po odczekaniu kilku chwil (tylko w przypadku TRUE). Próbowałem użyć Time Delay i Wait w różnych kombinacjach z pętlami i warunkami, ale bez skutku, co najwyżej funkcja opóźniała wejście sygnału, ale też i jego wyjście... Czy istnieje może jakiś prosty sposób na rozwiązanie tego problemu?
- Pitol
- Moderator
- Posty: 987
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Opóźnianie sygnałów 0-1
Wrzuć swój kod to doradzimy najlepsze rozwiązanie.
Re: Opóźnianie sygnałów 0-1
To, co stworzyłem jest w załączniku. W przypadku zmiany z 0 na 1 jest w porządku, odczekuje dany czas, ale jak już zmieniam z powrotem 1 na 0 natychmiastowo zmienia tylko przy opóźnieniu ustalonym na nie większe niż 1 sekunda. Dla większych wartości lampka wyraźnie gaśnie później niż po wciśnięciu buttona. Ciężko też określić dokładnie, od czego ten czas wygaśnięcia zależy... wie ktoś, dlaczego tak się dzieje? Aha, z LabVIEW nie miałem wcześniej do czynienia, zatem nie zdziwcie się, jeżeli zapytam o coś banalnego 

- Załączniki
-
- Czekaj.vi
- (19.06 KiB) Pobrany 379 razy
-
- Posty: 82
- Rejestracja: 26 maja 2009 07:18
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Sucha Beskidzka
- Kontakt:
Re: Opóźnianie sygnałów 0-1
Dzieje sie tak bo delay wykonywany w każdym obrocie pętli jeśli jest wciśniety przycisk. I w zalezności jak trafisz na ten delay podczas wyłączania przycisku diodka jest wyłączana po takim czasie.
W tym przypakdku lepije by było użyć event case. Spróbuj czegoś takiego jak w załączniku.
Jak dodasz wiecej przcisków i diodek to dodajesz tylko eventy do obsługi zdarzeń i możesz definiowac delay dla każdego przycisku.
W tym przypakdku lepije by było użyć event case. Spróbuj czegoś takiego jak w załączniku.
Jak dodasz wiecej przcisków i diodek to dodajesz tylko eventy do obsługi zdarzeń i możesz definiowac delay dla każdego przycisku.
- Załączniki
-
- Event Case.vi
- Event obsługiwany jest po zmianie stanu przycisku.
Stop zatrzymuje program. - (10.25 KiB) Pobrany 399 razy
Opóźnianie sygnałów 0-1
Ooo, świetne, dokładnie o coś takiego mi chodziło, dzięki
Spróbuję ogarnąć samemu co i jak, gdybym czegoś nie potrafił wykminić, jeszcze się zapytam ;) Dzięki!
EDIT: Jest jeszcze jedna sprawa, której do końca nie potrafię ogarnąć. Funkcja Wait najwyraźniej działa na "całość" programu, czyli wstrzymuje wszystkie akcje dookoła. Czy jest jakiś sposób, na zawężenie tego pola do tylko wybranych funkcji? Chciałbym na przykład stworzyć program, który jednym przyciskiem zapala dwie lampki, ale drugą z nich ze wskazanym opóźnieniem. Jak można to zrobić, istnieje jakaś struktura?

EDIT: Jest jeszcze jedna sprawa, której do końca nie potrafię ogarnąć. Funkcja Wait najwyraźniej działa na "całość" programu, czyli wstrzymuje wszystkie akcje dookoła. Czy jest jakiś sposób, na zawężenie tego pola do tylko wybranych funkcji? Chciałbym na przykład stworzyć program, który jednym przyciskiem zapala dwie lampki, ale drugą z nich ze wskazanym opóźnieniem. Jak można to zrobić, istnieje jakaś struktura?
-
- Posty: 82
- Rejestracja: 26 maja 2009 07:18
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Sucha Beskidzka
- Kontakt:
Re: Opóźnianie sygnałów 0-1
Przejdz do front panel, prawy klawiasz na event i wybierz z menu "Edit events handles by this case" i nastepnie w oknie odznacz opcje na dole "Lock Front panel........"
Jesli chciałbys robic coś w tym czasie to chyba musisz użyc w tym przypadku petli równoległej w której bedziesz coś tam robił ( dodawał czy coś innego).
Jesli chciałbys robic coś w tym czasie to chyba musisz użyc w tym przypadku petli równoległej w której bedziesz coś tam robił ( dodawał czy coś innego).
Re: Opóźnianie sygnałów 0-1
Nie rozumiem, co miało dać odznaczenie tej opcji? Jakoś nie widzę żadnych różnic w działaniu...
Chciałbym tez pójść o krok dalej - by sama chwilowa zmiana z 0 na 1 była czynnikiem uruchamiającym lampki (bez stałego sygnału 1). Próbowałem sam podejść do problemu i stworzyłem to co w załączniku. Mam jednak kłopot - wygląda na to, że choć lampka włącza się po sekundzie, bardziej ma na to wpływ fakt zmiany położenia buttona wykrywany przez event structure, aniżeli układ sygnałów. Zdecydowanie wolałbym osiągnąć efekt, gdy button jest zwalniany po wciśnięciu natychmiastowo, a druga lampka zapala się niezależnie od jego stanu, po prostu po ustalonym czasie od wciśnięcia... Czy można to jakoś osiągnąć w prosty sposób?
I też drugie pytanie, czy i jak można sprawić, by w Case Structure w warunku true i false pojawił się ten sam wskaźnik? Czy trzeba wyprowadzić wartość na zewnątrz? (powoduje to niewskazane zachowania)
Chciałbym tez pójść o krok dalej - by sama chwilowa zmiana z 0 na 1 była czynnikiem uruchamiającym lampki (bez stałego sygnału 1). Próbowałem sam podejść do problemu i stworzyłem to co w załączniku. Mam jednak kłopot - wygląda na to, że choć lampka włącza się po sekundzie, bardziej ma na to wpływ fakt zmiany położenia buttona wykrywany przez event structure, aniżeli układ sygnałów. Zdecydowanie wolałbym osiągnąć efekt, gdy button jest zwalniany po wciśnięciu natychmiastowo, a druga lampka zapala się niezależnie od jego stanu, po prostu po ustalonym czasie od wciśnięcia... Czy można to jakoś osiągnąć w prosty sposób?
I też drugie pytanie, czy i jak można sprawić, by w Case Structure w warunku true i false pojawił się ten sam wskaźnik? Czy trzeba wyprowadzić wartość na zewnątrz? (powoduje to niewskazane zachowania)
- Załączniki
-
- Event Case X.vi
- (10.45 KiB) Pobrany 335 razy
-
- Posty: 82
- Rejestracja: 26 maja 2009 07:18
- Wersja środowiska: LabVIEW 2012
- Lokalizacja: Sucha Beskidzka
- Kontakt:
Re: Opóźnianie sygnałów 0-1
Hej,
Nie wiem co chcesz osiągnąć. Ale odznaczenie opcji spowodowało ze panel nie jest zablokowany po wciśnięciu przycisku.
Czyli np jeśli umieścisz coś innego na tym panelu np numeric controll albo drugi przycisk to możesz go wciskac dowoli gdy wykonywane jest zdarzenie event.
Ale oczywiście nic nie może sie wykonywać w czasie gdy wykonuje sie event.
Moze chciałbyś wyłączyć przycisk podczas trwania eventu. To proponuje petle while loop gdzie co iteracje bedzie sprawdzany stan przycisku i resetowany timer.
Napisz co chcesz zrobić to pomyśle jak to można rozwiązać.
Nie wiem co chcesz osiągnąć. Ale odznaczenie opcji spowodowało ze panel nie jest zablokowany po wciśnięciu przycisku.
Czyli np jeśli umieścisz coś innego na tym panelu np numeric controll albo drugi przycisk to możesz go wciskac dowoli gdy wykonywane jest zdarzenie event.
Ale oczywiście nic nie może sie wykonywać w czasie gdy wykonuje sie event.
Moze chciałbyś wyłączyć przycisk podczas trwania eventu. To proponuje petle while loop gdzie co iteracje bedzie sprawdzany stan przycisku i resetowany timer.
Napisz co chcesz zrobić to pomyśle jak to można rozwiązać.
Re: Opóźnianie sygnałów 0-1
Dobra, pisząc już wprost - tworzę program, który ma wysyłać kolejne sygnały w zależności od wciskanych przycisków. Coś na wzór tego w załączniku - na początku ustala się, czy urządzenia typu frezarka, grawerka mają działać w cyklu, potem start i wykonują się kolejne akcje, gdy będą wciskane odpowiednie przyciski. Problem w tym, że chcę zrezygnować z tych przycisków na rzecz odczekiwania pewnego czasu. Przykładowo - wciskam start, świeci się podnoszenie pojemnika, a dajmy na to po 2 sekundach od startu, program odbiera sytuację tak, jakby zostało wciśnięte "pojemnik podniesiono". Czyli gaśnie podnoszenie. Potem, po następnych załóżmy 3 sekundach, "dotarło do frezarki", więc wyłącza się taśmociąg, a w zależności od warunku frezarka uruchamia się bądź detal jest z niej spychany... itd. Czyli żeby te sygnały pojawiały się po po zadanym czasie względem poprzedniego polecenia, najlepiej za pomocą osobnych wewnętrznych VI. Korzystanie z wait i podanych rozwiazań sprawia, że cały program wpada w pętlę i nie można już nic zadziałać... Jakie propozycje, rozwiązania, jak można rozwiązać moje wyzwanie?
- Załączniki
-
- SR-2.vi
- Przełącznik Set-Reset
- (8.46 KiB) Pobrany 364 razy
-
- Makieta.vi
- Główny program
- (16.28 KiB) Pobrany 346 razy
Re: Opóźnianie sygnałów 0-1
Myślę, że tego, czego potrzebuję, jest rozwinięcie funkcji Time Event, którą przysłałeś. W taki sposób, by zamiast przekazania sygnału "trwałego", na wyjściu został wysłany jedynie krótki "pik". Czy można jakoś zdefiniować program, by wysyłał sygnał równoznaczny z wciśnięciem i odciśnięciem przycisku? Próbowałem zrobić to za pomocą struktur Event, połączonych z If a nawet tymi przełącznikami SR które miałem w SubVI, ale nijak nie udało się osiągnać zamierzonego efektu... 

Re: Opóźnianie sygnałów 0-1
A może maszyna stanów? 

Opóźnianie sygnałów 0-1
Hmm... z tego co czytam o tym, wygląda na to, że będę musiał całą strukturę programu napisać w zasadzie od nowa... Nie ma może prostszego sposobu na zmultiplikowane SubVI działające w sposób, jaki opisałem...? 

Re: Opóźnianie sygnałów 0-1
Rozumiem, że masz zrealizować pewien cyklogram. Coś na wzór tego (tylko przykład z neta):Ciamek pisze:Dobra, pisząc już wprost - tworzę program, który ma wysyłać kolejne sygnały w zależności od wciskanych przycisków..
?
Jeśli tak, to użyj timera (którego w lv niestety nie ma, ale na forum znajdziesz).
Re: Opóźnianie sygnałów 0-1
A nieprawdaZyga pisze:Jeśli tak, to użyj timera (którego w lv niestety nie ma, ale na forum znajdziesz).

Re: Opóźnianie sygnałów 0-1
Faktycznie. A ja sie zastanawiałem nieraz, jak to jest, że w LV brak timera : ]TMa pisze:A nieprawdaZyga pisze:Jeśli tak, to użyj timera (którego w lv niestety nie ma, ale na forum znajdziesz).w palecie Timing można znaleźć Elapsed Time Express VI