problem z kartą pom. avt414
problem z kartą pom. avt414
Witam!
Mój problem z wymienioną kartą w tytule polega na tym, iż po zatrzymaniu programu za pomocą "Abort", kolejne uruchomienie programu i odczytanie danych (napięcia) nie jest już możliwe. Wysypuje się błąd (VISA: (Hex 0xBFFF0015) Timeout expired before operation completed.). Przypuszczam iż przerwanie działania programu i nie zamknięcie portu szeregowego nie pozwala na ponowne nawiązanie komunikacji. Chciałbym więc przed wysłaniem komendy do karty najpierw zamknąć port, potem znów go otworzyć i przesłać dane a następnie odczytywać napięcie z portu w pętli. Moje próby realizacji tego zadania póki co się nie powiodły...może ma ktoś pomysł jak rozwiązać mój problem.
Problem nie istnieje gdy wyciągam wtyczkę usb karty i włączam ją ponownie.
Z góry dziękuję za każdą odpowiedź.
Mój problem z wymienioną kartą w tytule polega na tym, iż po zatrzymaniu programu za pomocą "Abort", kolejne uruchomienie programu i odczytanie danych (napięcia) nie jest już możliwe. Wysypuje się błąd (VISA: (Hex 0xBFFF0015) Timeout expired before operation completed.). Przypuszczam iż przerwanie działania programu i nie zamknięcie portu szeregowego nie pozwala na ponowne nawiązanie komunikacji. Chciałbym więc przed wysłaniem komendy do karty najpierw zamknąć port, potem znów go otworzyć i przesłać dane a następnie odczytywać napięcie z portu w pętli. Moje próby realizacji tego zadania póki co się nie powiodły...może ma ktoś pomysł jak rozwiązać mój problem.
Problem nie istnieje gdy wyciągam wtyczkę usb karty i włączam ją ponownie.
Z góry dziękuję za każdą odpowiedź.
- Załączniki
-
- odczyt rs.vi
- (31.7 KiB) Pobrany 403 razy
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Ten błąd wynika raczej z tego, że nie odczytałeś danych (tych 4 bajtów) w tym czasie jaki jest określony - timeout 5 sekund.
Dla pewności podłącz wskaźnik błędu na wyjściu Read i zobacz, co Ci wyświetli.
Skąd jesteś pewny, że akurat te 4 bajty tam będą jak naciśniesz przycisk - nie możesz wcześniej skorzystać z właściwości Number of bytes at serial port?
I dlaczego zatrzymujesz program przyciskeim Abort skoro jest to zakazane ? ;)
Dla pewności podłącz wskaźnik błędu na wyjściu Read i zobacz, co Ci wyświetli.
Skąd jesteś pewny, że akurat te 4 bajty tam będą jak naciśniesz przycisk - nie możesz wcześniej skorzystać z właściwości Number of bytes at serial port?
I dlaczego zatrzymujesz program przyciskeim Abort skoro jest to zakazane ? ;)
smiglo
Re: problem z kartą pom. avt414
Błąd który wyrzuca bloczek Read jest opisany w pierwszym poście.
Skorzystałem z właściwości Number of bytes at serial port, tak jak radziłeś. Przy pierwszym podłączeniu karty wszystko jest ok, bloczek Number of bytes zwraca wartość 4 bajtów na porcie. Napięcie jest mierzone od 0 do 5V z dwoma miejscami po przecinku - stąd 4 bajty. Po wyłączeniu Abortem i powtórnym odpaleniu programu na porcie pojawia się 12bajtów po czym w następnej pętli nie ma nic... zostaje wartość 0 na bloczku Number of, karta niczego nie wysyła. Tak więc port nie zostaje zamknięty i karta nadal pracuje...
Oczywiście zastosowanie bloczka 'Number of bytes at serial port' pozbawiło program błędu... nie mniej jednak nie odczytuje żadnych wartości napięcia.
Skorzystałem z właściwości Number of bytes at serial port, tak jak radziłeś. Przy pierwszym podłączeniu karty wszystko jest ok, bloczek Number of bytes zwraca wartość 4 bajtów na porcie. Napięcie jest mierzone od 0 do 5V z dwoma miejscami po przecinku - stąd 4 bajty. Po wyłączeniu Abortem i powtórnym odpaleniu programu na porcie pojawia się 12bajtów po czym w następnej pętli nie ma nic... zostaje wartość 0 na bloczku Number of, karta niczego nie wysyła. Tak więc port nie zostaje zamknięty i karta nadal pracuje...
Oczywiście zastosowanie bloczka 'Number of bytes at serial port' pozbawiło program błędu... nie mniej jednak nie odczytuje żadnych wartości napięcia.
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Po co za każdym razem otwierasz, inicjalizujesz i zamykasz port? Wystarczy, że zrobisz to tylko raz na początku (otwarcie i inicjalizacja)i pózniej przy kończeniu programu (zamknięcie).
To samo z czyszczeniem bufora - zrób przy samej inicjalizacji programu, bo mogą tam być śmieci a później już nie czyść.
Dlaczego używasz ABORT??!!! Sam się prosisz o problemy:
"Note The Abort Execution button stops the VI immediately, before the VI finishes the current iteration. Aborting a VI that uses external resources, such as external hardware, might leave the resources in an unknown state by not resetting or releasing them properly. Design VIs with a stop button to avoid this problem."
Zastanawia mnie ten drugi zapis do portu z pustym stringiem zaraz po odczycie...
Pozdr
To samo z czyszczeniem bufora - zrób przy samej inicjalizacji programu, bo mogą tam być śmieci a później już nie czyść.
Dlaczego używasz ABORT??!!! Sam się prosisz o problemy:
"Note The Abort Execution button stops the VI immediately, before the VI finishes the current iteration. Aborting a VI that uses external resources, such as external hardware, might leave the resources in an unknown state by not resetting or releasing them properly. Design VIs with a stop button to avoid this problem."
Zastanawia mnie ten drugi zapis do portu z pustym stringiem zaraz po odczycie...
Pozdr
Ostatnio zmieniony 05 sie 2011 20:54 przez smiglo, łącznie zmieniany 1 raz.
smiglo
-
PiDi
- Posty: 641
- Rejestracja: 31 gru 2010 01:36
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: Katowice
Re: problem z kartą pom. avt414
Oburzę się razem ze smiglo o ten Abort. Jeśli tak zatrzymujesz program, to jest to na 85% przyczyna problemu. Zatrzymanie programu abortem, jak przytoczył kolega, natychmiast zatrzymuje program. Czyli jeśli miałeś otwarty port i użyjesz abort, to program się zatrzyma i portu nie zamknie, co za tym idzie port będzie sobie dalej śmigał aż do wystąpienia błędu (timeoutu, przepełnienia bufora...), błąd zostanie zarejestrowany i będzie czaił się do kolejnego uruchomienia programu, żeby wszystko posypać niczego (?) nie spodziewającemu się użytkownikowi.
Re: problem z kartą pom. avt414
Ok, problem z Abortem został po części rozwiązany. Gdy port nie jest zamknięty przez program po użyciu Abort, tylko nadal dane znajdują się w buforze program odczytuje je. Sprawdzam więc po otwarciu portu czy są jakieś dane. Jeśli nie, to wysyłam komendę o odczyt napięcia (co ma miejsce przy pierwszym podłączeniu karty), jeśli są to przechodzę od razu do odczytu (następuje po użyciu Abortu).
Dodałem też przycisk 'stop', żeby nie kończyć programu Abortem. Jednak po wyjściu z pętli i zamknięciu portu.. pojawia się ten sam błąd który opisałem na początku.
Drugi zapis pustego stringa po odczycie jest po to, żeby wywołać kolejną daną - czyli zapytanie i odpowiedź z karty.
Dodałem też przycisk 'stop', żeby nie kończyć programu Abortem. Jednak po wyjściu z pętli i zamknięciu portu.. pojawia się ten sam błąd który opisałem na początku.
Drugi zapis pustego stringa po odczycie jest po to, żeby wywołać kolejną daną - czyli zapytanie i odpowiedź z karty.
- Załączniki
-
- odczyt rs.vi
- (20.92 KiB) Pobrany 363 razy
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Wyszukałem opis tej karty z AVT. O ile dobrze przeczytałem to po wysłaniu rozkazu inicjującego odczyt danych analogowych, później wystarczy już tylko wysyłać numer kanału z którego chcemy odczytać - numer a u Ciebie jest wysyłana spacja.. 
smiglo
Re: problem z kartą pom. avt414
Tak właśnie ja wysyłam spację, ale równie dobrze mógłbym wysyłać nr określonego portu. Moje rozwiązanie wzięło się stąd, że wydając komendę w hyperterminalu 1A50 aby otrzymać kolejne wartości napięcia potrzebne było użycie spacji...stąd analogiczne rozwiązanie w programie.
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Wypróbuj załącznik.
Potencjalne źródło Twoich problemów to mogą być jakieś pozostałości w porcie np. 3 bajty przy ponownym uruchomieniu. W efekcie f. Read brakuje 1 bajtu i wysypuje się.
W załączniku najpierw czyszczę port a później wysyłam komendę odczytu - za każdym razem po ponownym uruchomieniu programu - taka moja propozycja. Program działa aż do momentu zatrzymania przyciskiem, oczywiście możesz to zmienić..
Potencjalne źródło Twoich problemów to mogą być jakieś pozostałości w porcie np. 3 bajty przy ponownym uruchomieniu. W efekcie f. Read brakuje 1 bajtu i wysypuje się.
W załączniku najpierw czyszczę port a później wysyłam komendę odczytu - za każdym razem po ponownym uruchomieniu programu - taka moja propozycja. Program działa aż do momentu zatrzymania przyciskiem, oczywiście możesz to zmienić..
- Załączniki
-
- odczyt rs-1popr.vi
- (26.7 KiB) Pobrany 373 razy
smiglo
problem z kartą pom. avt414
Próbowałem już podobnego, jeśli nie identycznego rozwiązania do tego które przesłałeś w załączniku...czyli po włączeniu (zainicjowanie portu) czyszczenie portu f Clear. Niestety nic to nie daje... z Twoim załącznikiem jest podobnie jak z moimi programami.. pierwsze odpalenie chodzi, po podłączeniu karty. Następne, niestety już nie, wysypuje się błąd timeout. Przy drugim odpaleniu wydaje się że LabView nie zamyka portu i dane nadal są w buforze. Przy drugim odpaleniu na porcie znajduje się 12bitów(nie 4 jak powinno być), po trzech pętlach i odczytaniu danych program siada. Nie przyjmuje komendy ani też niczego nie odczytuje...Analogiczna sytuacja ma miejsce w programie z załącznika.
Nie mam pojęcia dlaczego tak właśnie się dzieje, może to charakterystyka karty!?
Nie mam pojęcia dlaczego tak właśnie się dzieje, może to charakterystyka karty!?
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Rzeczywiście to dziwne. A jak używasz Hyperterminala dzieje się podobnie?
Ostatnio zmieniony 08 sie 2011 19:24 przez smiglo, łącznie zmieniany 1 raz.
smiglo
Re: problem z kartą pom. avt414
Za pomocą terminala mogę cały czas łączyć się z portem com, dostawać dane, rozłączać połączenie, nawiązywać i tak w kółko bez najmniejszych problemów. Po ponownym połączeniu dane są cały czas wysyłane przez kartę - nie ma więc potrzeby ponownego wpisywania komendy, wystarczy spacja, bądź numer kanału.
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
Czyli to nie karta. Zobacz jeszcze to (poprawiłem drobne błędy) - chociaż wątpię..
Na marginesie: zastanawia mnie dlaczego wysyłanie spacji powoduje odczyt wartości, nie zgadza się to zupełnie z opisem tej karty. To samo tyczy się kodu klawisza Escape - może warto wrzucić jego kod do komendy.
Na marginesie: zastanawia mnie dlaczego wysyłanie spacji powoduje odczyt wartości, nie zgadza się to zupełnie z opisem tej karty. To samo tyczy się kodu klawisza Escape - może warto wrzucić jego kod do komendy.
- Załączniki
-
- odczyt rs-3.vi
- z escapem
- (29.32 KiB) Pobrany 385 razy
Ostatnio zmieniony 08 sie 2011 21:39 przez smiglo, łącznie zmieniany 2 razy.
smiglo
Re: problem z kartą pom. avt414
Jak się okazało BARDZO WARTO wrzucić kod ESC do komendy
sprawdziłem najpierw Twój prog, działa bez zarzutu, można wyłączyć działanie Abortem, albo przyciskiem Stop i wszystko ładnie śmiga po ponownym odpaleniu. Funkcja Flush Receive Buffer.. nie jest potrzebna... Skopiowałem Twoją komendę z podaniem kodu ESC i mój .vi też działa bez żadnego problemu. Tak więc 'diabeł tkwi w szczegółach', bardzo dziękuję za pomoc!
Teraz chciałbym obsłużyć kilka portów jednocześnie... i otrzymywać np 3 napięcia...
Teraz chciałbym obsłużyć kilka portów jednocześnie... i otrzymywać np 3 napięcia...
-
smiglo
- Posty: 110
- Rejestracja: 18 sty 2006 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Bydgoszcz
Re: problem z kartą pom. avt414
No to wysyłanie numeru kanału zamiast spacji już Cię nie ominie
.
Wystarczy, że będziesz przełączał się między zapisem (write2) i odczytem (read). Podawaj na wejście f. Write kolejne numery kanałów 1,2,3,0 (użyć Shift registera) korzystając z jednej funkcji zapisu, to samo z odczytem.
Można to oczywiście rozwlec na kilka funkcji zapisu i odczytu ale nie będzie to zbyt eleganckie..
Wystarczy, że będziesz przełączał się między zapisem (write2) i odczytem (read). Podawaj na wejście f. Write kolejne numery kanałów 1,2,3,0 (użyć Shift registera) korzystając z jednej funkcji zapisu, to samo z odczytem.
Można to oczywiście rozwlec na kilka funkcji zapisu i odczytu ale nie będzie to zbyt eleganckie..
smiglo
