W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Wszelkie sprawy związane z LabVIEW i komunikacją ze sprzętem. Problemy i ciekawe rozwiązania.
Bratt
Posty: 6
Rejestracja: 16 paź 2009 19:38
Wersja środowiska: LabVIEW 8.5

W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: Bratt »

Witam serdecznie!

Jestem nowym użytkownikiem pakietu Labview (ok 4 miesięcy) i w realizowanym przeze mnie projekcie trafiłem na małą "zagwozdkę". Przechodząc do sedna - mam sterownik Vision 280 Unitronicsa, z którym komunikuję się z Labview poprzez serwer UniOPC z wykorzystaniem portu COM. Udało mi się zrealizować komunikację w obie strony (mogę zarówno zmieniać z pomocą Labview dane w sterowniku jak i odczytywać je z niego i wyświetlać w VI Labview) za pomocą Data Socket. Mój problem , może dla większości z was trywialny, to pomiar czasu. Chciałbym zmierzyć czas jaki mija od wysłania zapytania (zarówno z Labview jak i ze sterownika) do sterownika/labview (np ustaw wartość zero w MI0) do uzyskania żądanego rezultatu (odpowiedzi). Może za bardzo kombinuję i dlatego nie jestem w stanie tego zrobić, może moja wiedza jest niewystarczająca, a może nie da się tego zrobić korzystając z DataSocket. Próbowałem odnaleźć odpowiedź zarówno w książce pana Chruściela jak i w sieci ale niestety ie udało mi się trafić na nic co choćby w niewielkim stopniu nakierowało mnie na rozwiązanie.

Tak czy owak byłbym bardzo wdzięczny za jakiekolwiek wskazówki, które mogłyby naprowadzić mnie na rozwiązanie tego "problemu".

Z góry dziękuje i pozdrawiam.
bogdani
Administrator
Posty: 1315
Rejestracja: 30 lip 2003 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Ruda Śląska
Kontakt:

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: bogdani »

Myślę że spokojnie możesz to zaadaptować do swoich potrzeb
Czas_wykonania.png
Czas_wykonania.png (8.26 KiB) Przejrzano 9152 razy
bogdani
Ktoś ci pomógł na forum? Podziękuj dając pochwałę.

Obrazek Obrazek Obrazek
Bratt
Posty: 6
Rejestracja: 16 paź 2009 19:38
Wersja środowiska: LabVIEW 8.5

W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: Bratt »

Witam!

Przepraszam, że odzywam się dopiero dziś, ale w końcu mam czas żeby nad tym zadaniem ponownie zasiąść. Bardzo dziękuję za pomoc - wszystko śmiga jak należy. Udzielił bym pochwały ale niestety nie mogę :(

Mam nadzieję, że jeśli pojawią się jakieś kolejne wątpliwości/pytania/ problemy to będę mógł znowu liczyć na pomoc kolegów ekspertów :]

Jeszcze raz serdeczne dzięki.

Pozdrawiam
Bratt
Posty: 6
Rejestracja: 16 paź 2009 19:38
Wersja środowiska: LabVIEW 8.5

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: Bratt »

Witam ponownie!

Problemów i pytań dotyczących pomiaru ciąg dalszy (niestety).

Korzystając z podsuniętego przez bogdaniego pomysłu zmierzyłem czas wpisu danych do sterownika. Wszystko przebiegło bez problemów, a wyniki z wykorzystaniem WriteToSpredsheet zapisałem sobie w Excelu. Problem pojawił się w momencie gdy chciałem zmierzyć czy czas odczytu danych jest podobny do czasu wpisania ich do sterownika. Mianowicie, LV nie jest w stanie podczas pojedynczego połączenia pobrać danych ze sterownika (zarówno w przypadku gdy są to dane typu integer i boolean) - tak jakby czas połączenia był zbyt krótki (informacja o dodaniu zmiennej pojawia się w OPC serverze ale nie udaje się odczytać jej wartości). Udaje się to dopiero przy wykorzystaniu pętli while z tym, że wówczas LV podłącza się do sterownika tylko raz (i odczytuje zmiany danych) a co za tym idzie nie mam możliwości wykorzystać tutaj FlatSequenceStructure ponieważ labview wchodzi w pętlę while i w niej zostaje nie przechodząc do kolejnej ramki. I po raz kolejny przychodzi prosić mi was szanowni koledzy o pomoc. Poniżej zamieściłem screen schematu blokowego z którego korzystam. Z góry dziękuję jeśli któryś z czytających poświęci chwilę i naprowadzi mnie na rozwiązanie tego problemu.

Obrazek

Pozdrawiam
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: coolfon »

A nie możesz po prostu zakończyć pętli w momencie odczytania danej? Załóżmy, że odczytana wartość ma się pojawić w indykatorze X (kontrolka typu string). W pierwszym okienku Flat Sequence ustawiasz jego wartość na 'empty string', a w drugim okienku już w pętli While sprawdzasz jego wartość i gdy jest różna od 'empty string' (czyli bloczek Not equal? zwróci wartoć True) kończysz pętlę (wyjście bloczka Not equal? podpinasz 'conditional terminal' - warunek 'stop if true').
stop while loop.png
stop while loop.png (3.89 KiB) Przejrzano 9079 razy
Bratt
Posty: 6
Rejestracja: 16 paź 2009 19:38
Wersja środowiska: LabVIEW 8.5

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: Bratt »

Witam!

Bardzo dziękuję Ci coolfonie za sugestię. Po dostosowaniu Twojego pomysłu do swoich potrzeb rzeczywiście udało mi się zmierzyć czas odczytu, lecz metoda ta nie daje 100% satysfakcji. Otóż czas podłączenia się Labview do sterownika przy jednokrotnym pomiarze jest nieporównanie dłuższy niż w sytuacji gdy odczytujemy kolejne dane uzyskane po pierwszym odczycie (czyli drugi, trzeci, i n-ty odczyt danej) - i wypada mi tu zaznaczyć, że podczas pisania poprzedniego postu-prośby nie zwróciłem uwagi, ze podczas podłączania się do sterownika czas pierwszego odczytu jest zdecydowanie wydłużony (i tu biję się w pierś). Generalnie wygląda to tak jakby Labview podczas podłączenia dosyć długo "gmerało" w sterowniku w poszukiwaniu określonego rejestru (zmiennej), o czym informuje wartość zmiennej Quality, która w początkowym etapie połączenia ma wartość 40 zaś po odczytaniu danej pierwszy raz wartość ta ustala się na C0 i nie zmienia w kolejnych etapach odczytu, przy czym kolejne odczyty (zmiana wartości zmiennej) następują już zdecydowanie szybciej niż pierwszy.

Mam nadzieję, że nie zaciemniłem wam teraz zbytnio obrazu sprawy (problemu).

Będę dalej próbował zmierzyć kolejne czasy odczytu i jeśli uda mi się cos zrealizować to dam znać. Tymczasem proszę was, szanowni czytający, o ewentualne dalsze podpowiedzi/sugestie/wskazówki dotyczące problemu pomiaru kolejnych odczytów wartości zmiennej. Będę wdzięczny za każdą pomoc.

Pozdrawiam
Awatar użytkownika
coolfon
Posty: 232
Rejestracja: 01 gru 2007 08:59
Wersja środowiska: LabVIEW 2009
Kontakt:

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: coolfon »

Tak to właśnie bywa z zestawieniem połączenia z urządzeniem zewnętrznym - trochę to trwa. Właśnie dlatego bloczki open i close daje się przed i za pętlą While - połączenie zestawiane jest tylko raz, aby zaoszczędzić czas.

Na pomiar czasów konkretnych odczytów mam taki oto partyzancki pomysł ;) :
wielokrotny pomiar.png
Całość oczywiście bardzo umownie, musisz dostosować to sobie do Twoich potrzeb. Generalnie chodzi o to, że nie mierzysz czasu w momencie zestawiania połączenia, tylko tuż przed pomiarem i zaraz po. Jeśli wykonasz 5 pomiarów (5 iteracji pętli For) dostaniesz na wyjściu pięcioelementową tablicę z czasami ich wykonania. A dalej możesz sobie z tym robić co chcesz - odrzucić czasy skrajne (najdłuższy/najkrótszy), policzyć czas średni itp...

Daj znać czy może być ;)
Bratt
Posty: 6
Rejestracja: 16 paź 2009 19:38
Wersja środowiska: LabVIEW 8.5

Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?

Post autor: Bratt »

Cześć!

Na wstępie chciałbym Ci coolfonie podziękować po raz kolejny za pomoc oraz poświęcony mojemu problemowi czas. Po raz kolejny jednak okazuje się, że podpowiedziane przez Ciebie rozwiązanie, pomimo tego iż działa, nie daje mi tego co chciałbym uzyskać. I szczerze powiem, że aż mi głupio to pisać, bo gdy nie Twoja pomoc to pewnie dalej tkwiłbym gdzieś na początku drogi.
Metoda którą zaproponowałeś działa w jak najlepszym porządku z tym, ze mierzy ona nie czas pomiędzy wysłaniem zapytania z Labview, a czasem uzyskania odpowiedzi od sterownika (o co mi docelowo chodzi), a czas jaki upływa pomiędzy kolejnymi zmianami wartości rejestru/zmiennej. Jeśli, dajmy na to, poczekam 5 sekund z wciśnięciem na klawiaturze sterownika guzika, który zmienia wartość zmiennej to czas jaki poda mi zarówno ten jak i poprzedni program to właśnie czas jaki upłynie od chwili odczytania poprzedniej zmiennej do chwili naciśnięcia przycisku na klawiaturze sterownika (te dajmy an to 5 sekund) + czas akwizycji (o który mi chodzi - nie wiem czy poprawnie określiłem ten czas o który mi chodzi jako czas akwizycji :-s ).

Jak juz wcześniej wspominałem podczas "gmerania" w sterowniku już po podłączeniu się do OPC servera (o czym informuje komunikat w event logu UniOPC) w polu wartości danych wpisane jest zero zaś w polu wartości jakości transmisji wpisana jest wartość 40. Wartość 0 wpisana jest do czasu odnalezienia i odczytania w sterowniku odpowiedniej zmiennej po czym następuje uaktualnienie wartości pola danych do wartości odczytanej zmiennej oraz pola jakości do żądanego parametru transmisji - C0 (rys niżej).

Obrazek

Pomyślałem więc że podczas pojedynczego odczytu mógłbym spróbować zmierzyć czas, w którym w polu danych jest wartość zero (ponieważ wówczas Labview jest w fazie "gmerania") i odjąć go od czasu, który zostanie zmierzony do chwili pojawienia się jedynki w polu danych (SB programu niżej).

Obrazek

Jednak i ta metoda zawiodła, gdyż czas był tylko o kilka ms krótszy od czasu jaki upłynął od nawiązania połączenia do chwili zakończenia połączenia, a nie wydaje mi się żeby proces akwizycji danych mógł trwać tak krótko podczas gdy w sytuacji pojedynczego zapisu trwało to średnio ok 200ms. Ale może się mylę i sama akwizycja ma trwać rzeczywiście krótko zaś ja pokiełbasiłem coś w pomiarach czasu wpisu danych do sterownika . Sam juz nie wiem.

Jesli komuś z czytających te moje "wypociny" nasunie się jakiś pomysł/rada/wskazówka która może mi w jakikolwiek sposób pomoc to bardzo serdecznie proszę o pomoc po raz kolejny.

z góry dziękuje wszystkim za poświęcony czas.

Pozdrawiam.
ODPOWIEDZ