Akwizycja danych temperatur w Labview

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.
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Witam Wszystkich Serdecznie

Jestem całkowicie nowym użytkownikiem programu Labview. Niestety nie miałem żadnych kursów ani pomocy w poznawaniu tego środowiska. Mam jednak potrzebę stworzenia programu który będzie odczytywał i zapisywał dane temperatur.
Program musi pobierać dane z zewnętrznych czujników temperatur, następnie odczytywać je, wyświetlając na wykresach (jest 5 kanałów wiec i 5 wykresów) oraz zapisywać je do pliku, który można otworzyć przy pomocy Worda. Ze względu na to iż dane będą pobierane przez dłuższy okres czasu chciałbym aby program pobierał dane z określoną częstotliwością np. 100 Hz a następnie uśredniał te dane. Czyli np. jak podałem wcześniej, częstotliwość próbkowania wynosiłaby 100 Hz, a zatem program pobierałby 100 próbek na sek, następnie uśredniał te pomiary do 1 wartości. Czyli jedna wartość na 1 sekundę.
Mierzona będzie wymiana temperatur pomiędzy dwoma stanami skupienia, więc pomiary będą odbywały się w dłuższym okresie czasu, np. 1h. Potrzebuję aby program pobierał mi dane kiedy temperatury dwóch mediów się ustabilizują, więc chciałbym aby program zapisywał mi dane wtedy kiedy ja tego chcę, a nie przez cały czas.
Również, moment w którym dane będą pobierane ma być sugerowany przez ustalaną lub obliczoną przez program odchyłkę standardową.
Do tej pory udało mi się zrobić program który odczytuje dane (zwykle szumy ponieważ urządzenie National Instruments nie jest do niczego podłączone) i wyświetla je na 5 wykresach. Niestety wyświetla je co jakiś czas nie ciągle. Następnie przysyła te dane do funkcji "Sample Compression", która uśrednia 10 ostatnich próbek i przesyła je do "write to measurement file" która zapisuje dane w pliku.
Tylko te dane są zapisywane w dziwny sposób. Chciałbym aby zapisywały się na razie co sekundę a one zapisują się jakby niezależnie od czasu. Np pisze w pliku Lvm. ze zapis co 1 sek. ale pomiary trwają dłużej w rzeczywistości. np 60 sek. W dodatku, kiedy chcę pobierać dane "ciągle", to po 6 pomiarach (ponieważ używam pętli) występuje błąd ponieważ nie ma już dostępnych próbek (ERROR 200279). A ja nie mogę zdefiniować liczby próbek jako konkretną liczbę ponieważ będą one pobierane w sposób ciągły i nie wiadomo ile ich będziemy chcieli uzyskać.

Wiem że to wszystko może brzmieć skomplikowanie, dlatego proszę pytać :)
Pragnę przypomnieć że jestem naprawdę zielony w tym programie, dlatego wszelkiego typu uwagi i wytykanie moich głupot będą mile widziane :)

W załączeniu wysyłam screeny z mojego programu, w celu lepszej wizualizacji sprawy.

http://vlep.pl/kxh5ft.jpg
http://vlep.pl/sm13p6.jpg
Załączniki
Block Diagram.jpg
Ostatnio zmieniony 22 lis 2014 14:43 przez lockdown9, łącznie zmieniany 1 raz.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Ok, to może powolutku, bo dużo na raz.
Kilka pytań: Jaki masz wybrany sample mode? Powinno być continues samples.
Jeśli masz pomiar z kilku kanałów, to wyświetlenie poszczegółnych kanałów powinieneś robić przy pomocy index array, a nie decimate 1d array.
Do pliku zapisuje Ci jedynie ostatni pomiar, ponieważ na wyjściu pętli while masz tunnel mode: last value. Wrzuć express vi Write to measurement file do pętli while.
To tak na początek. Ogólnie, to bez żadnych kursów będzie Ci trudno zbudować w pełni działający i tak rozbudowany program. Chyba lepiej by było zrobić pomiary jednym programem, a manipulację danymi (uśrednianie itp) zrobić w osobnym (zazwyczaj robi się to w osobnych pętlach w tym samym programie, ale to jest struktura Producer-Consumer, z którą warto się zaznajomić).
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

aaddaas pisze:Ok, to może powolutku, bo dużo na raz.
Kilka pytań: Jaki masz wybrany sample mode? Powinno być continues samples.
Jeśli masz pomiar z kilku kanałów, to wyświetlenie poszczegółnych kanałów powinieneś robić przy pomocy index array, a nie decimate 1d array.
Do pliku zapisuje Ci jedynie ostatni pomiar, ponieważ na wyjściu pętli while masz tunnel mode: last value. Wrzuć express vi Write to measurement file do pętli while.
To tak na początek. Ogólnie, to bez żadnych kursów będzie Ci trudno zbudować w pełni działający i tak rozbudowany program. Chyba lepiej by było zrobić pomiary jednym programem, a manipulację danymi (uśrednianie itp) zrobić w osobnym (zazwyczaj robi się to w osobnych pętlach w tym samym programie, ale to jest struktura Producer-Consumer, z którą warto się zaznajomić).
Dzięki za szybką odpowiedź ;)

Sample Mode na continuous samples ustawiony. Write to measurement file też wrzuciłem do while loopa i tym czasowo usunąłem Sample Compression. Jednak teraz czas w pobranych pomiarach zaczyna się od liczy ujemnej. Wrzucę plik. Jak myślisz warto użyć pętli Timed Loop aby dokonać pomiarów co 1 sekundę ?
Czyli proponowałbyś aby rozbić to na dwie pętle tak ? W jaki sposób to podzielić i jak się za to zabrać ?
Załączniki
Labview.txt
(17.79 KiB) Pobrany 487 razy
Ostatnio zmieniony 22 lis 2014 15:41 przez lockdown9, łącznie zmieniany 1 raz.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Mógłbyś załączyć swój program? Jakie wartości ustawiasz w daqmx?
co do index array: podłączasz kabel z danymi i "rozciągasz" bloczek index array, aż będziesz miał 5 wyjść;)
Spróbuj zrobić pomiary przy pomocy programu znajdującego się w help-> Find examplex... ->Hardware Input and output ->DAQmx-> Analog Input-> Resistance - Continous Input
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Program w załączeniu.
Załączniki
Data Acquisition - Labview.vi
(61.24 KiB) Pobrany 536 razy
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Jakie ustawiasz częstotliwości? a i jakiego sprżętu używasz?
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

W tej chwili podłączone do komputera jest tylko urządzenie National Instruments i nic po za nim, dlatego jeżeli chodzi o częstotliwości to widać tylko szumy. Jest ono podłączone do innego komputera, a ja korzystam z programu Team Viewer aby pracować w Labview. Nazwa urządzenia to : NI USB - 6356, X-SERIES DAQ (8 SIMULTANEOUS AI, 24 DI, 2 A O), 1.25 MS/S/CH SAMPLING, 64 MS MEMORY.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Zasymulowałem sobie tę kartę i dostaję dodatnie wyniki czasowe. Możliwe, że przez to, że karta nie jest do niczego podłączona, to lekko wariuje. Ale w pierwszej kolejności dodaj do swojego programu DAQmx stop task, oraz DAQmx clear task. Połącz kontrolkę number of samples per channel również do bloczka DAQmx Timing i puść program ustawiając jego wartość np na 100, zaś sampling frequency na 1000 i zobacz co wypluje.
http://zapodaj.net/b6d4c2f23d0df.png.html
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Zrobiłem to jak zasugerowałeś, ale dostaje błąd ERROR 200278 po drugiej iteracji pętli:

Possible reason(s):

Attempted to read a sample beyond the final sample acquired. The acquisition has stopped, therefore the sample specified by the combination of position and offset will never be available.

Specify a position and offset which selects a sample up to, but not beyond, the final sample acquired. The final sample acquired can be determined by querying the total samples acquired after an acquisition has stopped.

Attempted to Read Sample: 100
Property: RelativeTo
Corresponding Value: Current Read Position
Property: Offset
Corresponding Value: 0

Task Name: _unnamedTask
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Spróbuj się pobawić częstotliwościami próbkowania, albo ustaw je tak jak miałeś wcześniej.
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Może załącz ten program który przerobiłeś u siebie, zobacze jak on u mnie działa.
Po ustawieniu "number of samples per channel" na 100 a sampling freq. na 10 uzyskałem takie wynik:
Załączniki
Labview.txt
(43.74 KiB) Pobrany 504 razy
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Jak widzisz w pliku, czas już jest liczony od zera, więc jeden problem z głowy.
Dalej analizując plik widać, że co 10 sekund dodawane są nagłówki, czyli pętla iteruje się co 10 sekund (jeśli nie chcesz nagłówków, to w opcjach Write to Measurement File wybierz opcję No headers"). Czyli Freq. = 10 próbek na sekundę, czyli by zapełnić bufor 100 próbek na kanał, potrzeba 10 sekund. Przypuszczam, że warto się pokusić o szybsze obroty, by program szybciej reagował na działania użytkownika.
Moją przeróbkę właściwie Ci wysłałem, ponieważ wysłałem Ci tzw. snippet, czyli wygenerowany przez LabVIEW obraz zaznaczonego fragmentu Block Diagramu. LabVIEW ma taką fajną opcję, że wystarczy przeciągnąć na BD ten przesłany plik *.png i będziesz miał tam ten kod;)

Teraz kwestia przetwarzania tych danych. Jak już wspomniałem, najlepiej wykorzystać strukturę Producent-Consumer, która wykorzystuje kolejki. Generalnie działa to w ten sposób, że druga pętla, czyli consumer, czeka aż pierwsza pętla, czyli producent, prześle mu porcję danych, a następnie ją we własny sposób przetwarza.
By zobaczyć jak to wygląda, kliknij menu File-> New... ->VI->From Template->Frameworks->Design Patterns-> Producer/Consumer Design Pattern (Data)
i w pierwszej pętli zrób pobieranie danych (jak to zrobiłeś do tej pory), zaś odbierane dane wysyłaj do kolejki, a w drugiej pętli zajmij się analizowaniem danych.
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Co masz na myśli mówiąc "postarać się o szybsze obroty" ? :)
Niestety próbka nie działa, nie wiem dlaczego, próbowałem również ja przeciągnąć otwierając przeglądarkę na komputerze z którym się łączę. Ale przerobiłem swój program na taki sam, wiec nie ma takiej potrzeby.
Z czasem i nagłówkami wszystko jest tak jak powinno, ale chciałbym aby program pobierał próbki ciągle, czyli tak jakby liczba próbek pobieranych (number of samples per channel) była nieograniczona. Ponieważ tak jak wspominałem w pierwszym poście, pomiary będą pobierane przez długi okres czasu. np 1h. Dokładnie nie jestem w stanie określić jaki to będzie czas. Próbowałem ustawiać tą liczbę na "-1" ponieważ wtedy, chyba, w teorii jest nieograniczona. Jednak wyskakują mi wtedy błędy.
Awatar użytkownika
aaddaas
Posty: 202
Rejestracja: 26 cze 2013 20:42
Wersja środowiska: LabVIEW 2015

Akwizycja danych temperatur w Labview

Post autor: aaddaas »

Postarać się o szybsze obroty - chodziło mi o to, że raczej program powinien być w stanie zareagować na działanie użytkownika (jak choćby przerwanie działania programu) w czasie około 100ms. Nie można czekać 10 sekund na skończenie jednego obiegu pętli;)
Nie możesz ustawić nieskończoną ilość próbek na kanał - jest to fizycznie nie możliwe, ponieważ każdy ustrój pomiarowy z układem cyfrowym jest skwantowany. Twoja karta może pobierać 12 MS/s/ch, czyli 12 milionów punktów pomiarowych na sekundę na kanał. Jest to BARDZO dużo, zdecydowanie za dużo dla Twojego typu pomiaru, chyba, że potrzebujesz mierzyć bardzo małe zmiany temperatury - ale sam powiedziałeś, że i tak będziesz wartości pomiarowe uśredniał. Nie wiem dokładnie co mierzysz, ale wydaje mi się, że częstotliwość próbkowania na poziomie 1k jest wystarczająca, a 10k to więcej jak dużo;)
No ale wracając do meritum: ten system pomiarowy pobiera próbki ciągle, z tym że Ty decydujesz ile tych próbek pobierze w ciągu sekundy. Po skończeniu pełnego cyklu, czyli przerzucenia próbek z bufora dalej, nie ma żadnych danych traconych.
Obrazek
lockdown9
Posty: 12
Rejestracja: 19 lis 2014 23:09
Wersja środowiska: LabVIEW 2013

Re: Akwizycja danych temperatur w Labview

Post autor: lockdown9 »

Może w ten sposób. W tej chwili program pobiera dane i zapisuje je do pliku, w jednej pętli. A chciałbym żeby dane były pobierane w jednej, następnie przesyłane do drugiej gdzie standardowa odchyłka pokazywała by mi (np. kiedy jej wartość zmniejszy się poniżej jakieś przykładowej wartości to zapala się czerwona lampka na front panel)kiedy mogę pobierać dane i w tym momencie chciałbym za pomocą jednego przycisku rozpocząć i zakończyć pobieranie danej liczby pomiarów, a te zostaną następnie uśrednione i zapisane do pliku. Przykładowo, mierzę temperaturę i odchyłka standardowa spada do danej wartości i zapala lampkę, w tym momencie wciskam przycisk i pobiera mi automatycznie 100 próbek a następnie robi z nich średnią. Jest taka możliwość ?
Wiem że to skomplikowane ale staram się przedstawić to co chcę osiągnąć jak najlepiej;)
Ponieważ odniosłem wrażenie że dążymy do stworzenie programu który będzie pobierał dane kiedy spełnią jakichś warunek bez mojej decyzji, a nie tak ma to wyglądać ;).
Ostatnio zmieniony 23 lis 2014 12:48 przez lockdown9, łącznie zmieniany 1 raz.
ODPOWIEDZ