Array przekazywany co sekunde
Array przekazywany co sekunde
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.
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 (10.6 KiB) Przejrzano 13976 razy
Re: Array przekazywany co sekunde
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
Re: Array przekazywany co sekunde
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.
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.
Array przekazywany co sekunde
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
Re: Array przekazywany co sekunde
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.
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.
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Array przekazywany co sekunde
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
A w międzyczasie spróbuję znów w ciemno coś rzucić, może się uda
- Załączniki
-
- prodkon.vi
- LV2009
- (8.63 KiB) Pobrany 339 razy
Re: Array przekazywany co sekunde
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ć.
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
Array przekazywany co sekunde
PiDi, tym razem nie trafiles 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 Jutro go przetestuje w pracy na projekcie i dam znac ;)
Dzieki wielkie za pomoc.
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 Jutro go przetestuje w pracy na projekcie i dam znac ;)
Dzieki wielkie za pomoc.
Array przekazywany co sekunde
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
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Array przekazywany co sekunde
A, to chyba już wiem o co chodzi i podpowiadam...
- Załączniki
-
- timing.vi
- LV2009
- (22.1 KiB) Pobrany 340 razy
Array przekazywany co sekunde
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 ;)
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 ;)
Array przekazywany co sekunde
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
Re: Array przekazywany co sekunde
O tak! W piatek przez maly blad moj program chwile po starcie wywieszal win7. Pojawial sie BSOD i komputer sie restartowal
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.
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.
Array przekazywany co sekunde
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
-
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: Array przekazywany co sekunde
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.Harnas pisze: PiDi, gotowe VIe wolalbym omijac. Chyba, ze samemu sobie cos podobnego zbuduje.