Biblioteka DLL z C#

Wszelkie sprawy związane z LabVIEW i komunikacją ze sprzętem. Problemy i ciekawe rozwiązania.
reipold
Posty: 7
Rejestracja: 03 lip 2012 19:20
Wersja środowiska: LabVIEW 2011

Biblioteka DLL z C#

Post autor: reipold » 03 lip 2012 19:34

Jak to w końcu jest z kompatybilnością biblioteki DLL, która została napisana pod VS2010 C# i skompilowana dla .NET Framework 4? Czy trzeba posiadać wersję jakoś specjalnie skompilowaną dla LabView? Jest to biblioteka DLL dla sterowników PLC2011A0 i PLC2011B0 . Czy ktoś z Was używał DLL-i od jakiegoś sprzętu w LabView i może się podzielić sugestiami?

Awatar użytkownika
Pitol
Moderator
Posty: 920
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 7 times

Biblioteka DLL z C#

Post autor: Pitol » 04 lip 2012 07:59

Witaj,

Wydaje mi się, że wystarczy aby dll'ka miała interfejs zdefinowany (czy jak to tam się nazywa, w C/C# biegły nie jestem), ale to chyba dla każdego języka musi mieć. Jedyne, o czym musisz wiedzieć, to definicja funkcji, ponieważ LabVIEW samo z siebie nie odczyta jakie parametry przyjmuje funkcja oraz co zwraca.

Kiedyś korzystałem z bibliotek dll dla jakiegoś oscyloskopu i nie było problemu z użyciem ich w LabVIEW. Na szczęście producent załączył definicje funkcji więc dalej to już było z górki.
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

Awatar użytkownika
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: Biblioteka DLL z C#

Post autor: vugie » 04 lip 2012 09:38

Pitol pisze:Wydaje mi się, że wystarczy aby dll'ka miała interfejs zdefinowany (czy jak to tam się nazywa, w C/C# biegły nie jestem), ale to chyba dla każdego języka musi mieć. Jedyne, o czym musisz wiedzieć, to definicja funkcji, ponieważ LabVIEW samo z siebie nie odczyta jakie parametry przyjmuje funkcja oraz co zwraca.
Odczyta. Jeżeli to jest dla .NET to nie używa się jej poprzez Call Library Function Node, tylko przez Invoke Node, potem RMB->Select Class->NET i wybieramy DLL-kę (która nazywana jest w takich przypadkach ".NET Assembly". Wcześniej trzeba użyć konstruktora odpowiedniej klasy z palety Connectivity->.NET

reipold
Posty: 7
Rejestracja: 03 lip 2012 19:20
Wersja środowiska: LabVIEW 2011

Re: Biblioteka DLL z C#

Post autor: reipold » 04 lip 2012 09:47

A spróbujcie, bo ja nie posiadam LabVIEW żeby sprawdzić.
Jeżeli trzeba to przekompiluję na jakąś wcześniejszą wersję Frameworku.
Załączniki
ELibrary.zip
(12.08 KiB) Pobrany 317 razy

Awatar użytkownika
Pitol
Moderator
Posty: 920
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 7 times

Re: Biblioteka DLL z C#

Post autor: Pitol » 04 lip 2012 10:25

Ja nie mogę, bo mam .NET w wersji 3.5. Jeśli przygotujesz inną wersję dll'ki to sprawdzę.
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

Awatar użytkownika
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Biblioteka DLL z C#

Post autor: vugie » 04 lip 2012 11:16

Mi raportuje "Not a .NET assembly", ale ja też mam tylko 3.5

Garreth
Posty: 74
Rejestracja: 28 gru 2011 14:13
Wersja środowiska: LabVIEW 2011

Biblioteka DLL z C#

Post autor: Garreth » 04 lip 2012 11:38

A u mnie coś takiego:
http://i.imgur.com/qAFCf.png
Ale chyba .NET mam w wersji 4, przynajmniej taka widnieje w spisie programów.

reipold
Posty: 7
Rejestracja: 03 lip 2012 19:20
Wersja środowiska: LabVIEW 2011

Re: Biblioteka DLL z C#

Post autor: reipold » 04 lip 2012 19:22

No dobra. Na ślepo przełączyłem Framework na 3.5. Wyczyściłem i zbudowałem od nowa. Jak teraz ?
Aha zrobiłem jak tutaj: http://www.erdosmiller.com/articles/lab ... gration-1/
Za wyjątkiem nazwy namespace, bo niby co sama nazwa miałaby wpływać na kod czy importowalność. Ale jeżeli będzie trzeba to zrobię kolejne pliczki.
Załączniki
ELibrary_3_5.zip
(12.03 KiB) Pobrany 319 razy

Awatar użytkownika
Pitol
Moderator
Posty: 920
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2015
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 7 times

Biblioteka DLL z C#

Post autor: Pitol » 04 lip 2012 21:34

U mnie działa, znaczy się mogę stworzyć konstruktor (ElClass, ElClass+AAA, ElClass+BBB) i jakieś naście funkcji jest dostępnych (w zależności, który konstruktor wybiorę).
ObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj

reipold
Posty: 7
Rejestracja: 03 lip 2012 19:20
Wersja środowiska: LabVIEW 2011

Re: Biblioteka DLL z C#

Post autor: reipold » 04 lip 2012 23:44

Pitol pisze:U mnie działa, znaczy się mogę stworzyć konstruktor (ElClass, ElClass+AAA, ElClass+BBB) i jakieś naście funkcji jest dostępnych (w zależności, który konstruktor wybiorę).
Miło słyszeć :-) W C# DLL i przykładowa aplikacja chodzą jak złoto.
Ten DLL jest do tych 2 urządzeń http://tanieogrzewanie.istore.pl/
Można czytać Dallasy DS18B20, robić regulacje temperatury, obsługiwać cały skomputeryzowany alarm i sterownik, przełączać przekaźniki, wysyłać dane RS-em i odbierać.
W tym DLL są też biblioteki kryptograficzne jest AES256 i SHA256 i znakowanie czasem. czas jest brany z lokalnego NTP np w firmie z serwera.
A z samego urządzenia można wykrzesać takie obwody http://www.elkom.com.tw/m/PLC2011A0_PLC ... rcuits.pdf i je zdalnie sterować lub w czasie rzeczywistym monitorować, nawet i 10x sekundę.

Jakby ktoś chciał sobie coś odpalić z tej biblioteki to powiem jak to działa w 3 słowach.
W DLL siedzi kryptografia do zabezpieczenia komunikacji, funkcje sterowników PLC i obsługa internetu/LAN-u
Żeby nie zwalać na użytkownika zbędnych programistycznych obowiązków cała pamięć współdzielona między DLL i aplikacją użytkownika jest alokowana w DLL.
Użytkownik tylko ma za zadanie GLOBALNIE stworzyć instancję klasy w taki sposób żeby instancjowania nie powtarzać.

Kod: Zaznacz cały

ELClass zdllki = new ELClass();  // możba zrobić nawet volatile ELClass zdllki = new ELClass(); 
Jak już to mamy to jednorazowo gdzieś po starcie programu lub jak chcemy wyzerować dane:

Kod: Zaznacz cały

zdllki .EL_init_memory_and_structure_A(); // tym wypełniamy strukturę urządzenia typu A zerami - inaczej się wywali wyjątkiem niezaalokowanej pamieci
zdllki .EL_init_memory_and_structure_B(); // tym wypełniamy strukturę urządzenia typu B zerami - inaczej się wywali wyjątkiem niezaalokowanej pamieci
I dalej posyłamy hasło do obróbki

Kod: Zaznacz cały

zdllki .EL_process_password("Jakieś hasło"); // po prostu wpisujemy kasło na stałę albo zmienną i gdzieś pole do wpisania
Po tym wykonało się hashowanie hasła algorytmem SHA256 i nastąpiła ekspansja klucza szyfrującego dla AES256. Z 32 bajtów hasha powstało 240 bajtów wyekspandowanego klucza szyfrującego.
Siedzi on we współdzielonej pamięci z naszą aplikacją więc instancji klasy nie wolno porzucać. Ona ma trwać globalnie. Te czynności robimy tylko raz. Możemy tylko wywoływać czyszczenie zmiennych przy zmianie urządzenia i jego adresu IP lub po każdym wpisaniu hasła od mowa.

Teraz w zdllki .input_key i zdllki.expanded_key mamy i hash i klucz do podpatrzebia. Nie jest to do niczego konieczne ale będzie widać czy pod LabVIEW to zadziała czy nie.

Dalej to tylko proste 3 funkcje na krzyż i dwie struktury z danymi z których czytamy i do których piszemy.

AAA i BBB, są zadeklarowane jako struct AAA STR_A i struct BBB STR_B ale to DLL sam zrobił. Nie dotykajcie się do tego. Instancję tych struktur zrobił DLL i oddał je jako publiczne jako współdzielona pamięć z aplikacją użytkownika.

Dalej tylko posyłamy pytanie w stylu "dawaj dane" musimy odczekać aż pakiet pójdzie i wróci i tylko przeczytać zawartość członków struktury.
Trzeba ślepo odczekać w sieci LAN ze 100ms, a w internecie 500-1000ms. Jest tam pewne ułatwienie ale o tym później. Na razie wysłac to co poniżej, odczekać sekundę i dopiero czytać dane.

Kod: Zaznacz cały

zdllki .EL_pool_command(
    (byte)'B',                                                     // Device type we send the command to
     0x01,                                                           // Unique command code for this particuar action
     "10.0.5.100",                                              // String IP Address of the relay ex: "10.0.5.100"
    27136,                                                          // Int UDP port of the relay ex: 27136
    1000,                                                           // Transmit timeout over the network in miliseconds
    1000,                                                           // Receive timeout from the network in miliseconds
    "Central European Standard Time"         // The name of the standard timezone where the relay is located
); 
Np odczyt temperatury 32 czujników DS18B20 w pętki lub pojedynczo

zdllki .STR_B.DS18TEMP - no po "i" odczytujemy kolejne floaty, albo konkretny jeden.

Wszystkie kosztowne operacje są wykonywane w wątkach. DLL sam zakłada wątki i z nich wychodzi po upłynięciu czasu lub jeżeli skończy więc nie powinno być zwały z zablokowaniem się procesora na 100% obciążenia.
Nie wiem czy jest timer w tym LabVIEW ? Jest ? Można na timerze zrobić co 500ms

To jest tak uproszczone żeby nie sprawiało kłopotu nikomu.

Mak ktoś chętkę to sprawdzić pod LabVIEW ? Dam nawet zdalny dostęp do PLC :-)

reipold
Posty: 7
Rejestracja: 03 lip 2012 19:20
Wersja środowiska: LabVIEW 2011

Re: Biblioteka DLL z C#

Post autor: reipold » 08 lip 2012 22:32

Jakieś wieści Panowie ? Ktoś próbował ten drugi DLL uruchomić?

ODPOWIEDZ