Strona główna TECH .Net Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka Sharp7 (Snap7)

Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka Sharp7 (Snap7)

0
Biblioteki .Net do komunikacji ze sterownikami PLC Siemens – biblioteka Sharp7 (Snap7)

Witam w kolejnej odsłonie cyklu o bibliotekach do komunikacji ze sterownikami PLC Siemens Simatic.

Snap7 jest w chwili obecnej najbardziej znaną biblioteką do komunikacji ze sterownikami Siemens-a. Biblioteka ta wspiera (w różnych wersjach) wiele platform i wiele języków programowania. Znajdziemy więc porty dla C#, Javy, Pythona, Node.js itp. Istnieje nawet wersja dla systemów IoT i Arduino. Co ważne, wersje dedykowane w większości przypadków są napisane od zera w natywnej technologii (np. Settimino dla Arduino jest napisane wprost w Arduino C).

W tym poście zajmiemy się portem Snap7 w C# o nazwie Sharp7.

Jest to rozwiązanie bardzo fajne z kliku względów:
  • cała biblioteka to jeden plik .cs – bez żadnych dodatkowych zależności
  • działa zarówno z .Net jak i z Mono
  • jest kompatybilna z UWP.
  • działa również z Win 10 IoT
„Instalacji” tym razem nie przeprowadzimy za pomocą nuget-a. Wszystko co musimy zrobić to pobrać archiwum a następnie plik z biblioteką i dołączyć do naszego projektu.
Warto zwrócić tutaj jednak uwagę na kwestie licencjonowania. Wszystkie porty Snap7 oparte są na licencji LGPLv3. Jeżeli tworzymy więc oprogramowanie o otwartym źródle, lub oddajemy po prostu kod źródłowy klientowi to nie ma w zasadzie ma żadnego problemu. Natomiast tworząc rozwiązanie komercyjne o zamkniętym źródle warto zadbać o spełnienie wszystkich warunków licencji.

Jako że Sharp7 jest w 100% tożsamy z Snap7 mamy dostępną bardzo dobrą dokumentację do tej biblioteki. Wewnątrz pobranego archiwum z biblioteką znajdziemy obszerną dokumentację w pdf. Dokładnie tak jak w przypadku omawianej ostatnio s7netplus. W archiwum znajdziemy również sporo przykładów.

Podobnie, jak w przypadku poprzedniej biblioteki, za pomocą Sharp7 połączymy się bez problemu z całą gamą sterowników Simatic. Pamiętać należy jednak o właściwej parametryzacji Hardware sterownika, o której wspominałem w tym poście.

Nawiążmy więc połączenie ze sterownikiem. Metoda nawiązująca połączenie będzie bardzo podobna jak metoda dla opisywanego wcześniej s7netplus:
Zaczniemy od stworzenia obiektu klasy S7Client (w moim kodzie jest to zmienna prywatna w klasie odpowiedzialnej za komunikację)
_s7Plc = new S7Client();

Teraz nawiążemy połączenie:

var result = _s7Plc.ConnectTo(IpAddress, Rack, Slot);

Metoda ConnectTo zwróci nam liczbę całkowitą (int). W przypadku poprawnego połączenia powinniśmy otrzymać wartość 0. Jeżeli pojawi się kod błędu, to łatwo go rozszyfrujemy (np. aby zwrócić wyjątek z odpowiednim opisem) za pomocą metody ErrorText:

string message = = _s7Plc.ErrorText(result);

W Sharp7 najwygodniej realizuje się zapis i odczyt za pomocą metod operujących na tablicach bajtów (Dane w pamięci sterownika to przecież tak naprawdę taka tablica).

Dane z bloku DB przeczytamy za pomocą metody DBRead, zapiszemy zaś za pomocą DBWrite. W obu tych przypadkach metody te (podobnie jak metoda ConnectTo) zwracają nam liczbę całkowitą reprezentującą kod błędu, który w przypadku wartości innej niż 0 rozszyfrujemy podobnie jak w przypadku metody nawiązującej połączenie.

Dane przed zapisem do sterownika musimy odpowiednio skonwertować i umieścić w tablicy bajtów do zapisu. Podobnie po wykonaniu odczytu, musimy właściwe dane wyłuskać z tablicy bajtów i skonwertować do właściwego (.Net-owego) formatu.

Na szczęście w przestrzeni nazw S7 mamy szereg metod, które ułatwią nam mocno to zadanie.

Konwersja do formatu sterownika realizowana jest przez metody o nazwach Set[typ_zmiennej]At. I tutaj jako parametr podamy referencję do tabeli bajtów, która będziemy zapisywać, pozycję pierwszego bajtu w tabeli, oraz wartośc. Metoda uzupełni nam tabelę bajtów od wskazanego miejsca o odpowiednią ilość bajtów zawierających skonwertowaną wartość.

S7.SetIntAt(outBuffer, 0, (short)value);

Konwersja w drugą stronę realizowana jest przez metody o nazwach Get[typ_zmiennej]At. I tutaj jako parametr podamy referencję do tabeli z bajtami odczytanymi ze sterownika oraz numer bajtu, od którego zaczyna się nasza zmienna. Metoda zwróci nam już skonwertowaną wartość:

var value = S7.GetIntAt(_inBuffer, 0);

Listę dostępnych metod konwertujących znajdziemy w dokumentacji, albo wprost w kodzie źródłowym w pliku Sharp7.cs

Przykładowy kod z wykorzystaniem Sharp7 znajduje się oczywiście w mojej aplikacji testowej dostępnej na github.

Od siebie dodam tylko, że Sharp7 jest moją ulubioną biblioteką. Jest bardzo lekka. W projekcie mamy kod źródłowy, łatwo jest więc debugować ewentualne problemy. Ponieważ jest napisana w całości w C# może posłużyć jako fajny materiał do poznania komunikacji ze sterownikiem „od kuchni”. Nie robiłem nigdy co prawda porównań wydajnościowych pomiędzy bibliotekami, ale moje subiektywne wrażenie jest takie, że Sharp7 jest najszybszy z dostępnych obecnie rozwiązań.

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

ZOSTAW ODPOWIEDŹ

Proszę wpisać swój komentarz!
Proszę podać swoje imię tutaj