odrzucanie wybranych wyników liczbowych

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
bikekowal
Posty: 21
Rejestracja: 05 lis 2010 10:07
Wersja środowiska: LabVIEW 2011

odrzucanie wybranych wyników liczbowych

Post autor: bikekowal »

Cześć,

Szukam rozwiązania następującego problemu. Mam liczbę w postaci DBL, która zmienia się co sekundę. Wiem, że ta liczba powinna przyjmować wartości z zakresu od 1 do 40. Czasem jednak przyjmuje wartości na poziomie 650. Taki wynik chciałbym odrzucić, czyli jeśli przychodzi do mnie liczba i jest większa niż 40 i mniejsza niż 1 to wtedy wyświetlam albo 0 jeśli nie miałem nic wcześniej albo wyświetlam poprzednią wartość z określonego zakresu. Macie pomysł jak zrobić to sprzężenie zwrotne do case'a, żeby wyświetlać zawsze poprawny wynik?
de80
Posty: 90
Rejestracja: 02 sty 2011 22:46
Wersja środowiska: LabVIEW 2014
Lokalizacja: KRK

Re: odrzucanie wybranych wyników liczbowych

Post autor: de80 »

Witam,
czy takie coś Ciebie interesuje?

Zauważyłem pomyłkę, trzeba zmienić warunek na mniejszy niż 1 a nie mniejszy niż 0.

Pozdrawiam
Załączniki
vi.png
vi.png (13.5 KiB) Przejrzano 9737 razy
Obrazek
bikekowal
Posty: 21
Rejestracja: 05 lis 2010 10:07
Wersja środowiska: LabVIEW 2011

Re: odrzucanie wybranych wyników liczbowych

Post autor: bikekowal »

Tak, mniej więcej o to chodzi. Pytanie tylko co podłączyć gdzie. Wygląda na to, że do obu wejść bloku Select musiałbym podłączyć sygnał który chcę zbadać, ale w jednym przypadku musiałaby to być wartość poprzednia (np. odczytana z pamięci). Biorąc pod uwagę, że do wejścia Numeric też muszę podpiąć ten sygnał mam trzy miejsca do którego idzie ten sam sygnał, tylko z dwóch różnych chwil czasowych. I to jest najtrudniejsze.
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Re: odrzucanie wybranych wyników liczbowych

Post autor: MicMac89 »

Zastosowanie iloczynu logicznego spowoduje, że nigdy wyrażenie z przykładu od de80 nie będzie prawdziwe. Załączam program, którego działanie jest następujące:
0. Jeśli liczba należy do zakresu (1,40) i przed nią każda z liczb do niego należała to przepuszczam tę liczbę i ustawiam flagę.
1. Jeśli liczba kolejny raz należy do zakresu bez względu na przeszłość to przepuszczam ją
2. Jeśli liczba nie należy do zakresu i wcześniej nie wprowadzono prawidłowej liczby to wyświetlam 0
3. Jeśli liczba nie zależy do zakresu to wyświetlam poprzednią zapamiętaną liczbę należącą do zakresu.

Czy o coś takiego chodziło? W razie pytań pisz śmiało :)
Załączniki
zakres_liczby.vi
(10.24 KiB) Pobrany 376 razy
Certified LabVIEW Associate Developer
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: odrzucanie wybranych wyników liczbowych

Post autor: PiDi »

MicMac, co robi ta case structure u Ciebie, bo kompletnie nie kapuję, czemu to tak skomplikowałeś? :-?
Przede wszystkim warto skorzystać z gotowych bloczków zamiast konstruować całą logikę od zera - proponuję bloczek In Range And Coerce (i poczytać sobie o jego szczegółach).
InRangeAndCoerce.png
InRangeAndCoerce.png (15.4 KiB) Przejrzano 9708 razy
Idziemy dalej:
bikekowal pisze:Tak, mniej więcej o to chodzi. Pytanie tylko co podłączyć gdzie. Wygląda na to, że do obu wejść bloku Select musiałbym podłączyć sygnał który chcę zbadać, ale w jednym przypadku musiałaby to być wartość poprzednia (np. odczytana z pamięci). Biorąc pod uwagę, że do wejścia Numeric też muszę podpiąć ten sygnał mam trzy miejsca do którego idzie ten sam sygnał, tylko z dwóch różnych chwil czasowych. I to jest najtrudniejsze.
Czy wiesz jak działa shift register?
Co masz na myśli mówiąc: "muszę podpiąć sygnał w trzech miejscach"?
ObrazekObrazekObrazekObrazek
bikekowal
Posty: 21
Rejestracja: 05 lis 2010 10:07
Wersja środowiska: LabVIEW 2011

Re: odrzucanie wybranych wyników liczbowych

Post autor: bikekowal »

Czy wiesz jak działa shift register?
Co masz na myśli mówiąc: "muszę podpiąć sygnał w trzech miejscach"?
Tak, wiem. Zakręciłem się w tamtej odpowiedzi. Sorry.
MicMac89 pisze:Czy o coś takiego chodziło? W razie pytań pisz śmiało
Tak o to własnie mi chodziło. Niestety ja niedoprecyzowałem z jakiego typu źródłem mam do czynienia. Rzuciłem okiem na szybko i myślałem, że to po prostu double. To jednak jest 1D array of double, teraz nie zgadzają mi się typy danych. Zaraz zrobię konwersję, żeby wszystko było poprawnie i dam znać czy wszystko działa jak należy.

EDIT:

Zrobiłem konwersję z array'a na double i podłączyłem ten fragment pod resztę programu. Najwyraźniej albo ja coś pomieszałem, albo jest gdzieś błąd (chociaż wydaje mi się to mało prawdopodobne), ale cały program po podłączeniu programu od MicMac89 odczytuje wartość (program czyta z portu szeregowego) tylko raz i to wszystko, efekt zawieszenia programu. Po usunięciu fragmentu programu, wszystko wraca do normy. Co może być przyczyną?
PiDi pisze:MicMac, co robi ta case structure u Ciebie, bo kompletnie nie kapuję, czemu to tak skomplikowałeś? :-?
Przede wszystkim warto skorzystać z gotowych bloczków zamiast konstruować całą logikę od zera - proponuję bloczek In Range And Coerce (i poczytać sobie o jego szczegółach).
InRangeAndCoerce.png
Idziemy dalej:
bikekowal pisze:Tak, mniej więcej o to chodzi. Pytanie tylko co podłączyć gdzie. Wygląda na to, że do obu wejść bloku Select musiałbym podłączyć sygnał który chcę zbadać, ale w jednym przypadku musiałaby to być wartość poprzednia (np. odczytana z pamięci). Biorąc pod uwagę, że do wejścia Numeric też muszę podpiąć ten sygnał mam trzy miejsca do którego idzie ten sam sygnał, tylko z dwóch różnych chwil czasowych. I to jest najtrudniejsze.
Czy wiesz jak działa shift register?
Co masz na myśli mówiąc: "muszę podpiąć sygnał w trzech miejscach"?

Lubię proste rozwiązania! Wypróbuję to i dam znać czy efekt będzie podobny jak w przypadku rozwiązania poprzedniego.

EDIT 2:
Sprawdziłem i efekt jest podobny jak w przypadku poprzednim. Oba składowe programy działają poprawnie, niestety po połączeniu nie chcą ze sobą grać - znów - odczyt jest jednorazowy i tyle.
Ostatnio zmieniony 05 cze 2012 19:23 przez bikekowal, łącznie zmieniany 3 razy.
bikekowal
Posty: 21
Rejestracja: 05 lis 2010 10:07
Wersja środowiska: LabVIEW 2011

Re: odrzucanie wybranych wyników liczbowych

Post autor: bikekowal »

Chciałbym odświeżyć temat pytaniem. Mianowicie chcę umieścić sprawdzanie warunku wewnątrz większego programu, który działa w pętli while. Nie mam tylko pomysłu na warunek, który należałoby dodać do shift registera, żeby nie wykonywał się w nieskończoność a tylko wtedy kiedy na wejście zostanie podana nowa wartość do sprawdzenia. Proste dodanie warunku sprawdzanie liczbę iteracji nie działa, bo program wykona się raz i to wszystko. Macie jakieś pomysły?
Zyga
Posty: 86
Rejestracja: 26 sty 2012 23:36
Wersja środowiska: LabVIEW 2011

Re: odrzucanie wybranych wyników liczbowych

Post autor: Zyga »

bikekowal pisze:Chciałbym odświeżyć temat pytaniem. Mianowicie chcę umieścić sprawdzanie warunku wewnątrz większego programu, który działa w pętli while. Nie mam tylko pomysłu na warunek, który należałoby dodać do shift registera, żeby nie wykonywał się w nieskończoność a tylko wtedy kiedy na wejście zostanie podana nowa wartość do sprawdzenia. Proste dodanie warunku sprawdzanie liczbę iteracji nie działa, bo program wykona się raz i to wszystko. Macie jakieś pomysły?
Nie wiem czy dobrze zrozumiałem, ale załączam VI który za każdym wywołaniem sprawdza czy wartość wejściowa uległa zmianie.
Załączniki
sin_idx.vi
(28.13 KiB) Pobrany 381 razy
ODPOWIEDZ