Rysowanie wykresu na bieżąco z odczytanego pliku

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.
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Witam. Jestem totalnym początkującym. Przeszukałem forum, ale niestety nie poradziłem sobie z problemem, dlatego też postanowiłem poprosić was o pomoc. Myślę, że to dla was pestka. Otóż moim celem jest pobranie danych z pliku txt i zrobienie z tego wykresu. Odczyt ma odbywać się co sekundę, zapisywać w array i tak samo ma pojawiać się wykres, aż do momentu naciśnięcia przycisku STOP. Dane to charakterystyka filtru dolnoprzepustowego. Pierwsza kolumna to częstotliwość, druga dB. W załączniku przesyłam plik z danymi i moje dotychczasowe wypociny. Liczę na was!
labview.rar
(36.56 KiB) Pobrany 407 razy
1.jpg
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Pitol »

Witaj freoz,

Twój problem zaiste jest banalny, ale dla początkującego może stanowić nie lada zagwozdkę :)

Ale do rzeczy... Z tego co przedstawiłeś na rysunku wynika, że odczyt robisz raz, przed pętlą, następnie jakieś operacje w pętli do naciśnięcia przycisku STOP, a na koniec wrzucenie tego na wykres.
Jak zapewne zauważyłeś nie działa to tak, jak byś tego oczekiwał.

Jest kilka metod, które pozwoliłby Ci zrealizować zadanie.
Najprostszą jest:
1. Odczytać plik przed pętlą i przekaż do pętli w postaci tablicy 2D
2. Dane w postacji tablicy musisz czytać wiersz po wierszu (możesz skorzystać z Index Array i iteratora pętli do odczytu kolejnych wierszy z tablicy 2D)
3. Odświeżanie wykresu musi się odbywać wewnątrz pętli
4. Wstaw odpowiednie opóźnienie (1s) do wnętrza pętli

I powinno działać. W razie problemów pisz. Będziemy radzić.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Witam, bardzo dziękuje za odpowiedź.
Więc mam zrobić przed pętlą odczyt, stworzyć nowa tablice(build array czy insert into array) i dalej poprzez shift register przekazać do pętli. Następnie użyć index array połączyć z iteracja petli i odczytywanymi danymi i znowu tworzyć tablicę, która będzie odczytywana wiersz po wierszu? Jak sie robi odświeżanie? pzdr
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Pitol »

Trochę nie przemyślałem, tego co chcesz.
Bo z tego co rozumiem, to w pliku masz jakieś dane, które chcesz co sekundę wrzucać na wykres, wiersz po wierszu.

Więc żeby to działało to:
1. Dane z pliku podłącz do pętli przez zwykły terminal (nie musisz robić rejestru przesuwnego)
2. Stwórz dodatkowy rejestr przesuwny, w którym będą przetrzymywane dane do wykresu (tablica 2D)
3. W każdej iteracji odczytuj sobie po jednym wierszu i dodawaj do tablicy, którą masz w rejestrze przesuwnym (Build Array)
4. Odświeżanie wykresu polega na po prostu wstawieniu indykatora Waveform Graph/XY Graph do wnętrza pętli i podłączenia do niej rejestru przesuwnego.

Jeśli nie będzie działać dalej to wstaw zrzut ekranu tego co zrobiłeś.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Udało się! Zapisuje wiersz po wierszu!
Ale jak to bywa, pojawił się kolejny problem. Nie rysuje mi prawidłowo wykresu. Tak jakby nie wykorzystywalo 2 kolumny. Chodzi mi o to, że pierwsza kolumna to częstotl. w osi X, a druga dB w osi Y. Jak rozdzielić kolumny z tablicy na składowe X i Y ? Dodaje schemat bloczkowy, wykres, który rysuje i wykres z excela, którego oczekuje :) Dzięki Pitol za dotychczasową pomoc!
naforum2.jpg
naforum3.jpg
naforum4.jpg
Ostatnio zmieniony 22 sie 2013 12:45 przez freoz, łącznie zmieniany 1 raz.
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Pitol »

Jeśli dobrze widzę, to do wejścia X Input i Y Input podpinasz to samo, co powoduje, że program źle działa.

Skorzystaj z bloczka Index Array. W przypadku tablic 2D możesz wybrać w nim, czy chcesz wyciągnąć cały wiersz, czy kolumnę.
W Twoim przypadku potrzebujesz oddzielnie kolumny 1 i 2 podpinane odpowiednio do wejść X Input i Y Input.

Myślę, że z tym już sobie poradzisz.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Czyli tak:
w pierwszym index array mam loop iteration podlaczony do row i mi ładnie wyświetla wiersz z 2 rekordami. Ale nadal nie wiem jak zrobić aby wyciągnąć tą drugą kolumne. Kolejny index array? Czy na tym samym bazować?
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Pitol »

Bloczek Index Array można rozszerzać (skieruj kursor myszki na dolną krawędź bloczka).
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Tak już wiem. Wyświetla tak jak chce, wiersz po wierszu z 2 danymi (x,y). Ale problem polega na tym, że nie wiem gdzie podłączyć Y. Żeby z drugiej kolumny wyświetlanego wiersza pobierało mi daną y. Nie wiem jak to rozdzielić na schemacie, bo w build array jest tylko jedno wyjście.
Awatar użytkownika
Pitol
Moderator
Posty: 987
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Pitol »

Popatrz sobie w help (Ctrl-H) do bloczka Index Array.

Możesz tam zaznaczyć, czy chcesz wiersze (row) czy kolumny (col).

W rejestrze przesuwnym zbierasz dane z każdej iteracji. Aby wyświetlić dane na wykresie musisz je z tej tablicy wyciągnąć.
Tak jak pisałem, oś X to kolumna 0, oś Y kolumna 1. Skorzystaj z Index Array i jego wejścia col. Możesz bloczek rozszerzyć, dzięki temu dostaniesz jednocześnie kolumnę 0 i 1.

W skrócie:
1. Zbierasz dane do tablicy 2D
2. Przygotowanie danych do wyświetlenia polega na wyciągnięciu za pomocą Index Array odpowiednich KOLUMN (nie wierszy) z tej tablicy
3. Profit...
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Pokombinowałem z tymi index array. Otrzymałem wykres o jaki mi chodziło, ale pojawia sie on od razu, a nie punkt po punkcie co sekunde. Tak blisko, a tak daleko..
naforum1.jpg
naforum2.jpg
Paweł Górski
Posty: 5
Rejestracja: 10 sie 2013 16:56
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Paweł Górski »

Cześć,
Kilka moich uwag:
* wydaje mi się że do Twojego programiku lepiej pasuje pętla For, ponieważ po wczytaniu wszystkich punktów program nie zacznie rysować wykresu od początku. Jeżeli w pętli For dołożymy Conditional Terminal to będziemy mogli ją wcześniej zatrzymać po wciśnięciu przycisku Stop. Chyba że chodziło Ci o to żeby pętla się nie zatrzymywała po wczytaniu całości - wtedy jest OK.
* W miejscu gdzie dane z pliku wchodzą do pętli w postaci arraya 2D łatwiej będzie Ci uzyskać to co chcesz jeśli na tunelu włączysz ineksowanie (prawy przycisk myszy na tunelu i klikasz "enable indexing"). Oznacza to że do pętli nie wchodzi od razu cały array 2D, tylko każda iteracja pętli wczytuje jeden wiersz z arraya wejściowego (kolejna itaracja - kolejny wiersz). Teraz te kolejne wiersze możesz w każdej iteracji dopisywać do pustego arraya i wyświetlać go na wykresie - z każdą iteracją przybywa do niego kolejna para danych i całość jest wrzucana na wykres.
Przeanalizuj sobie przykładzik który zrobiłem i postaraj się zrozumieć co się dzieje w którym miejscu, w razie czego pytaj.
Powodzenia :-)
Załączniki
1.jpg
1.jpg (26.31 KiB) Przejrzano 16842 razy
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Jest jest działa!!
Dziekuje Panowie!

Jeszcze takie małe pytanko : co zrobić, aby po ponownym uruchomieniu programu odczytywał dane od początku? (czyścił wykres i arraye )?
Paweł Górski
Posty: 5
Rejestracja: 10 sie 2013 16:56
Wersja środowiska: LabVIEW 2012

Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: Paweł Górski »

W wersji jak na rysunku masz zapewnione czyszczenie arraya który idzie na wykres dzięki pustemu arrayowi przed pętlą. Dla testów sprawdź jak program zachowuje się z tym elementem i bez niego i wyciągnij wnioski ;-) (chodzi o array constatnt przed pętlą i shift registerem). Można też czyścić sam wykres programowo, np. pred wykonaniem pętli. W tym celu klikasz na XY Graph prawym przyciskiem myszy wybierasz Create >> Property Node >> Value. Stworzony bloczek Property node wyciągasz przed pętlę, klikasz na nim ppm i wybierasz Change All To Write. Teraz zamiast wyjścia z property node masz wejście do property node, klikasz na wejściu ppm i dajesz Create >> Constant. Dzięki temu przez property node przekazujesz informację wykresowi żeby jako wartości które ma wyświetlać przyjął pustego arraya - czyli żeby wyczyścił wykres.
freoz
Posty: 12
Rejestracja: 21 sie 2013 18:57
Wersja środowiska: LabVIEW 2012

Re: Rysowanie wykresu na bieżąco z odczytanego pliku

Post autor: freoz »

Ok, działa. Dziękuje jeszcze raz. Bardzo mi pomogliście. Już dziś trochę nie trybie, bo cały czas nad tym siedziałem. Pozdrawiam!
ODPOWIEDZ