Zbieranie pomiarów/ tablice.

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.
ava7ar
Posty: 2
Rejestracja: 20 mar 2013 15:11
Wersja środowiska: LabVIEW 2012

Zbieranie pomiarów/ tablice.

Post autor: ava7ar » 20 mar 2013 15:19

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.

eMeF
Posty: 8
Rejestracja: 10 lip 2012 14:10
Wersja środowiska: LabVIEW 2010

Zbieranie pomiarów/ tablice.

Post autor: eMeF » 20 mar 2013 16:48

Hej.

Pierwszy problem powinno rozwiązać użycie: "Insert Into Array"
Array add.png
Array add.png (22.74 KiB) Przejrzano 4028 razy
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.
array.png
array.png (23.71 KiB) Przejrzano 4027 razy
Powodzenia
Certified LabVIEW Developer

ava7ar
Posty: 2
Rejestracja: 20 mar 2013 15:11
Wersja środowiska: LabVIEW 2012

Re: Zbieranie pomiarów/ tablice.

Post autor: ava7ar » 20 mar 2013 17:42

Zrobiłem coś takiego ale nie obcina tablicy i nie wiem dlaczego.
Załączniki
tab.png
tab.png (9.65 KiB) Przejrzano 4022 razy

eMeF
Posty: 8
Rejestracja: 10 lip 2012 14:10
Wersja środowiska: LabVIEW 2010

Zbieranie pomiarów/ tablice.

Post autor: eMeF » 20 mar 2013 19:24

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ą.
Certified LabVIEW Developer

Awatar użytkownika
Góras
Posty: 88
Rejestracja: 13 sie 2012 10:15
Wersja środowiska: LabVIEW 2012

Re: Zbieranie pomiarów/ tablice.

Post autor: Góras » 20 mar 2013 21:32

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 :)
Załączniki
Array.png
Array.png (18.43 KiB) Przejrzano 4005 razy

PiDi
Posty: 627
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice
Has thanked: 3 times
Been thanked: 3 times

Re: Zbieranie pomiarów/ tablice.

Post autor: PiDi » 20 mar 2013 21:50

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 :)
Prawy klik na Build Array -> Concatenate Inputs.
ObrazekObrazekObrazekObrazek

Awatar użytkownika
cyjan1
Posty: 62
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2013
Lokalizacja: Tarnobrzeg

Re: Zbieranie pomiarów/ tablice.

Post autor: cyjan1 » 22 mar 2013 10:47

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.
bufor kołowy.png
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

Certified TestStand Architect

TMa
Posty: 202
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017
Been thanked: 4 times

Re: Zbieranie pomiarów/ tablice.

Post autor: TMa » 22 mar 2013 14:49

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

Awatar użytkownika
cyjan1
Posty: 62
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2013
Lokalizacja: Tarnobrzeg

Re: Zbieranie pomiarów/ tablice.

Post autor: cyjan1 » 22 mar 2013 16:03

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.
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.
Jeśli ktoś chce sprawdzić na swoim komputerze oto obie wersje:
bufor kołowy z in place structure.png
bufor kołowy.png
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

Certified TestStand Architect

ODPOWIEDZ