Dzisiaj zajmiemy się trzecią, i jednocześnie ostatnią, z bibliotek które planowałem opisać w tej krótkiej serii. Będzie to DotNetSiemensPlcToolboxLibrary (uff – długa nazwa).
Dla mnie jest to tak naprawdę pierwsza .Net-owa biblioteka do komunikacji ze sterownikami Siemens-a, z którą się zetknąłem po klasycznym libnodave. Pełny kod źródłowy biblioteki znajdziemy tym razem również na github.
Mamu tutaj do czynienia, tak naprawdę, z bardzo rozbudowanym wrapperem na libnodave (w skompilowanym projekcie zawsze znajdziemy dll-kę lekko zmodyfikowanego libnodave).
DotNetSiemensPlcToolbox prezentuje nieco wyższy poziom abstrakcji, niż pozostałe biblioteki, gdzie operowaliśmy zakresami adresów w blokach, a następnie wyłuskiwaliśmy dane z odczytanej tablicy bajtów. Ewentualnie, jak w przypadku s7netplus, odczytywaliśmy pojedynczą zmienną podając jej adres w notacji sterownikowej. W tym przypadku mamy do czynienia z podejściem opartym o tzw. Tag-i. Pojęcie jest to z pewnością doskonale znane każdemu, kto miał do czynienia z systemami SCADA. Tag to nic innego jak po prostu pewna reprezentacja zmiennej, opisana jej adresem, nazwą i czasami różnymi innymi właściwościami.
Operujemy tutaj właśnie na pojedynczych tag-ach, lub na listach tagów. Wykonanie na takiej liście operacji odczytu zwróci nam wartość, wykonanie zaś zapisu ustawi odpowiednią wartość w sterowniku. Służy nam do tego obiekt klasy PLCTag.
W przypadku rzeczonej biblioteki nie jesteśmy niestety rozpieszczani dokumentacją, jak to miało miejsce w przypadku poprzednio opisywanych bibliotek. Za dokumentację musi nam w tym przypadku posłużyć duża liczba różnego rodzaju przykładów, które znajdziemy w repozytorium github.
Bibliotekę zainstalujemy do naszego projektu za pomocą Nuget-a:
Install-Package DotNetProjects.DotNetSiemensPLCToolBoxLibrary
Przy nawiązywaniu połączenia musimy ustawić tym razem więcej parametrów, podobnie jak robilibyśmy to w klasycznym libnodave. Na początek musimy utworzyć obiekt klasy PLCConnectionConfiguration i wypełnić odpowiednie parametry. Nazwy parametrów są bardzo intuicyjne, więc nie będę ich tutaj szczegółowo opisywał:
var cfg = new PLCConnectionConfiguration { CpuIP = ipAddress, Port = 102, CpuRack = rack, CpuSlot = slot, TimeoutIPConnect = TimeSpan.FromSeconds(5), Timeout = TimeSpan.FromSeconds(5), ConnectionType = LibNodaveConnectionTypes.ISO_over_TCP, ConnectionName = "S7_Connection", Routing = false, RoutingDestinationRack = 0, RoutingDestinationSlot = 0, RoutingDestination = String.Empty };
Następnie należy wywołać metodę SaveConfiguration obiektu klasy PLCConnectionConfiguration:
cfg.SaveConfiguration();
Do realizacji połączenia wykorzystamy obiekt klasy PLCConnection, któremu jako parametr przekażemy referencję do obiektu zawierającego konfigurację:
_plcConnection = new PLCConnection(cfg);
Połączenie nawiążemy za pomocą metody Connect, a o statusie połączenia poinformuje nas parametr Connected:
_plcConnection.Connect(); if (!_plcConnection.Connected) RaiseError(); else RaiseIsConnected();
Operacje zapisu i odczytu wykonamy wkorzystując metody WriteValue, lub ReadValue obiektu klasy PLCConnection – podając jako parametr pojedynczy obiekt klasy PLCTag. Lub odpowiednio WriteValues i ReadValues, które jako parametr przyjmują listę tagów (obiektów klasy PLCTag).
Obiekt możemy łatwo utworzyć podając jako parametr adres w notacji sterownikowej, oraz typ danych z enum-a TagDataType:
var tag = new PLCTag("DB10.DBX0.0", TagDataType.Bool) { Value = 1 };
W tym przypadku przypisałem też od razu wartość, gdyż jest to tag który chcę zapisać do sterownika.
W przypadku wywołania metody odczytu, zmienna value przyjmie wartość odczytaną ze sterownika, skonwertowaną już odpowiednio bazując na ustawionym podczas tworzenia obiektu typie tagu (enum TagDataType).
Dobrą praktyką jest nie grupowanie zmiennych pochodzących z różnych bloków (różnych przestrzeni pamięci, lub różnych bloków DB). Lepiej pogrupować zmienne z tego samego obszaru – zoptymalizujemy w ten sposób odczyt czy też zapis.
Przykładowy kod tradycyjnie do znalezienia na moim github.
Wszystkie posty w tym cyklu:
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – wstęp
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – protokół S7 i konfiguracja sterownika
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – projekty testowe
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka s7netplus
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka Sharp7 (Snap7)
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka DotNetSiemensPlcToolboxLibrary
Hej.
Ciekawe opisy. Zajmuję się właśnie prawie tym samym od lat i jakoś mało jest takich materiałów w sieci z pogranicza IT i cięższego przemysłu.
Która z opisywanych bibliotek najbardziej Ci pasuje?
Ja mam doświadczenia z libnodave w C++ i z jakimś wraperem na .net ale jakoś mi się nie podoba, jak działa to działa, ale miałem jakieś dziwne problemiki.
Obecnie mam w 3 projektach Shart7 i działa całkiem fajnie, szczególnie jak się nieco opakuje we własne interfejsy.
Co do SandwichBoxBot-a to fajny projekt ale przydałoby się sterowanie akcelerometrem w telefonie.
Zdecydowanie najbardziej lubię Sharp7 i też go opakowuję w różnego rodzaju interfejsy w zależności od projektu. Zapewnia minimum tego co niezbędne i łatwo się go debugguje. Ostatnimi czasy testowałem również trochę wersję Snap7 dedykowaną do Node.js. Planuję o tym też napisać post, tylko muszę się do niego przygotować.
Myślałem o akcelerometrze dla SandwichBoxBot-a, ale bałem się że się nie wyrobię do końca DSP2017. Po zakończeniu konkursu zająłem się innymi projektami. Może jeszcze do niego wrócę.
Pozdrawiam 🙂
Super strona!!
Dzięki takim osobom internet ma sens 🙂
Dzięki 🙂
Niesamowicie miło czytać taki komentarz 🙂