Problem z odczytem pomiarów
Problem z odczytem pomiarów
Witam,
Mam problem z odczytem pomiarów, który polega na tym, że podczas pomiaru odczytuje około 4000 próbek, z czego większość się powtarza i w rezultacie otrzymuje około 15-20 różnych próbek. Przykładowe wykresy przedstawiam w załączniku: Moje założenie było takie, aby aplikacja działała w następujący sposób:
1. W SubVI (wywoływanym ciągle w pętli while programu głównego) odczytuję wszystkie wejścia karty pomiarowej oraz wystawiam wyjścia. Odczytane wartości zapisuję do zmiennych globalnych, które następnie wykorzystuje w programie głównym. 2. Odczytane próbki poddawane są prostym operacjom matematycznym w celu przeliczenia wartości napięcia na odpowiednie wielkości fizyczne. Nie są to żadne skomplikowane obliczenia, jedynie dodawanie, odejmowanie i dzielenie. 3. Przeliczone w ten sposób próbki w momencie uruchomienia pomiaru zapisywane są do tablic. Dodam jeszcze, że w ustawieniach DAQ Assistanta używam opcji 1 Sample (On demand). Wydawało mi się, że w takim przypadku przy każdym wykonaniu pętli odczytywana będzie nowa wartość próbki, jednak tak się nie dzieje. Nie wiem czy problem leży po stronie SubVI, w którym odczytuję próbki lub zmiennych globalnych, do których są zapisywane. Nie używam również żadnych timerów, które mogłyby powodować opóźnienia.
Może ma ktoś jakiś pomysł jak temu zaradzić? Za pomoc z góry dziękuję.
Pozdrawiam.
Mam problem z odczytem pomiarów, który polega na tym, że podczas pomiaru odczytuje około 4000 próbek, z czego większość się powtarza i w rezultacie otrzymuje około 15-20 różnych próbek. Przykładowe wykresy przedstawiam w załączniku: Moje założenie było takie, aby aplikacja działała w następujący sposób:
1. W SubVI (wywoływanym ciągle w pętli while programu głównego) odczytuję wszystkie wejścia karty pomiarowej oraz wystawiam wyjścia. Odczytane wartości zapisuję do zmiennych globalnych, które następnie wykorzystuje w programie głównym. 2. Odczytane próbki poddawane są prostym operacjom matematycznym w celu przeliczenia wartości napięcia na odpowiednie wielkości fizyczne. Nie są to żadne skomplikowane obliczenia, jedynie dodawanie, odejmowanie i dzielenie. 3. Przeliczone w ten sposób próbki w momencie uruchomienia pomiaru zapisywane są do tablic. Dodam jeszcze, że w ustawieniach DAQ Assistanta używam opcji 1 Sample (On demand). Wydawało mi się, że w takim przypadku przy każdym wykonaniu pętli odczytywana będzie nowa wartość próbki, jednak tak się nie dzieje. Nie wiem czy problem leży po stronie SubVI, w którym odczytuję próbki lub zmiennych globalnych, do których są zapisywane. Nie używam również żadnych timerów, które mogłyby powodować opóźnienia.
Może ma ktoś jakiś pomysł jak temu zaradzić? Za pomoc z góry dziękuję.
Pozdrawiam.
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Problem z odczytem pomiarów
Cześć!
Najpierw napiszę jak co wydaje mi się, że rozumiem z działania Twojej aplikacji. Są dwie pętle, gdzie pierwsza uzyskuje próbki z DAQ i po przetworzeniu zapisuje je do wskaźników, natomiast druga pętla odczytuje wartości z tych wskaźników przez zmienne lokalne i zapisuje do tablic. Nie widzę sterowania czasem wykonywania się pętli, wobec czego jest bardzo prawdopodobne, że ta sama wartość jest wielokrotnie odczytywana ze zmiennych lokalnych, stąd powtórzenia. Wobec tego mam następujące porady:
1. Zawsze jest lepiej, jeśli akwizycja jest sterowana sprzętowo, więc zamiast On Demand lepiej jest ustawić Continuous i jakąś niską częstotliwość próbkowania. Jeśli jednak nie chcesz tego robić, to polecałbym przynajmniej sterować czasem wykonywania się pętli akwizycji przy pomocy Wait Until Next Multiple ms http://www.ni.com/white-paper/4120/en/
2. To co robisz można byłoby wykonywać w jednej pętli, wtedy miałbyś pewność, że każda poprana próbka będzi wykorzystana jeden raz. Niemniej architektura dwóch pętli (producent i konsument) jest jak najbardziej poprawna i zalecana, ale znacznie lepiej skomunikować je za pomocą kolejki (Queue) zamiast zmiennych lokalnych http://www.ni.com/white-paper/3023/en/
Najpierw napiszę jak co wydaje mi się, że rozumiem z działania Twojej aplikacji. Są dwie pętle, gdzie pierwsza uzyskuje próbki z DAQ i po przetworzeniu zapisuje je do wskaźników, natomiast druga pętla odczytuje wartości z tych wskaźników przez zmienne lokalne i zapisuje do tablic. Nie widzę sterowania czasem wykonywania się pętli, wobec czego jest bardzo prawdopodobne, że ta sama wartość jest wielokrotnie odczytywana ze zmiennych lokalnych, stąd powtórzenia. Wobec tego mam następujące porady:
1. Zawsze jest lepiej, jeśli akwizycja jest sterowana sprzętowo, więc zamiast On Demand lepiej jest ustawić Continuous i jakąś niską częstotliwość próbkowania. Jeśli jednak nie chcesz tego robić, to polecałbym przynajmniej sterować czasem wykonywania się pętli akwizycji przy pomocy Wait Until Next Multiple ms http://www.ni.com/white-paper/4120/en/
2. To co robisz można byłoby wykonywać w jednej pętli, wtedy miałbyś pewność, że każda poprana próbka będzi wykorzystana jeden raz. Niemniej architektura dwóch pętli (producent i konsument) jest jak najbardziej poprawna i zalecana, ale znacznie lepiej skomunikować je za pomocą kolejki (Queue) zamiast zmiennych lokalnych http://www.ni.com/white-paper/3023/en/
Pozdrawiam,
Sebastian
Sebastian
Re: Problem z odczytem pomiarów
Zgadzam się z tym co mówisz, jednak problemem nie jest to, że próbki się powtarzają. Zdaję sobie sprawę, dlaczego tak się dzieje. Zastanawia mnie tylko to, że w czasie pomiaru, który trwa około 2-3s jestem w stanie zebrać tylko 15-20 różnych próbek.
W poprzednim poście przedstawiłem tylko fragment kodu, który dotyczy czytania i przetwarzania próbek. W pozostałej części programu oczywiście wykorzystuję kolejki, jednak w przypadku tych pętli nie zdawały one egzaminu.
W poprzednim poście przedstawiłem tylko fragment kodu, który dotyczy czytania i przetwarzania próbek. W pozostałej części programu oczywiście wykorzystuję kolejki, jednak w przypadku tych pętli nie zdawały one egzaminu.
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Problem z odczytem pomiarów
Dobrze rozumiem, że aplikacja zbiera jedynie 15-20 dyskretnych wartości, które się potem powtarzają? Czy jest jakiś schemat, według którego wartości się powtarzają? Co jest źródłem sygnału? Czy możesz załączyć kod? - Mógłbym przetestować u siebie na symulowanym sygnale.
Pozdrawiam,
Sebastian
Sebastian
Re: Problem z odczytem pomiarów
W pierwszym poście przedstawiłem przykładowe przebiegi, gdzie można zauważyć, że punkty pomiarowe występują bardzo rzadko, przez co wykresy są bardzo "kanciaste". Chciałbym, aby występowały one częściej, żeby wygładzić wykresy oraz co ważniejsze, aby pomiar był dokładniejszy.
Źródłem sygnałów są czujniki siły i drogi.
W załączniku przesyłam program.
Źródłem sygnałów są czujniki siły i drogi.
W załączniku przesyłam program.
- Załączniki
-
- ST203.rar
- (1008 KiB) Pobrany 604 razy
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Problem z odczytem pomiarów
Zapoznałem się z kodem i próbowałem prześledzić jak powstaje wykres z danych pomiarowych, ale szczerze mówiąc to poddałem się na czwartej lub piątej warstwie zmiennych (globalnych lub lokalnych). LabVIEW bardzo nie lubi zmiennych i będę wszystkimi siłami odradzał ich stosowanie, zwłaszcza pomiędzy pętlami w aplikacjach wielowątkowych. Bardzo chętnie pomogę w stworzeniu właściwej architektury dla Twojej aplikacji, ale to jest jakby osobny temat.
Jeśli miałbym coś teraz poradzić, to prześledzenie danych pomiarowych na każdym etapie ich przesyłania, zaczynając od samego DAQ Assistant. Mógłbyś to zrobić tak jak to wygląda na obrazku w załączniku, dodając podobny kod w różnych miejscach i na koniec porównać dane z nich pochodzących, żeby wywnioskować gdzie następuje coś nieprzewidzianego.
Natomiast wykresy są "kanciaste", ponieważ częstotliwość próbkowania jest mała w stosunku do dynamiki sygnału. Jako że stosujesz odczyt On Demand częstotliwość próbkowania jest mała, bo podyktowana pętlą, w której następuje odczyt. Według moich pomiarów to ok. 43 ms, czyli ok. 23 próbki na sekundę, nie wpominając już, że pętla nie gwarantuje równomiernego próbkowania. Rozwiązaniem będzie próbkowanie sprzętowe, czyli Continuous Samples, konfiguracja częstotliwości próbkowania i odczyt wielu próbek jednocześnie. Będzie to również jednak wymaga zmiany architektury.
Jeśli miałbym coś teraz poradzić, to prześledzenie danych pomiarowych na każdym etapie ich przesyłania, zaczynając od samego DAQ Assistant. Mógłbyś to zrobić tak jak to wygląda na obrazku w załączniku, dodając podobny kod w różnych miejscach i na koniec porównać dane z nich pochodzących, żeby wywnioskować gdzie następuje coś nieprzewidzianego.
Natomiast wykresy są "kanciaste", ponieważ częstotliwość próbkowania jest mała w stosunku do dynamiki sygnału. Jako że stosujesz odczyt On Demand częstotliwość próbkowania jest mała, bo podyktowana pętlą, w której następuje odczyt. Według moich pomiarów to ok. 43 ms, czyli ok. 23 próbki na sekundę, nie wpominając już, że pętla nie gwarantuje równomiernego próbkowania. Rozwiązaniem będzie próbkowanie sprzętowe, czyli Continuous Samples, konfiguracja częstotliwości próbkowania i odczyt wielu próbek jednocześnie. Będzie to również jednak wymaga zmiany architektury.
Pozdrawiam,
Sebastian
Sebastian
Re: Problem z odczytem pomiarów
Jakiś czas temu próbowałem wykonywać pomiary wykorzystując Coninuous Samples, jednak napotykałem pewne problemy. Dzisiaj jeszcze raz spróbowałem i po ustawieniu odpowiedniej częstotliwości próbkowania udało się te problemy ominąć. W tej chwili wykresy wyglądają o wiele lepiej:
Niestety w dalszym ciągu mam problem, ponieważ przygotowuję podobną aplikację do innej maszyny, gdzie wartości drogi przesyłane są przez ethernet z serwo napędu. W tym przypadku muszę w jakiś sposób zsynchronizować odczyt pomiarów z czujników siły i drogi wysyłanej po ethernecie. Dotychczasowe rozwiązanie (On Demand) się sprawdzało, jednak tak jak w poprzednim przypadku częstotliwość próbkowania była niewystarczająca. Niestety serwo napęd nie posiada wyjścia analogowego, z którego mógłbym odczytywać wartość drogi, dlatego pozostaje tylko ethernet. Jakieś pomysły? W jaki sposób zsynchronizować oba pomiary?
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Problem z odczytem pomiarów
Jeśli chodzi o synchronizację przez Ethernet, to nie wróżę sukcesów, ponieważ Ethernet jest z natury niedeterministyczny - to szyna danych, która ma porównywalnie dużą latencję (patrz http://www.ni.com/white-paper/3509/en/)
Więc jeśli akceptujesz synchronizację mniej więcej co do sekundy, to OK. Może być lepiej, ale nie ma gwarancji, że to będzie powtarzalne.
Wiem, że zainwestowałeś czas i wysiłek żeby stworzyć tę aplikację, widzę też, że piszesz kod z dużą dbałością o szczegóły, ale bardzo mocno plecałbym stworzenie skalowalnej i modułowej architektury od podstaw. Jeśli aplikacja ma trafić na kolejną maszynę, to może warto skontaktować się z National Instrumentsi poprosić o pomoc? Ewentualnie daj mi znać na priv, to być może będę mógł pomóc w tej kwestii.
Więc jeśli akceptujesz synchronizację mniej więcej co do sekundy, to OK. Może być lepiej, ale nie ma gwarancji, że to będzie powtarzalne.
Wiem, że zainwestowałeś czas i wysiłek żeby stworzyć tę aplikację, widzę też, że piszesz kod z dużą dbałością o szczegóły, ale bardzo mocno plecałbym stworzenie skalowalnej i modułowej architektury od podstaw. Jeśli aplikacja ma trafić na kolejną maszynę, to może warto skontaktować się z National Instrumentsi poprosić o pomoc? Ewentualnie daj mi znać na priv, to być może będę mógł pomóc w tej kwestii.
Pozdrawiam,
Sebastian
Sebastian
Re: Problem z odczytem pomiarów
Pracuję na tym, co mam. Mi od samego początku nie podobał się pomysł z ethernetem, ale co zrobić...
Jeśli zmiana architektury miałaby pomóc, to jestem skłonny to zrobić. Cały czas się uczę i jestem otwarty na nowe doświadczenia. Możesz podrzucić jakiś przykład? Jak miałaby wyglądać skalowalna i modułowa architektura?
Jeśli zmiana architektury miałaby pomóc, to jestem skłonny to zrobić. Cały czas się uczę i jestem otwarty na nowe doświadczenia. Możesz podrzucić jakiś przykład? Jak miałaby wyglądać skalowalna i modułowa architektura?
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Problem z odczytem pomiarów
Generalnie aplikacja powinna być podzielona na zadania, które będą realizowane przez osobne moduły. Każdy ma swój styl programowania, niektórzy lubią korzystać z klas, inni nie. Wiem też, że są tu forumowicze, którzy zawodowo pracują nad dużymi i skomplikowanymi projektami w LabVIEW.
Niemniej załączam przykład tego, jak wyglądają niektóre moje aplikacje. To prosty interfejs użytkownika i jeden moduł do akwizycji danych DAQ. DAQ to maszyna stanów, która posiada swoją własną kolejkę na polecenia, które otrzymuje od UI. UI zaś otrzymuje informacje zwrotne od DAQ przez User Event. Całość startuje od tzw. Launcher.
Mógłbym długo opisywać jak to działa, ale powinno być raczej czytelne. Zwróć uwagę, że dwa zadania: UI i DAQ komunikują się tylko i wyłącznie przez jedną kolejkę (UI do DAQ) i User Event (DAQ do UI). To taki Actor Framework dla ubogich.
Niemniej załączam przykład tego, jak wyglądają niektóre moje aplikacje. To prosty interfejs użytkownika i jeden moduł do akwizycji danych DAQ. DAQ to maszyna stanów, która posiada swoją własną kolejkę na polecenia, które otrzymuje od UI. UI zaś otrzymuje informacje zwrotne od DAQ przez User Event. Całość startuje od tzw. Launcher.
Mógłbym długo opisywać jak to działa, ale powinno być raczej czytelne. Zwróć uwagę, że dwa zadania: UI i DAQ komunikują się tylko i wyłącznie przez jedną kolejkę (UI do DAQ) i User Event (DAQ do UI). To taki Actor Framework dla ubogich.
Ostatnio zmieniony 18 paź 2016 08:48 przez skoziate, łącznie zmieniany 1 raz.
Pozdrawiam,
Sebastian
Sebastian
Problem z odczytem pomiarów
Skoziate, mógłbym Cię prosić o udostępnienie tej paczki Architektura w wersji 2011?
Przepraszam, że się tak włączam w temat ale zawsze chciałem zobaczyć taki porządny kawałek kodu, nie tylko z szablonów NI.
Przepraszam, że się tak włączam w temat ale zawsze chciałem zobaczyć taki porządny kawałek kodu, nie tylko z szablonów NI.
Re: Problem z odczytem pomiarów
Mam jakiś problem z otworzeniem tej aplikacji. Po rozpakowaniu próbuję uruchomić launcher, przez chwilę coś się wczytuje, ale ostatecznie program się nie otwiera. Nie wiem o co chodzi. Korzystam z LabView 2015.
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Re: Problem z odczytem pomiarów
Mullek pisze:Skoziate, mógłbym Cię prosić o udostępnienie tej paczki Architektura w wersji 2011?
Przepraszam, że się tak włączam w temat ale zawsze chciałem zobaczyć taki porządny kawałek kodu, nie tylko z szablonów NI.
- Załączniki
-
- Architektura 2011.zip
- (170.97 KiB) Pobrany 550 razy
Pozdrawiam,
Sebastian
Sebastian
- skoziate
- Administrator
- Posty: 245
- Rejestracja: 06 mar 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Warszawa
- Kontakt:
Re: Problem z odczytem pomiarów
Po rozpakowaniu i otwarciu projektu, należy otworzyć Launcher.vi i go uruchomić. Po jednej sekundzie od uruchomienia front panel Launcher.vi powinien zniknąć, a pojawić się interfejs o nazwie Signal Generator (to front panel UI Main.vi - ma ustawioną opcję Show front panel when called).Paw Saw pisze:Mam jakiś problem z otworzeniem tej aplikacji. Po rozpakowaniu próbuję uruchomić launcher, przez chwilę coś się wczytuje, ale ostatecznie program się nie otwiera. Nie wiem o co chodzi. Korzystam z LabView 2015.
Zobacz czy ten nowy front panel nie pojawił się gdzieś w tle, ewentualnie możesz uruchomić Launcher.vi w Highlight Execution i zobaczyć co tam się dzieje. Wtedy proszę daj znać. W zasadzie tam nie ma co nie zadziałać, ale oczywiście mogłem czegoś nie wziąć pod uwagę.
Pozdrawiam,
Sebastian
Sebastian
Problem z odczytem pomiarów
Dzięki! Będę musiał nad tym posiedzieć bo nie mój poziom a chciałbym żeby moje programy miały ręce i nogi.