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