komunikacja przez RS

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Awatar użytkownika
fenix
Posty: 97
Rejestracja: 21 mar 2006 00:00
Lokalizacja: Warszawa

komunikacja przez RS

Post autor: fenix »

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

Post autor: vugie »

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...
Ostatnio zmieniony 31 mar 2008 11:34 przez vugie, łącznie zmieniany 1 raz.
Awatar użytkownika
fenix
Posty: 97
Rejestracja: 21 mar 2006 00:00
Lokalizacja: Warszawa

komunikacja przez RS

Post autor: fenix »

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.
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: komunikacja przez RS

Post autor: vugie »

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.
Awatar użytkownika
fenix
Posty: 97
Rejestracja: 21 mar 2006 00:00
Lokalizacja: Warszawa

komunikacja przez RS

Post autor: fenix »

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
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

komunikacja przez RS

Post autor: vugie »

Cytat z helpa:

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).
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).
Awatar użytkownika
fenix
Posty: 97
Rejestracja: 21 mar 2006 00:00
Lokalizacja: Warszawa

komunikacja przez RS

Post autor: fenix »

Acha, wszystko jasne :) Jeszcze raz wielkie dzieki za pomoc!
ODPOWIEDZ