subvi na RT przestaje działać - datasocket problem?

Tematy związane z LabVIEW pracującym w czasie rzeczywistym.
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

subvi na RT przestaje działać - datasocket problem?

Post autor: PrzemB »

Witam,
pracuję nad pewnym projektem, w którym system pomiarowy postawiony jest na sbRIO09627 i komunikuje się z aplikacją host na PC. Host zarządza pomiarami oraz otrzymuje co jakiś czas dane do podglądu. Do komunikacji wykorzystuję mechanizm datasocket (na RT ustawiony jest serwer psp, Host odbiera i zapisuje zmienne współdzielone). Niestety okazuje się, że co jakiś czas wiesza się subvi odpowiedzialny za komunikację RT z hostem (w załączeniu ten vi). Nie potrafię na razie zdebugować problemu - vi wygląda jakby działał - strzałka pokazuje stan Running, a pętla while przestaje się wykonywać. Może coś w tym programie "wisieć"? Podejrzewam problemy z datasocket - może to gdzieś się wiesza? Niestety jest to dla mnie pewna nowość i dopiero poznaję ten mechanizm. Jeśli ktoś ma jakieś potencjalne uwagi i podejrzenia to będę bardzo wdzięczny - w poniedziałek aplikacja musi działać powtarzalnie :)
Pozdrawiam
Przemek
Załączniki
RT communication loop.vi
(101.25 KiB) Pobrany 390 razy
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: subvi na RT przestaje działać - datasocket problem?

Post autor: PiDi »

Pierwsze pytanie: skąd wiesz, że pętla przestaje się wykonywać?
Na pierwszy rzut oka jedyna rzecz, która może zawisnąć, to te dwa Enqueue Element w Case Structure na górze, bo mają nieskończony timeout - nie wiem, jak masz skonfigurowane te kolejki ani co z nich czyta.
Jeśli debugujesz tego VIja, to po "zawiśnięciu" naciśnij sobie Highlight Execution ("żarówa" w pasku obok pauzy) - bloczek, który aktualnie się wykonuje i potencjalnie blokuje całą pętlę, będzie miał zieloną strzałkę na sobie (wygląda to tak jak tu: https://zone.ni.com/reference/en-XX/hel ... echniques/ w części Single-Stepping).
ObrazekObrazekObrazekObrazek
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: subvi na RT przestaje działać - datasocket problem?

Post autor: PrzemB »

Pętla się zawiesza - sprawdzam na probe'ach i widzę, że nie ma przebiegu sygnałów - nowo wstawiony probe ma stan "not executed". Higlight execution też próbowałem, po pojawieniu się błędu nie widać aby cokolwiek się działo - nie jestem w stanie również zauważyć na którym bloku to wisi. Nie pojawiają się żadne błędy, coś czeka. Piszesz o możliwości wiszenia na zapisie do kolejki - tu moje pytanie - jaki jest sens tego timeoutu? Rozumiem timeuot przy odczycie kolejki - jeśli nic w niej nie ma, poczekaj chwilę a jak dalej nic się nie pojawi to idź dalej. Ale jak to działa przy zapisie? Czy chodzi o ilość zapisywanych do kolejki danych?

Pozdrawiam
Przemek
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: subvi na RT przestaje działać - datasocket problem?

Post autor: PiDi »

PrzemB pisze:Pętla się zawiesza - sprawdzam na probe'ach i widzę, że nie ma przebiegu sygnałów - nowo wstawiony probe ma stan "not executed". Higlight execution też próbowałem, po pojawieniu się błędu nie widać aby cokolwiek się działo - nie jestem w stanie również zauważyć na którym bloku to wisi. Nie pojawiają się żadne błędy, coś czeka.
Ok, rozpędziłem się z tym Highlight Execution, on chyba pokaże Ci tylko zieloną strzałkę na subVIjach, nie na niskopoziomowych bloczkach (jak Enqueue, itp). Coś musi tak czy inaczej czekać, możesz spróbować krok po kroku wyłączać fragmenty kodu za pomocą Diagram Disable Structure i powinieneś znaleźć winowajcę. Przy czym tak jak już mówiłem - te Enqueue Element na górze mają największy potencjał do trzymania pętli.
Albo wytłumaczenie jest prostsze - ta pętla jest zatrzymywana przez "emergency FIFO", czy przypadkiem gdzieś nie wysyłasz do tej kolejki stopa?
Piszesz o możliwości wiszenia na zapisie do kolejki - tu moje pytanie - jaki jest sens tego timeoutu? Rozumiem timeuot przy odczycie kolejki - jeśli nic w niej nie ma, poczekaj chwilę a jak dalej nic się nie pojawi to idź dalej. Ale jak to działa przy zapisie? Czy chodzi o ilość zapisywanych do kolejki danych?
Skoro przy odczycie mamy "poczekaj chwilę a jak dalej nic się nie pojawi to idź dalej", to oczywiście przy zapisie mamy "poczekaj, aż odbiorca będzie mógł odebrać wiadomość - czyli aż zwolni miejsce w kolejce". Domyślnie przy tworzeniu kolejki (Obtain Queue) jej rozmiar jest nieograniczony, ale można podać np. max 50 elementów - pytanie, jak Ty tworzysz te kolejki.
Znajdź w Example Finderze (menu Help -> Find Examples...) przykład "Queue Overflow and Underflow", powinien pomóc Ci zrozumieć.
ObrazekObrazekObrazekObrazek
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: subvi na RT przestaje działać - datasocket problem?

Post autor: PrzemB »

Dzięki za wytłumaczenie timeout'u w kolejce - teraz wydaje się oczywiste :)
Co do "Emergency FIFO" to nie to - jeśli pętla się zatrzymuje, to zmienia się strzałka pokazująca pracę vi - tu ewidentnie coś wisi. Zdaje się, że dodanie timeout przy zapisie do kolejek rozwiązało problem - faktycznie jedna się przepełniała. Dzięki za pomoc!
Pozdrawiam
ODPOWIEDZ