Zbieranie pomiarów/ tablice.
Zbieranie pomiarów/ tablice.
Witam! Jest to mój pierwsze temat na tym forum więc z góry przepraszam jak coś robię źle.
Mam dwa problemy:
Pierwszy łatwiejszy jak dodać jedną tablicę do drugiej po prostu tak żeby po ostatnim wierszu pierwszej był pierwszy wiersz drugiej?
Drugi mam funkcję która zbiera pomiar napięcia co 0,01 s i zapisuje w tablicy. Jak zrobić żebym w tablicy po zakończeniu programu zawsze miał ostatnie x elementów np. 20? I nie chodzi mi o ucięcie ostatnich elementów ponieważ tablica pierwotna była by za dużych rozmiarów chciałbym żeby tablica miała na stałe 20 elementów.
Mam dwa problemy:
Pierwszy łatwiejszy jak dodać jedną tablicę do drugiej po prostu tak żeby po ostatnim wierszu pierwszej był pierwszy wiersz drugiej?
Drugi mam funkcję która zbiera pomiar napięcia co 0,01 s i zapisuje w tablicy. Jak zrobić żebym w tablicy po zakończeniu programu zawsze miał ostatnie x elementów np. 20? I nie chodzi mi o ucięcie ostatnich elementów ponieważ tablica pierwotna była by za dużych rozmiarów chciałbym żeby tablica miała na stałe 20 elementów.
Zbieranie pomiarów/ tablice.
Hej.
Pierwszy problem powinno rozwiązać użycie: "Insert Into Array" Do drugiego problemu dobrze byś zapoznał/a z shift register. Tutaj przykład działającego kodu. Jeżeli rozmiar tablicy przekroczy 20 obcinamy pierwszy wiersz, więc tablica przechowuje zawsze 20 ostatnich pomiarów. Powodzenia
Pierwszy problem powinno rozwiązać użycie: "Insert Into Array" Do drugiego problemu dobrze byś zapoznał/a z shift register. Tutaj przykład działającego kodu. Jeżeli rozmiar tablicy przekroczy 20 obcinamy pierwszy wiersz, więc tablica przechowuje zawsze 20 ostatnich pomiarów. Powodzenia
Certified LabVIEW Developer
Re: Zbieranie pomiarów/ tablice.
Zrobiłem coś takiego ale nie obcina tablicy i nie wiem dlaczego.
- Załączniki
-
- tab.png (9.65 KiB) Przejrzano 10150 razy
Zbieranie pomiarów/ tablice.
Używasz bloczka "Delete from Array" najedz na niego i użyj CTRL+H. Dowiesz się o nim więcej ;)
Odepnij stałą "0" z wejścia length Zaczniesz usuwać elementy z tablicy. A w zasadzie każdy nowy element gdy tablica dojdzie do rozmiaru 20.
Lepiej wróć do mojego przykładu i zobacz czym się różnią.
Odepnij stałą "0" z wejścia length Zaczniesz usuwać elementy z tablicy. A w zasadzie każdy nowy element gdy tablica dojdzie do rozmiaru 20.
Lepiej wróć do mojego przykładu i zobacz czym się różnią.
Certified LabVIEW Developer
Re: Zbieranie pomiarów/ tablice.
ava7ar usuwasz elementy z tablicy, ale do rejestru przesuwnego dajesz to co zostało w tablicy po usunięciu, czyli w Twoim przypadku nic. Owe 20 (lub na początku mniej) elementów tablicy znajdziesz na wyjściu delated portion, jednak będzie to za każdym razem pierwsze 20 elementów. Jeśli bardzo Ci zależy żeby użyć funkcji Delate from Array to wystarczy zmieniać wartość index lub przed usunięciem obrócić tablicę (Reverse 1D Array), usunąć 20 elementów od indeksu 0 i obrócić tablicę jeszcze raz.
Co do sklejania dwóch tablic to można użyć bloczka Build Array - nie wiem czy jest trik - przykład na obrazku poniżej
Co do sklejania dwóch tablic to można użyć bloczka Build Array - nie wiem czy jest trik - przykład na obrazku poniżej
- Załączniki
-
- Array.png (18.43 KiB) Przejrzano 10133 razy
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Zbieranie pomiarów/ tablice.
Prawy klik na Build Array -> Concatenate Inputs.Góras pisze: Co do sklejania dwóch tablic to można użyć bloczka Build Array - nie wiem czy jest trik - przykład na obrazku poniżej
- cyjan1
- Posty: 70
- Rejestracja: 08 paź 2012 11:55
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: podkarpacie
Re: Zbieranie pomiarów/ tablice.
Witam!
Dodam tylko, że należy pamiętać o tym, że funkcje 'Build Array' czy 'Remove from Array' są dosyć pamięciożerne i czasochłonne ponieważ są to operacje zmieniające rozmiar tablicy.
W tym przypadku, może to nie mieć kompletnie żadnego znaczenia (ani ilość danych nie jest duża ani czas nie jest krytyczny), ale mimo to może warto zapoznać się z rozwiązaniem opartym o tzw. bufor kołowy.
Opis:
1. Inicjujemy tablicę (bufor kołowy) o rozmiarze n.
2. W pętli wykonujemy pomiary, które są zapisywane w kolejnych pozycjach bufora kołowego.
3. Zawsze gdy dojdziemy do końca bufora, następne wyniki wpisujemy począwszy od pierwszego elementu bufora. Tak więc bufor zawsze zawiera n ostatnich elementów, a stare wartości są nadpisywane nowymi (analogia do Sweep Chart Update Mode dla Waveform Chart).
4. Po zakończeniu pomiarów należy jeszcze bufor podzielić i 'skleić' w odpowiedniej kolejności.
W tym rozwiązaniu zamiast dwóch czasochłonnych operacji Build Array i Remove from Array jest jedna operacja Replace Array Subset.
Zysk z takiego rozwiązania widoczny jest dopiero przy większych wartościach ilości pomiarów i i wielkości bufora k:
dla i = 10000, k = 20: t1 < 1ms, t2 = 11ms
dla i = 1000000, k = 20: t1 = 40ms, t2 = 1230ms
dla i = 1000000, k = 2000: t1 = 40ms, t2 = 5200ms.
Dane powyższe są orientacyjne (dla mojego komputera), ale pokazują też, że dla rozwiązania z buforem kołowym sama wielkość tego bufora nie ma praktycznie znaczenia.
Zenek
Dodam tylko, że należy pamiętać o tym, że funkcje 'Build Array' czy 'Remove from Array' są dosyć pamięciożerne i czasochłonne ponieważ są to operacje zmieniające rozmiar tablicy.
W tym przypadku, może to nie mieć kompletnie żadnego znaczenia (ani ilość danych nie jest duża ani czas nie jest krytyczny), ale mimo to może warto zapoznać się z rozwiązaniem opartym o tzw. bufor kołowy.
Opis:
1. Inicjujemy tablicę (bufor kołowy) o rozmiarze n.
2. W pętli wykonujemy pomiary, które są zapisywane w kolejnych pozycjach bufora kołowego.
3. Zawsze gdy dojdziemy do końca bufora, następne wyniki wpisujemy począwszy od pierwszego elementu bufora. Tak więc bufor zawsze zawiera n ostatnich elementów, a stare wartości są nadpisywane nowymi (analogia do Sweep Chart Update Mode dla Waveform Chart).
4. Po zakończeniu pomiarów należy jeszcze bufor podzielić i 'skleić' w odpowiedniej kolejności.
W tym rozwiązaniu zamiast dwóch czasochłonnych operacji Build Array i Remove from Array jest jedna operacja Replace Array Subset.
Zysk z takiego rozwiązania widoczny jest dopiero przy większych wartościach ilości pomiarów i i wielkości bufora k:
dla i = 10000, k = 20: t1 < 1ms, t2 = 11ms
dla i = 1000000, k = 20: t1 = 40ms, t2 = 1230ms
dla i = 1000000, k = 2000: t1 = 40ms, t2 = 5200ms.
Dane powyższe są orientacyjne (dla mojego komputera), ale pokazują też, że dla rozwiązania z buforem kołowym sama wielkość tego bufora nie ma praktycznie znaczenia.
Zenek
Pozdrawiam
Zenek
Zenek
Re: Zbieranie pomiarów/ tablice.
Jeśli mówimy o dużej ilości danych należałoby nadmienić, że wskazane by było użycie struktury In Place z odpowiednimi terminalami IO.cyjan1 pisze:Dodam tylko, że należy pamiętać o tym, że funkcje 'Build Array' czy 'Remove from Array' są dosyć pamięciożerne i czasochłonne ponieważ są to operacje zmieniające rozmiar tablicy.
- cyjan1
- Posty: 70
- Rejestracja: 08 paź 2012 11:55
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: podkarpacie
Re: Zbieranie pomiarów/ tablice.
W pierwszej wersji mojego przykładu użyłem In Place Structure. Potem sprawdziłem wersję z Replace Array Subset i nie było zauważalnej różnicy. Podzieliłem się więc z drugim rozwiązaniem, bo jest prostsze w zrozumieniu.TMa pisze:Jeśli mówimy o dużej ilości danych należałoby nadmienić, że wskazane by było użycie struktury In Place z odpowiednimi terminalami IO.
Jeśli ktoś chce sprawdzić na swoim komputerze oto obie wersje:
Może w innych wersjach LV wygląda to inaczej. A może Replace Array Subset jest już wystarczająco zoptymalizowane do modyfikacji pojedynczych elementów tablicy.
Zenek
Pozdrawiam
Zenek
Zenek