Witam wszystkich,
Mam pewien problem z komunikacją przez RS. Otóż gdy wysyłam rozkaz do urządzenia to po wykonaniu czynności powinienem otrzymać odpowiedź. Niestety odpowiedź ta przychodzi dopiero po wysłaniu natępnej komendy. Czyli zawsze otrzymuję odpowiedź ale na poprzedni rozkaz. Co mam zrobić aby odrazu otrzymywać odpowiedzi na zadane komendy bez tych opóĹşnień? Gdy komunikuję się z urządzeniem przez terminal w windowsie to wszystko jest w porządku czyli w labview coś mam nie tak.
W załączeniku przedstawiam 2 pliki. Pierwszy z użyciem Notifierów tak jak to próbuję zrobić i drugi najprostrzy przykładowy sposob połączenia przez RS i w obu przypadkach odpowiedzi są przesyłane z opóĹşnieniem.
Mógłby mi ktoś pomóc bo juz długo z tym walczę i nie wiem jak rozwiązać ten problem.
LabView 8.2
Pozdrawiam
komunikacja przez RS
komunikacja przez RS
Ostatnio zmieniony 31 mar 2008 10:56 przez fenix, łącznie zmieniany 1 raz.
-
vugie
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Re: komunikacja przez RS
Daj niewielkie opóźnienie - wait (ms) - pomiędzy wysłaniem rozkazu, a odbiorem odpowiedzi (jakieś 10-50 ms). Albo, jeżeli wiesz ile bajtów ma mieć odpowiedź, każ odczytywać konkretną ilość bajtów w bloczku VISA Read - wtedy sam na nie poczeka aż do timeout-u.
Czy na pewno liczby w rozkazie mają być wysyłane binarnie? Pisałeś, że sprawdzałeś w windowsowym terminalu...
Czy na pewno liczby w rozkazie mają być wysyłane binarnie? Pisałeś, że sprawdzałeś w windowsowym terminalu...
Ostatnio zmieniony 31 mar 2008 11:34 przez vugie, łącznie zmieniany 1 raz.
komunikacja przez RS
Własnie wydaje mi się ze on nie czeka na odpowiedź tylko po wyslaniu komendy konczy prace chociaz w programie jest zrobione tak zeby odczytywal odpowiednia ilosc bajtów w bloczku VISA Read. Z tym czasem miedzu zapisem i odczytem probowalem wczesniej cos robić i jeżeli dam 50 ms to jest tak samo, natomiast jezeli dam czas dluzszy od wykonywania czynnosci (w moim przypadku wykonanie odpowiedniej ilosci krokow silnikiem) to ta odpowiedz bedzie, tylko ze program powinien sam czekac az do pojawienia sie tej odpowiedzi bo nie wiem ile tych krokow bedzie, tzn czy ma czekac 2 czy moze 20 sekund.
Jesli chodzi o komendy to tak powinno byc a przez terminal wysylalem po prostu rozkazy zapisane w pliku i odpowiedź otrzymuje po wykonaniu czynności tak jak powinno być. Ja już zgłupiałem i nie wiem o co chodzi. Czemu program nie czeka na ta odpowiedz.
Jesli chodzi o komendy to tak powinno byc a przez terminal wysylalem po prostu rozkazy zapisane w pliku i odpowiedź otrzymuje po wykonaniu czynności tak jak powinno być. Ja już zgłupiałem i nie wiem o co chodzi. Czemu program nie czeka na ta odpowiedz.
-
vugie
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Re: komunikacja przez RS
Bo on nie czeka na odpowiedź. Natychmiast po wysłaniu rozkazu każesz mu przeczytać wszystkie znaki z bufora. A w buforze jest 0 bajtów, bo urządzenie nie zdążyło jeszcze nic wypluć. Więc on czyta 0 bajtów i przechodzi do dalszych czynności. Kiedy wysyłasz następny rozkaz to w buforze jest już odpowiedź na poprzedni, bo urządzenie ją w międzyczasie zdążyło wygenerować. Czyta ją więc, ale zanim pojawi się następna.
Jeżeli odpowiedź ma zawsze stałą długość to podepnij ją właśnie do bloczka Read, a timeout w bloczku konfiguracyjnym ustaw na najdłuższy czas odpowiedzi jakiego się spodziewasz + jeszcze trochę.
Jeżeli odpowiedĹş ma zmienną długość, to między wysłaniem i odczytem wstaw pętlę while, w której będziesz tylko odczytywał ilość znaków w buforze dopóki nie będzie większa lub równa minimalnej długości odpowiedzi. Potem czekaj jeszcze 10-20 ms (aż nadejdzie ewentualna reszta) i odczytuj cały bufor.
Jeżeli odpowiedź ma zawsze stałą długość to podepnij ją właśnie do bloczka Read, a timeout w bloczku konfiguracyjnym ustaw na najdłuższy czas odpowiedzi jakiego się spodziewasz + jeszcze trochę.
Jeżeli odpowiedĹş ma zmienną długość, to między wysłaniem i odczytem wstaw pętlę while, w której będziesz tylko odczytywał ilość znaków w buforze dopóki nie będzie większa lub równa minimalnej długości odpowiedzi. Potem czekaj jeszcze 10-20 ms (aż nadejdzie ewentualna reszta) i odczytuj cały bufor.
komunikacja przez RS
Dziala
ja mam stałą długość 4 bajtów więc w Read wpisalem 4 i czeka az pojawi sie tyle bajtów. Mam jeszcze tylko jedno pytanie. Chciałbym czyscić za każdym razem bufor żeby przy czekaniu na odpowiedz na pewno w nim nic nie bylo. Sluzy do tego bloczek VISA Flush I/O Buffer ale tam w mask są do wyboru 4 opcje. Którą powinienem wybrać, bo nie wiem od czego to zalezy?
Dziekuje za odpowiedz dotyczaca mojego problemu bo juz jest wszystko ok:)
Pozdrawiam
Dziekuje za odpowiedz dotyczaca mojego problemu bo juz jest wszystko ok:)
Pozdrawiam
-
vugie
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
komunikacja przez RS
Cytat z helpa:
To nie są 4 opcje do wyboru, tylko każda jest niezależna. Np. żeby wyczyścić naraz oba bufory trzeba podać 128+64, czyli 192. W tym przypadku wystarczy wartość domyślna (16 lub 64).
Kod: Zaznacz cały
16 0x10 Flushes and discards contents of the receive buffer (same as 64).
32 0x20 Flushes and discards contents of the transmit buffer by writing all the buffered data to the device.
64 0x40 Flushes and discards contents of the receive buffer (does not perform any I/O to the device).
128 0x80 Flushes and discards contents of the transmit buffer (does not perform any I/O to the device).
komunikacja przez RS
Acha, wszystko jasne
Jeszcze raz wielkie dzieki za pomoc!