Array przekazywany co sekunde

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Array przekazywany co sekunde

Post autor: Harnas »

W zasadzie prosta sprawa, ktora zaczyna mi juz mieszac w glowie.

W petli producenta robie pomiary z wskazana czestotliwoscia probkowania. W petli konsumenta pomiary powinny byc dopisywane do Arraya o ustalonej wielkosci i co wybrany czas wyswietlane (co sekunde, ale to juz mniejsza).

Przykladowo wartosci pobieramy z czestotliwoscia 1kHz (to dziala), petla konsumenta pracuje tak szybko jak na to pozwala moc komputera, pomiary sa caly cas dopisywane do arraya o ustalonej wielkosci i array ten co wybrany czas odzwiezany.

Szukalem juz rozwiazania tutaj, ale nie znalazlem.

Wrzucam screena z tym co do tej pory zrobilem.
Wielkosc arraya i ilosc interacji petli for jest rowna czestotliwosci probkowania. Petli while nie chce przy tym spowalniac.
Załączniki
Unbenannt.PNG
Unbenannt.PNG (10.6 KiB) Przejrzano 13976 razy
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Re: Array przekazywany co sekunde

Post autor: MicMac89 »

Przyznam, że nie bardzo rozumiem w czym dokładnie tkwi problem. To co przedstawiłeś na zdjęciu realizuje którą pętlę? W jakiej formie przekazywane są pomiary z pętli producenta do konsumenta?
Certified LabVIEW Associate Developer
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Re: Array przekazywany co sekunde

Post autor: Harnas »

No to jeszcze raz od poczatku.

W petli producenta pomiary z wielu kanalow jako array dopisywane sa do bloczka Enqueue Element a w petli konsumenta odczytywane przez bloczek Queue Status(przetestowane - dziala). Nastepnie array dzielony jest na poszczegolne kanaly przez bloczek Index Array (dziala) i w ten sposob otrzymujemy dla kazdego kanalu pomiary w danym momencie( = na screenie odpowiada temu generator losowych liczb) - tez dziala.
Poniewaz probkowanie przebiega z bardzo duza czestotliwoscia i na ekranie wartosci tak szybko by mi skakaly, ze nic bym nie widzial, chce z kazdego kanalu zrobic array o okreslonej wielkosci, z tego arraya policzyc srednia arytmetyczna i ja odswiezac na ekranie co powiedzmy jedna sekunde.
Calkiem oddzielnie bedzie przebiegalo archiwizownie wszystkich pomiarow.

Na zalaczonym screenie probowalem wlasnie ta ostatnia czesc zrealizowac, tylko nie wiem jak ustawic czas co jaki maja mi sie wartosci odswiezac w arrayu na wyjsciu.

Dziekuje za zainteresowanie.
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Array przekazywany co sekunde

Post autor: MicMac89 »

Ok, chyba zaczynam łapać o co tutaj chodzi. Każda próbka pomiarowa przekazywana jest po dokonaniu jej akwizycji od razu do pętli konsumenta (próbka czyli tablica, gdzie elementy to poszczególne kanały). Jeśli tak to może warto spróbować uzależnić odświeżanie od zliczenia konkretnej ilości próbek. Tzn. dokładasz poszczególne próbki do tablicy w pętli konsumenta, gdy doliczysz do N to obliczasz średnią, dodajesz do kolejnej tablicy i wyświetlasz. Wówczas można by mieć średnią z ostatniej sekundy pomiarów, niekoniecznie co sekundę.
Certified LabVIEW Associate Developer
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Re: Array przekazywany co sekunde

Post autor: Harnas »

Dobrze zalapes o co mi chodzi, tylko teraz ja nie wiem dokladnie co Ty masz na mysli. Dokladniej gdzie u Ciebie byloby odswiezanie co ustalony czas?

Zalaczony screen ma przedstawiac petle konsumenta, a generator losowych liczb symuluje znowu pojedyncza probka, ktora jest dopisywana do tablicy. Gdy wielkosc tablicy jest rowna 10 obliczana jest srednia a tablica wyczyszczona. Malo elegancko to wyglada, ale dziala i nie tworzy sie niewiadomo jak duzy array, ktory spowalnia komputer.

Probowalem to zastosowac w glownym projekcie. Petla producenta ma tam ustalona przez bloczek DAQmx Timing czestotliwosc probkowania 10Hz, ta wartosc jako local variable wrzucam w petle konsumenta zamiast stalej liczby 10 ze screena i otrzymuje srednia co jedna sekunde. Wyglada, ze dziala.

Gdy jednak czestotliwosc wynosi 1kHz, 100Hz albo 1Hz wpisanie do tablicy trwa albo za dlugo albo nie dziala w ogole.
Nie mam w ogole pomyslu na rozwiazanie tego.
Załączniki
a tak wyglada to mniej wiecej "na brudno" w glownym projekcie
a tak wyglada to mniej wiecej "na brudno" w glownym projekcie
symulacja petli konsumenta
symulacja petli konsumenta
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Array przekazywany co sekunde

Post autor: PiDi »

Ja standardowo ferszteje niśt. Możesz zamieścić vi, który jasno pokazuje, w czym problem?

A w międzyczasie spróbuję znów w ciemno coś rzucić, może się uda :p
Załączniki
prodkon.vi
LV2009
(8.63 KiB) Pobrany 339 razy
ObrazekObrazekObrazekObrazek
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Re: Array przekazywany co sekunde

Post autor: MicMac89 »

Otóż w moim rozwiązaniu zastosowałem ciekawą konstrukcję Producent-Konsument1-Konsument2.

Pętla Producent wyznacza kolejne pomiary i przekazuje je do pętli Konsument1. W pętli Konsument1 obliczana jest średnia z ilości próbek równych częstotliwości próbkowania (założyłem, że częstotliwość ta należy do przedziału [1,1000]). Wygenerowana w ten sposób średnia przekazywana jest do pętli Konsument2, gdzie jest ona wyświetlana po określonym czasie.

Rozwiązanie pozwala uzyskać realizację zadania, przy czym daje możliwość buforowania obliczonych średnich w kolejce. Dzięki temu na pewno będzie obliczona średnia z N pomiarów, przy jednoczesnym odczekaniu czasu odświeżania wykresu, który można korygować w zależności od zajętości kolejki.

Naturalnie jest to tylko pomysł, zrealizowany w oparciu o moje rozumienie tego problemu. Nie jest on doskonały, należałoby go rozbudować.
Załączniki
Prod-Con-Con.vi
Struktura Producent-Konsumer-Konsumer
(36.65 KiB) Pobrany 343 razy
Certified LabVIEW Associate Developer
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Array przekazywany co sekunde

Post autor: Harnas »

PiDi, tym razem nie trafiles :-B Nie moge spowalniac petli producenta, zeby wolniej napelniac array w petli konsumenta.
Petla producenta przeprowadza interacje swoja predkoscia, petla konsumenta maksymalnie szybko, a pokazana wartosc srednia (obliczona w petli konsumenta) ma byc odswiezana co ustalony czas.

Pomysl MicMac89 calkiem ciekawy. W sumie moglem sam na to wpasc :-w Jutro go przetestuje w pracy na projekcie i dam znac ;)

Dzieki wielkie za pomoc.
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Array przekazywany co sekunde

Post autor: MicMac89 »

Nie ma problemu, dołożenie równoległej pętli jest zawsze dobrym rozwiązaniem. Dodatkowo korzystając z kolejkowania masz pewność i kontrolę nad tym, że żadna średnia Ci nie ucieknie nawet jeśli będziesz je obliczał szybciej niż wyświetlał. W razie jakichkolwiek pytań pisz śmiało.
Certified LabVIEW Associate Developer
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Array przekazywany co sekunde

Post autor: PiDi »

A, to chyba już wiem o co chodzi i podpowiadam...
Załączniki
timing.vi
LV2009
(22.1 KiB) Pobrany 340 razy
ObrazekObrazekObrazekObrazek
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Array przekazywany co sekunde

Post autor: Harnas »

Potestowalem rozwiazanie z druga petla konsumenta i o to moje spostrzezenia.
Jezeli czestotliwosc probkowania jest bardzo wysoka, a druga petla konsumenta ma ustawienie przykladowo 500ms to srednia nie jest pokazywana w czasie rzeczywistym. Tego obejsc akurat sie nie da, jezeli chce wszystkie srednie pokazywac.
PiDi, gotowe VIe wolalbym omijac. Chyba, ze samemu sobie cos podobnego zbuduje.

Jeszcze cos pokombinuje ;)
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Array przekazywany co sekunde

Post autor: MicMac89 »

W istocie zastrzegłem, że jest to rozwiązanie, które należy jeszcze dopracować. Korzystając z kolejek masz możliwość kontroli ich zajętości. Zatem możesz regulować opóźnienie wyświetlania średniej w stosunku do zajętości kolejki. Przy źle dobranych czasach opóźnienia i częstotliwości próbkowania może dojść do wykorzystania dostępnej pamięci komputera, na co należy mieć wzgląd.
Certified LabVIEW Associate Developer
Awatar użytkownika
Harnas
Posty: 152
Rejestracja: 16 mar 2011 09:56
Wersja środowiska: LabVIEW 2009

Re: Array przekazywany co sekunde

Post autor: Harnas »

O tak! W piatek przez maly blad moj program chwile po starcie wywieszal win7. Pojawial sie BSOD i komputer sie restartowal :D

Zrobilem to jeszcze inaczej.
Wartosc srednia bedzie obliczana wtedy, kiedy wielkosc tablicy bedzie rowna czestotliwosci probkownia/2.
Przy fTakt = 1kHz srednia bedzie obliczana z ostatnich 500 probek.
Przy fTakt = 100Kz z ostatnich 50 probek.
Petla while konsumenta pracuje bez ograniczen i po pierwszych zabawach wyglada, ze dziala i jest w sumie najprostszym rozwiazaniem.
Załączniki
petla konsumenta, dopisywanie probek do arraya
petla konsumenta, dopisywanie probek do arraya
MicMac89
Posty: 122
Rejestracja: 05 wrz 2011 20:40
Wersja środowiska: LabVIEW 2011

Array przekazywany co sekunde

Post autor: MicMac89 »

Rozumiem, czyli taki był mój pierwotny pomysł zawarty w drugim poście tego tematu, gdzie jak zaznaczałem traci się synchronizację odświeżania wykresu. Grunt, że działa ;)
Certified LabVIEW Associate Developer
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Array przekazywany co sekunde

Post autor: PiDi »

Harnas pisze: PiDi, gotowe VIe wolalbym omijac. Chyba, ze samemu sobie cos podobnego zbuduje.
Ależ nie dałem Ci tym razem bynajmniej gotowca, dałem tylko bloczek, który zdaje mi się rozwiązywać cały twój problem z wywoływaniem kawałka programu co pewien czas.
ObrazekObrazekObrazekObrazek
ODPOWIEDZ