Obsługa DLL i wskaźnik do funkcji jako parametr

Wszelkie sprawy związane z LabVIEW i komunikacją ze sprzętem. Problemy i ciekawe rozwiązania.
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

Tworzę aplikację do pewnego stanowiska. Aplikacja będzie przeznaczona na komputer przemysłowy z zainstalowanymi kartami pomiarowymi. Do obsługi kart pomiarowych producent udostępnia biblioteki DLL i wszystko grało póki nie natrafiłem na przeszkodę-ścianę. Muszę obsłużyć kartę szybkich wejść analogowych APCI-3600. Aby ją zainicjalizować muszę podać wskaźnik do funkcji która wywoływać się będzie przy wystąpieniu przerwania. Tylko tak mogę odczytać bufor FIFO. Znalazłem taką wskazówkę na stronie ni.com ale nie za bardzo wiem jak go dokładnie zrealizować ? czy znalazłby się ktoś kto miał styczność z takim problemem ?
TMa
Posty: 203
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: TMa »

Miałem styczność. W skrócie wygląda to tak: Napisz wrapper dla DLL pod .NET w postaci biblioteki, który udostępnia rejestrację zdarzeń. Wtedy z poziomu LV rejestrujesz się na dane zdarzenie podając VI, który ma zostać wywołany przy obsłudze :) Przetestowane i działa z przepustowością kilkuset tysięcy kS/s.
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

No już nieco mi to rozjaśniło sprawę, jednak teraz pojawia się problem jak napisać ten wrapper. Czy to ma być inna DLL-ka napisana w innym środowisku która będzie wywoływać DLL docelową ? Proszę o wersją rozszerzoną tego rozwiązania :) A w ogóle to wszystko bym oddał za jakiś przykładowy VI do tego zagadnienia :D
TMa
Posty: 203
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017

Re: Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: TMa »

Przykłady znajdziesz tutaj (Help->Find Examples...-> Search -> Enter keyword: ".NET"):

%LabVIEW_Folder%\examples\comm\dotnet\Events.llb\NET Event Callback for DataWatcher.vi
%LabVIEW_Folder%\examples\comm\dotnet\Events.llb\NET Event Callback for Calendar Control.vi
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Re: Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

Czyli jako Event Source podpinam wejście na wskaźnik do DLL ?
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

Ponawiam prośbę o pomoc. Powyższy post był pomocny ale nie wiem dokładnie jak spiąć DLL z EventSource. Poza tym wywoływana funkcja przyjmuje argumenty w których podana jest np. wartość bufora. Pomoc będzie nieoceniona :)

-- EDIT --
http://forums.ni.com/t5/LabVIEW/LabView ... d-p/726883
Znalazłem coś takiego i sporo można z tego wyczytać. Czy ktoś może ocenić czy dobrze rozumuje ? Najpierw piszę wrapperową DLL-ke przez LabView. Wrapper ładuje docelową DLL i podaje wskaźnik do swojej funkcji. Gdy wystąpi przerwanie, Wrapper wywołuje GenerateLVEvent a to już można obsłużyć w LabView, czy tak ?
TMa
Posty: 203
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: TMa »

Po kolei czyli ustalmy fakty. Biblioteka do obsługi urządzania wymaga podania wskaźnika do funkcji. Funkcja ta będzie wywoływana gdy nastąpi przerwanie od przyjścia danych. W tej funkcji bedzie można odczytać dane i przesłać je dalej do przetwarzania. Będzie wywoływana asynchronicznie (w osobnym wątku) i operować na właściwościach dostarczonych na etapie jej inicjalizacji przez aplikację. To są fakty. Teraz przejdźmy do LabVIEW i .NET:)

W bibliotece .NET tworzysz sobie klasę, która z jednej strony podpina się pod funkcję z biblioteki C a z drugiej wywołuje zdarzenie na zarejestrowanych callback. W LabVIEW natomiast tworzysz sobie obiekt tej klasy (constructor node), rejestrujesz się na zdarzenie (Reg Event) i.... podajesz mu referencję do VI, który będzie wywoływany przy obsłudze zdarzenia pochodzącego od .NET czyli od biblioteki C. Jak wspominałem VI bedzie wywoływany w osobym wątku, więc potrzebne są mechanizmy asynchroniczego przesyłania danych między (np. popularne kolejki). Callback VI zaczyna być producentem danych, a osobny wątek konsumentem do pobierania przetwarzania/wyświetlania/logoania danych.
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Re: Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

I teraz pytania ? Jak utworzyć tą bibliotekę .NET ? Visual Studio ? Czy może jakieś narzędzie NI ?
bogdani
Administrator
Posty: 1315
Rejestracja: 30 lip 2003 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Ruda Śląska
Kontakt:

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: bogdani »

Witaj

Potrzebujesz LabVIEW Application Builder - w zależności od tego który pakiet LabVIEW poosiadasz, możesz to mieć lub nie.

Tu jest przykład stworzenia DLL
http://digital.ni.com/public.nsf/allkb/ ... E00043C1A7
Ktoś ci pomógł na forum? Podziękuj dając pochwałę.

Obrazek Obrazek Obrazek
TMa
Posty: 203
Rejestracja: 07 sty 2010 12:56
Wersja środowiska: LabVIEW 2017

Re: Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: TMa »

bogdani pisze:Potrzebujesz LabVIEW Application Builder - w zależności od tego który pakiet LabVIEW poosiadasz, możesz to mieć lub nie.
W podanym przeze mnie rozwiązaniu nie chodzi o stworzenie .NET assembly pod LabVIEW, ale stworzenie biblioteki .NET z kodu C#.
lycon5 pisze:I teraz pytania ? Jak utworzyć tą bibliotekę .NET ? Visual Studio ? Czy może jakieś narzędzie NI ?
Tak, Visual Studio jest odpowiednie. Zwróć uwagę na wersję .NET Framework podczas budowania biblioteki. Różne wersje LabVIEW obsługują różne wersje .NET. Podpowiedź znajdziesz tutaj
bogdani
Administrator
Posty: 1315
Rejestracja: 30 lip 2003 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Ruda Śląska
Kontakt:

Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: bogdani »

ups. niedoczytałem całego wątku :-)
Ktoś ci pomógł na forum? Podziękuj dając pochwałę.

Obrazek Obrazek Obrazek
lycon5
Posty: 6
Rejestracja: 26 paź 2014 17:30
Wersja środowiska: LabVIEW 2009

Re: Obsługa DLL i wskaźnik do funkcji jako parametr

Post autor: lycon5 »

Przepraszam za powrót do wątku po tak długim czasie ale wciąż z tym walczę. Jestem na etapie budowania wrappera. Korzystam z tego fajnego przykładu:
http://www.ni.com/example/26480/en/
Jednak nie mogę skompilować DLL. Wyrzuca mi: "Error 2 error LNK1104: cannot open file 'labview.lib' ". Upewniłem się i ten plik istnieje, a folder jest dodany do bibliotek projektu. Ktoś spotkał się z podobnym problemem ?
ODPOWIEDZ