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.
W jaki sposób zmierzyć czas propagacji sygnału po rs232?
-
- 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?
Myślę że spokojnie możesz to zaadaptować do swoich potrzeb
bogdani
W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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
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
Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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.

Pozdrawiam
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.

Pozdrawiam
Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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').
Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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
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
Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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ł ;) : 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ć ;)
Na pomiar czasów konkretnych odczytów mam taki oto partyzancki pomysł ;) : 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ć ;)
Re: W jaki sposób zmierzyć czas propagacji sygnału po rs232?
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
).
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).

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).

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.
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

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).

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).

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.