Wychwytywanie luk czasowych w pomiarach.

Sprawy związane z interfejsem użytkownika - kontrolki, wskaźniki, wyświetlacze, wykresy oraz inne zagadnienia tego typu...
Robert79
Posty: 15
Rejestracja: 28 paź 2013 20:18
Wersja środowiska: LabVIEW 7.1

Wychwytywanie luk czasowych w pomiarach.

Post autor: Robert79 »

Witam.
Próbuję zrealizować program który odczytuje dane z rejestratora dokonującego pomiary z kilku czujników.
Rejestrator wykonuje pomiary z cyklem 5min a wyniki zapisuje do pamięci.
Struktura pamięci to: data+pomiary, data+pomiary.... itd.
Aplikacja Labview odczytuje zawartość pamięci i wyświetla dane na waveform chart.
Cykl pomiarów teoretycznie jest stały (5min) jednak gdy rejestrator zostanie wyłączony wówczas mam lukę czasową którą chcę zaznaczyć na wykresie poprostu wpisując zera w tym czasie.
Tutaj pojawia się problem ponieważ gdy rejestrator jest wyłączony np. przez kilkanaście dni to samo zapełnianie zerami trwa kilkadziesiąt sekund.
Z tego co widzę to samo wykonywanie pustej pętli for jest błyskawiczne ale wpisywanie zer do wykresów już nie.
Poniżej zamieszczam podprogram który jest wywoływany przy odczycie pamięci rejestratora. Wykres znajduje się w programie głównym i jest on modyfikowany w podprogramie gdzie odwołuję się przez referencje.
Proszę o sugestie w jaki sposób zmodyfikować podprogram i podpowiedź dlaczego pętla for tak długo się wykonuje.
Załączniki
luki i wykres.JPG
rej_luki_i_wykres.vi
(155.02 KiB) Pobrany 396 razy
Awatar użytkownika
Bluesheep
Posty: 14
Rejestracja: 16 sty 2013 21:08
Wersja środowiska: LabVIEW 2013
Lokalizacja: Kraków

Wychwytywanie luk czasowych w pomiarach.

Post autor: Bluesheep »

Witam,

zwróć uwagę na to, że z każdym obrotem pętli wykonujesz operacje wymagające przeładowania wartości kontrolki na panelu frontowym. Zmiany wartości na front panelu, a wszczególności takich elementów jak wykres, potrafią być bardzo kosztowne czasowo. Wklejam cytat od NI:

Completing user interface actions uses more memory because LabVIEW switches from the execution thread to the user interface thread. For example, when you set the Value property, LabVIEW simulates a user changing the value of the control, stopping the execution thread and switching to the user interface thread to change the value. Then LabVIEW updates the operation buffer that stores data at the control and redraws the control if the front panel is open. LabVIEW then sends the data back to the execution thread in a protected area of memory called the transfer buffer. LabVIEW then switches back to the execution thread. The next time the execution thread reads from the control, LabVIEW finds the data in the transfer buffer and receives the new value for the execution buffer that stores data on the block diagram.
źródło: http://zone.ni.com/reference/en-XX/help ... ion_speed/

Rozwiązaniem, które mogę zasugerować w Twoim przypadku, jest posłużenie się property node Defer Panel Updates (VI Server Reference (This VI) -> Front Panel -> DeferPanUpdts), którego działanie jest w skrócie opisane tutaj. Dzięki niemu zanegujesz możliwość odświeżania wartości na panelu frontowym (True). Po przywróceniu opcji odświeżania (False), wraz z kolejną wpisaną wartością Twoje wpisywane wcześniej dane załadują się na wykresie.

Dla mnie przy załadowaniu 100 liczb czas 500ms skracał się do około 70ms.

Pozdrawiam
Ostatnio zmieniony 31 gru 2013 14:40 przez Bluesheep, łącznie zmieniany 4 razy.
Robert79
Posty: 15
Rejestracja: 28 paź 2013 20:18
Wersja środowiska: LabVIEW 7.1

Wychwytywanie luk czasowych w pomiarach.

Post autor: Robert79 »

Wielkie dzięki. W moim przypadku jest różnica z 64s na 5s.

Pozdrawiam.
Robert79
Posty: 15
Rejestracja: 28 paź 2013 20:18
Wersja środowiska: LabVIEW 7.1

Wychwytywanie luk czasowych w pomiarach.

Post autor: Robert79 »

Witam ponownie.
Muszę nieco odświeżyć temat.
Zamiast DeferPanUpdts zastosowałem po prostu visible w property node do każdego wykresu. Różnica jest taka że wykresy nie są wyświetlane w czasie odczytu ale panel nie jest blokowany i mogę w tym czasie wyświetlać pasek postępu odczytu.
Chciałbym jeszcze nieco przyspieszyć program (wczytywanie danych do wykresów) ponieważ zauważyłem że podczas odczytu danych, po ok 12kB następuje spowolnienie ładowania danych tak jakby jakiś bufor się wypełniał i to powoduje dodatkowe opóźnienia.
Jak mogę ewentualnie sprawdzić w LV co jest przyczyną takich opóźnień albo który element podczas wykonywania programu wprowadza największe opóźnienia?
TMa
Posty: 203
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017

Re: Wychwytywanie luk czasowych w pomiarach.

Post autor: TMa »

Do szybkiego diagnozowania kodu BARDZO przydaje się narzędzie ukryte pod Tools»Profile»Performance and Memory. Po świadomej analizie wyników mogą wyjść bardzo ciekawe wnioski dotyczące twojego kodu.
Ostatnio zmieniony 08 kwie 2014 09:26 przez TMa, łącznie zmieniany 1 raz.
Robert79
Posty: 15
Rejestracja: 28 paź 2013 20:18
Wersja środowiska: LabVIEW 7.1

Wychwytywanie luk czasowych w pomiarach.

Post autor: Robert79 »

Faktycznie, fajne narzędzie. To mnie tylko bardziej ugruntowało w tym że z moim sub vi jest coś nie tak.
perform.JPG
Na zrzucie niżej pokazałem w jaki sposób wywołuję sub który wprowadza tyle opóźnienia.
prog6.JPG
prog6.JPG (50.04 KiB) Przejrzano 8315 razy
Sub 6 znajduje się w pętli while która jest uruchamiana przy odczycie danych z pliku i wywoływana tyle razy ile wierszów danych zapisano w pliku.
Wywołując sub 6 pobieram za każdym razem referencje do wykresów. Wewnątrz sub 6 dokonuję detekcji luk w pamięci oraz wykonuję proste operacje na pobranych paczkach. Na końcu przekazuję dane do 4 wykresów, w sumie 38 plot-ów.
Wydaje mi się że opóźnienia będą miały związek z ładowaniem danych do wykresów ale nie jestem pewien i nie bardzo wiem jak to sprawdzić.
ODPOWIEDZ