Rysowanie wykresu na bieżąco z odczytanego pliku
Rysowanie wykresu na bieżąco z odczytanego pliku
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!
- 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
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ć.
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ć.
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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
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
- 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
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ś.
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ś.
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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!
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

Ostatnio zmieniony 22 sie 2013 12:45 przez freoz, łącznie zmieniany 1 raz.
- 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
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.
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.
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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ć?
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ć?
- 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
Bloczek Index Array można rozszerzać (skieruj kursor myszki na dolną krawędź bloczka).
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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.
- 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
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...
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...
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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..
-
- Posty: 5
- Rejestracja: 10 sie 2013 16:56
- Wersja środowiska: LabVIEW 2012
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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
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 (26.31 KiB) Przejrzano 16836 razy
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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 )?
Dziekuje Panowie!
Jeszcze takie małe pytanko : co zrobić, aby po ponownym uruchomieniu programu odczytywał dane od początku? (czyścił wykres i arraye )?
-
- Posty: 5
- Rejestracja: 10 sie 2013 16:56
- Wersja środowiska: LabVIEW 2012
Rysowanie wykresu na bieżąco z odczytanego pliku
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.
Re: Rysowanie wykresu na bieżąco z odczytanego pliku
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!