Problem z odczytem pomiarów

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Problem z odczytem pomiarów

Post autor: Paw Saw » 14 paź 2016 08:27

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:
wykresy.png
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.
odczyt z karty.png
odczyt z karty.png (21.53 KiB) Przejrzano 7363 razy
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.
kalibracja.png
3. Przeliczone w ten sposób próbki w momencie uruchomienia pomiaru zapisywane są do tablic.
zapis do tablicy.png
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.
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Problem z odczytem pomiarów

Post autor: skoziate » 14 paź 2016 10:32

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/
Pozdrawiam,
Sebastian

Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Re: Problem z odczytem pomiarów

Post autor: Paw Saw » 14 paź 2016 10:53

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.
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Problem z odczytem pomiarów

Post autor: skoziate » 14 paź 2016 11:55

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

Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Re: Problem z odczytem pomiarów

Post autor: Paw Saw » 14 paź 2016 13:01

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.
Załączniki
ST203.rar
(1008 KiB) Pobrany 141 razy
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Problem z odczytem pomiarów

Post autor: skoziate » 14 paź 2016 15:38

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.
Pozdrawiam,
Sebastian

Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Re: Problem z odczytem pomiarów

Post autor: Paw Saw » 17 paź 2016 09:02

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:
wykresy_continuous.png
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?
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Problem z odczytem pomiarów

Post autor: skoziate » 17 paź 2016 10:28

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.
Pozdrawiam,
Sebastian

Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Re: Problem z odczytem pomiarów

Post autor: Paw Saw » 17 paź 2016 11:46

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?
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Problem z odczytem pomiarów

Post autor: skoziate » 17 paź 2016 17:44

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.
Ostatnio zmieniony 18 paź 2016 08:48 przez skoziate, łącznie zmieniany 1 raz.
Pozdrawiam,
Sebastian

Mullek
Posty: 6
Rejestracja: 27 lut 2015 09:28
Wersja środowiska: LabVIEW 2014

Problem z odczytem pomiarów

Post autor: Mullek » 18 paź 2016 08:24

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.

Paw Saw
Posty: 37
Rejestracja: 12 maja 2016 16:02
Wersja środowiska: LabVIEW 2017

Re: Problem z odczytem pomiarów

Post autor: Paw Saw » 18 paź 2016 08:29

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.
Obrazek

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Re: Problem z odczytem pomiarów

Post autor: skoziate » 18 paź 2016 08:53

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 138 razy
Pozdrawiam,
Sebastian

Awatar użytkownika
skoziate
Administrator
Posty: 244
Rejestracja: 06 mar 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Warszawa
Been thanked: 1 time
Kontakt:

Re: Problem z odczytem pomiarów

Post autor: skoziate » 18 paź 2016 09:00

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.
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).

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

Mullek
Posty: 6
Rejestracja: 27 lut 2015 09:28
Wersja środowiska: LabVIEW 2014

Problem z odczytem pomiarów

Post autor: Mullek » 18 paź 2016 09:01

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.

ODPOWIEDZ