Strona 1 z 1

Przesyłanie danych z DAQ przez UDP

: 08 lip 2008 20:00
autor: pawelb85
Witam,
mam problem z którym męczę się od dłuższego czasu.
Chcę zrobić 2 programy:
1 - ma zczytywać dane z karty pomiarowej, różna ilość wejść. Dodatkowo układać dane w kolejke, np. jakieś parametry karty, itp, później dane z karty, tak aby powstał jakiś ciąg który będzie następnie wysyłany przez UDP.

2- ma zczytywać dane poprzez UDP z poprzedniego programu oraz wyciągać je z kolejki, np. że pierwsza dana to liczba danych pobranych z karty, druga to liczba wejść, a następne to już pobierane dane z karty.

Niektóre rzeczy mi nawet wychodziły, miałem za to problem z wyselekcjonowaniem danych z poszczególnych wejść, oraz z wykresem, który powinien się pojawiać w czasie pobierania danych w czasie rzeczywistym. Dodatkowo nie zostawała przesyłana odpowiednia liczba danych, zawsze jakoś mniej.. Ma to chyba związek z ograniczeniami UDP, ale nie jestem pewien.

Jak ktoś zna i kojarzy temat to bardzo proszę o pomoc. Sam nie dam rady, siedzę już nad tym sporo, ale nadal nie mam jakiejś koncepcji.
Z góry dziękuję.

Pozdro.

Re: Przesyłanie danych z DAQ przez UDP

: 09 lip 2008 07:05
autor: Koza
Witam,

Z którym elementem w selekcji danych masz problem? Do przesyłania danych z kart możesz wykorzystać bloczek Flatten To String, którego wyjście łączysz z Concatenate String - w ten sposób masz ramkę: Opis + Dane. Jeżeli masz stały rozmiar pola Opis to do odczytania można wykorzystać bloczek String Subset (2 razy - raz dla danych, raz dla opisu). Należy pamiętać o rozmiarze danych: jeżeli ciąg będzie zbyt duży, może wystąpić błąd w odczycie. Wtedy dane należy podzielić na mniejsze paczki.

W załącznikach zrzuty. Zacząłem od przykładów z LabVIEW: UDP Receiver.vi i UDP Sender.vi

Pozdrawiam,
Koza

Re: Przesyłanie danych z DAQ przez UDP

: 18 lip 2008 18:54
autor: pawelb85
Próbowałem robić za twoim przykładem, ale nie czyta mi danych.
Wydaje mi się ze wszystko to przez ten bloczek flatten.

Niżej przedstawiam moje przykłady obu programów ,używam bloczka typa cast.

Pierwszy program wysyła próbki (jak widać są 4 kanały po 1000 próbek), na pierwszym rys. jest schemat blokowy, na drugim rys jest panel na którym znajduje się wykres i tabela z wysyłanymi danymi.

Drugi program czyta dane wysłane przez pierwszy program. Na 3 rys jest schemat blokowy, na 4 rys jest panel na którym znajduje sie wykres i tabela z otrzymanymi danymi.

Jak widac problemem jest to ze czytający program (2) czyta o wiele mniejszą liczbę próbek. Ponadto jak widac oba wykresy są inne. Co zrobic zeby ilosc próbek była taka sama, wykresy również takie same??

Mam jeszcze drugie pytanie: Jak zrobić taki uniwersalny program czytający, który będzie czytał różną liczbę próbek i kanałów, a następnie rozdzielał powstałą macierz na tyle macierzy ile mamy kanałów, każdy kanał z próbkami z tego kanału. Np. mamy 4 kanały po 1000 probek, to na wyjściu żeby były 4 macierze, każda po 1000 próbek, lub np. mamy 7 kanałów po 50 próbek, to analogicznie 7 macierzy po 50 próbek.

Bardzo proszę o pomoc, dziękuję z góry.
Pozdrawiam.

Przesyłanie danych z DAQ przez UDP

: 21 lip 2008 09:09
autor: Koza
Niezbyt precyzyjnie się wyraziłem: jeżeli paczka danych będzie większa od 548 bajtów to wtedy pojawią się problemy przy odczycie. Przy zapisie nie powinieneś przekraczać 8192 bajtów. Informacje te dostępne są w pomocy do LabVIEW (Detailed Help z Contex Help dla bloczków UDP Read i UDP Write).

Należy podzielić dane na mniejsze paczki i wtedy dopiero je przesłać.
Pozdrawiam,
Koza

EDIT: Polecam jeszcze zapoznać się z programem do obserwacji transmisji sieciowych. Ja korzystałem z Ethereala.

Przesyłanie danych z DAQ przez UDP

: 21 lip 2008 14:16
autor: vugie
Ethereal nazywa się teraz Wire Shark

Te 548 to chyba jakieś teoretyczne ograniczenie, bo ja z powodzeniem wysyłałem i odbierałem 1024.

UDP jest protokołem bez gwarancji dostarczenia. Jeżeli generuje się ramki często, to zupełnie normalnym zjawiskiem jest odbieranie mniejszej ich ilości, a często nawet w innej kolejności. Jeżeli zależy ci na używaniu UDP to musisz to ramek dodawać parę informacji typu czas, numer, wtedy będziesz przynajmniej wiedział, które się zgubiły i połączysz je we właściwy sposób.
Albo użyj TCP.

A Koza ma rację - użyj Flatten to String, bo Type Cast jest zależne od sprzętu, a poza tym łatwo stracić nad tym kontrolę

W diagramy nie wnikałem - zbyt poplątane

Re: Przesyłanie danych z DAQ przez UDP

: 23 lip 2008 09:42
autor: Koza
Przykładowe aplikacje w załączniku. Transmisja punkt - punkt, założenie: 2 kanały, po 1000 próbek (można to oczywiście zrobić dynamicznie, czyli pakiet np. o numerze FFFFFFFF i potem dane o formacie danych). Nie zaimplementowałem układania danych wg numerów pakietów, choć warto by było o tym pomyśleć.

@vugie: faktycznie, "ograniczenie" 548 pojawiło się w nowszych wersjach LabVIEW (w 8.2 i 8.5 jest). W LabVIEW 6.0 548 jest tylko wartością domyślną, nic nie napisano o ograniczeniu. Wg standardu maksymalną wartością jest 8192.

Pozdrawiam,
Koza

Re: Przesyłanie danych z DAQ przez UDP

: 03 paź 2008 07:02
autor: pawelb85
Zdecydowałem się jednak na użycie TCP, głównie z powodu niezawodności.
Serwer pobiera cały czas dane, wysyła je na inny komputer przez TCP. Wiem przynajmniej że otrzymuję wszystkie dane i są one w odpowiedniej kolejności. Wydaje mi się że jest to ważne np. gdy chę zrobić analizę FFT otrzymanych sygnałów, brak niektórych próbek, lub ich zła kolejność mogą doprowadzić do błędnych wniosków przy tej analizie.

Minusem jest tylko to że jest to komunikacja jedynie między dwoma komputerami , niestety coś za coś..:(

Czytałem trochę w tym temacie, ludzie piszą że są pewne przekłamania odnośnie UDP, więc myślę że jeśli chodzi o to by otrzymywać dokładne dane sposób ten nie jest najlepszy. Sam doświadczyłem jedynie problemu ograniczonych paczek, który pokazałem wyżej, jeśli chodzi o przekłamania w danych, to szczerze mówiąc może i są, ale nie zauważyłem tego za bardzo.

Najlepiej byłoby wysyłać próbki za pomocą TCP do kilku użytkowników.. Może jest jakaś sprytna metoda na to..

Pozdrawiam.