Przebieg laboratorium Celem laboratorium jest zapoznanie się z protokołem komunikacyjnym Modbus oraz nabycie umiejętności wykorzystania protokołu Modbus do odczytu i zapisu danych binarnych i analogowych zawartych w sterownikach programowalnych (SP) firm Siemens będących typowymi przedstawicielami przemysłowych urządzeń sterujących. Zadania do realizacji w domu: 0. Przetestować połączenie programu mod_rssim z oprogramowaniem Matlab lub programem RealTerm. Zapisać przykładowe ramki udanego połączenia w sprawozdaniu. Przetestować w domu polecenia z zadań do realizacji na laboratorium. Pomocne instrukcje znajdują się w sekcji Wykorzystanie programu RSSim i Matlaba/RealTerm do analizy ramek Modbus. (3 pkt) Zadania do realizacji na laboratorium: 1. Skonfigurować sterownik programowalny Siemens w celu obsługi protokołu MODBUS. Dokładne instrukcje znajdują się w akapicie Konfiguracja sterownika programowalnego Siemens. 2. Zestawić połączenie wykorzystujące transmisję sieciową TCP/IP pomiędzy sterownikiem programowalnym Siemens i środowiskiem MATLAB z wykorzystaniem skryptu definiującego ramkę MODBUS (sekcja Skrypt MATLAB do komunikacji z wykorzystaniem protokołu MODBUS). (1 pkt) 3. Opracować odpowiednie ramki komunikacyjne dla wymienionych zadań i zapisać je w sprawozdaniu: a) Zapalić jedną komendą wyjścia cyfrowe numer: [reszta z dzielenia liczby liter w nazwisku studenta przez 8], [reszta z dzielenia liczby liter w imieniu studenta przez 8] oraz [reszta z dzielenia roku urodzenia studenta przez 8]. (1 pkt) b) Aktywować przełącznikami losowe wejścia cyfrowe (co najmniej 2) i odczytać za pomocą jednej komendy wartość wszystkich wejść cyfrowych modułu. (1 pkt) c) Ustawić za pomocą potencjometru wartość [reszta z dzielenia liczby liter w nazwisku studenta przez 8] napięcia na wejściu analogowym SP i odczytać wartość tego wejścia. UWAGA. Numer rejestru do sprawdzenia przez Modbus jest równy połowie zadeklarowanego adresu w SP. Rejestry wejścia analogowego nazywane są także rejestrami wejściowymi. (1 pkt) d) Ustawić na wyjściu analogowym wartość napięcia równą [reszta z dzielenia liczby liter w imieniu studenta przez 8]. UWAGA. Nie należy zapisywać w rejestrze powiązanym z wyjściem analogowym wartości liczbowych większych niż 30000. Adres wyjścia analogowego to 0. (1 pkt) e) Zapisać jedną komendą 5 rejestrów serwera Modbus poczynając od [1 plus reszta z dzielenia liczby liter w imieniu studenta przez 5] i odczytać je z tablic obserwacji wartości rejestrów wcześniej zadeklarowanych i widocznych w programie TIA. (1 pkt) f) Aktywacja wyjścia cyfrowego numer [reszta z dzielenia roku urodzenia studenta przez 8] na stanowisku obok. (1 pkt) Wymagane czynności do wykonania przed zajęciami Wydrukowanie sprawozdania (druk DWUSTRONNY, jedna kartka). Wypełnienie tabeli w pierwszej sekcji sprawozdania. 1
Charakterystyka protokołu Modbus [2] Protokół komunikacyjny MODBUS jest definicją, opisem struktury komunikatów opracowaną przez firmę Modicon (obecnie Schneider Electric) w 1979 roku. Jest on wykorzystywany do ustanowienia komunikacji wg modelu masterslave/client-server pomiędzy urządzeniami. Stanowi de facto otwarty standard, i jest to najczęściej stosowany protokół sieciowy w środowisku przemysłowym. Został zaimplementowany przez setki producentów w tysiącach różnych urządzeń sterujących w celu transferu dyskretnych i analogowych wejść i wyjść oraz danych rejestrowych. Protokół MODBUS jest wspólnym językiem komunikacji wśród urządzeń różnych producentów. W raportach technicznych napotyka się na określenia "standard integracji urządzeń wielu producentów". W raportach przemysłowych można znaleźć udokumentowane ponad 7 milionów węzłów (urządzeń z zaimplementowanym protokołem) w Europie i USA. Po wielu latach rozwijania protokołu MODBUS firma Schneider przekazała pieczę nad tym zadaniem organizacji typu non-profit pod nazwą Modbus Organization. Protokół Modbus wykorzystujący transmisję szeregową Komunikacja pomiędzy urządzeniami odbywa się asynchronicznie, z wykorzystaniem interfejsu RS232 lub zgodnych RS422, RS-485. Protokół Modbus zajmuje trzy warstwy w modelu ISO/OSI: - warstwa 1 (fizyczna) definiuje w jaki sposób wysyłane i odbierane są sygnały, przy wykorzystaniu specyfikacji RS-232, RS-422 lub RS-485. - warstwa 2 (łącza danych) nadzoruje ruch w oparciu o protokół typu Master-Slave, wykorzystywane są ramki typu RTU lub ASCII. - warstwa 7 (aplikacji) określa w jaki sposób następuje komunikacja : klient-serwer. Tryby transmisji szeregowej Modbus Protokół Modbus Serial umożliwia komunikację za pomocą dwóch typów ramek: Tryb ASCII (znakowy) - Każdy bajt w wiadomości wysyłany jest w postaci dwóch znaków ASCII Rys.1. Ramka protokołu Modbus - tryb ASCII. Tryb RTU (binarny) - Pomiędzy ramkami wymagana jest przerwa trwająca co najmniej 3.5 x T, gdzie T czas trwania pojedynczego znaku. Dodatkowo odstępy pomiędzy kolejnymi znakami w jednej ramce nie mogą być większe niż 1.5 x T. Rys.2. Ramka protokołu Modbus - tryb RTU. 2
Szczegółowy opis ramki (na podstawie RTU). Adres adres urządzenia slave z którym ma nastąpić komunikacja, zakres od 1 do 247. Dodatkowo adres 0 wykorzystywany jest jako adres rozgłoszeniowy, wykorzystywany do komunikacji ze wszystkimi urządzeniami. Funkcja kod rozkazu, który określa konkretne polecenie żądane przez Mastera. Zakres funkcji zawiera się od 1 do 255. Kod Kod (hex) Opis 1 01h Odczyt wyjść bitowych 2 02h Odczyt wejść bitowych 3 03h Odczyt n rejestrów 4 04h Odczyt n rejestrów wejściowych 5 05h Zapis 1 bitu 6 06h Zapis 1 rejestru 7 07h Odczyt statusu urządzenia slave 8 08h Test diagnostyczny 15 0Fh Zapis n bitów 16 10h Zapis n rejestrów 17 11h Identyfikacja urządzenia slave 128-255 80h-FFh Zarezerwowane dla odpowiedzi błędnych Dane pole to zawiera dodatkowe dane potrzebne do wykonania polecenia przez urządzenie Slave. Mogą to być adresy rejestrów, liczba bajtów lub też inne dane. Przykładowo przy zapisie danych (kod funkcji 10h) wymagane jest podanie adresu rejestru początkowego, ilość rejestrów, ilość pozostałych bajtów w polu danych oraz dane przeznaczone do zapisu. Kontrola danych odbywa się w celu weryfikacji poprawności wysyłanych danych. W przypadku ramki RTU wykorzystywane jest CRC (Cyclical Redundancy Check), czyli 16 bitowe słowo kontrolne. CRC zajmuje 2 bajty i dołączane jest na końcu ramki. 3
Modbus TCP/IP RAMKA TCP RAMKA MODBUS PDU 2 Bajty 2 Bajty 2 Bajty 1 Bajt 1 Bajt Różnie Identyfikator transakcji Identyfikator protokołu Pole długości Identyfikator jednostki Kod funkcji Dane Rys.3. Ramka Modbus TCP/IP. Ramka podobna jak w trybie RTU, pozbawiona pola kontroli danych lecz rozszerzona o parametry: Identyfikator transakcji dwubajtowe pole identyfikujące zapytanie w celu powiązania z odpowiedzią. Najczęściej pozostawiane jako 0. Identyfikator protokołu dwubajtowe pole zarezerwowane dla przyszłych rozszerzeń. Aktualnie przyjmuje wartość 0. Pole długości dwubajtowe pole określające liczbę bajtów w komunikacie (wszystkie dane występujące po tym polu). Identyfikator jednostki jednobajtowe pole zastępujące adres urządzenia slave, służące do identyfikowania poszczególnych jednostek slave. Konfiguracja sterownika programowalnego Siemens. Aby była możliwa komunikacja (SP) z komputerem należy najpierw skonfigurować SP zgodnie instrukcją [Instrukcja S7-1200] Cz.1 - Pierwsze kroki (obowiązują podpunkty 1 do 4.1, program do implementacji na laboratorium w sterowniku znajduje się poniżej). UWAGA: Numery IP dla poszczególnych SP są opisane w materiałach znajdujących się na stanowiskach. W wypadku problemów z odnajdowaniem sterowników w sieci należy w Panelu Sterowania-> Menedżer urządzeń znaleźć kartę sieciową, a następnie wyłączyć ją i włączyć ponownie (opcja z menu prawego przycisku myszy). Po skonfigurowaniu SP oraz utworzeniu nowego projektu należy przygotować program w języku drabinkowym, umożliwiający komunikację komputera z SP wykorzystując protokół Modbus TCP. W tym celu należy w oknie Program blocks-> Main dodać blok funkcyjny MB_SERVER (przeciągając z paska u góry pusty kwadrat ze znakami zapytania na linie programu lub klikając na nie prawym przyciskiem myszy i dodając New Empty Box, nazwę bloku MB_SERVER następnie trzeba wpisać ręcznie). Będzie on odpowiadał za komunikację z wykorzystaniem protokołu Modbus TCP. Należy uzupełnić pola CONNECT_ID oraz MB_HOLD_REG. W pierwszym należy wpisać liczbę, która będzie identyfikatorem użytym w czasie połączenia. Standardowo można ustawić 1. W MB_HOLD_REG będą znajdowały się rejestry modyfikowane i odczytywane w czasie używania modbusowych funkcji. Aby zadeklarować obszar pamięci dla serwera Modbusa należy w zakładce Program blocks dodać nowy blok (Add new block). W otwartym oknie należy 4
kliknąć Data block, wybrać typ Global DB oraz zaznaczyć Standard compatible with S7-300/400 (patrz rysunek 4). Rys.4. Tworzenie bloku danych. Po utworzeniu bloku należy w nim ustawić odpowiednią strukturę rejestrów. Na potrzeby serwera należy zadeklarować 11 rejestrów typu WORD. Nie trzeba ustawiać pola Offset, zostanie ustawiony automatycznie w czasie kompilacji programu. Tylko czerwone znaki zapytania wymagają uzupełnienia, zielone i czarne zostaną uzupełnione w czasie kompilacji programu. Rys.5. Zadeklarowane rejestry. 5
Po zadeklarowaniu obszaru pamięci należy dodać do niego odwołanie w MB_HOLD_REG. Należy tam wpisać formułę wg wzoru P#[ID bloku pamięci].dbx0.0 WORD 11. W tym przykładzie jest to: P#DB1.DBX0.0 WORD 11 (patrz rysunek). ID bloku znajduje się w nawiasach kwadratowych obok jego nazwy. Rys.6. Deklarowanie obszaru pamięci dostępnego dla serwera Modbus. W ten sposób został przygotowany moduł odpowiedzialny za komunikację wykorzystującą protokół Modbus TCP. Należy jeszcze sprawdzić, które obszary pamięci są powiązane z analogowymi i cyfrowymi wejściami/wyjściami w SP. Aby to zrobić, należy przejść do zakładki Device configuration. W oknie z wizualizacją SP należy kliknąć na środkowy, kwadratowy panel sterownika. W tabeli poniżej pokażą się informacje związane z przydzielonymi rejestrami pamięci dla poszczególnych modułów wejść/wyjść. Należy odszukać moduły związane z wyjściami i wejściami cyfrowymi/analogowymi. W przykładzie (patrz rysunek 7) były to DI14/DQ10_1 (moduł wejść/wyjść cyfrowych), AI2_1 (moduł wejść analogowych) oraz AQ1 (moduł wyjścia analogowego). W kolumnach I Address oraz Q Address znajdują się przypisane im obszary pamięci sterownika. Należy je zapamiętać/zapisać. 6
Rys.7. Konfiguracja poszczególnych modułów. Kolejnym krokiem jest połączenie jednego z rejestrów serwera Modbusa z analogowym wyjściem, aby możliwe było sterowanie jego wartością. Najpierw należy zadeklarować odpowiednie tagi do rejestrów odnoszących się do wejść/wyjść. W zakładce PLC tags->show all tags należy dodać dwa nowe tagi np. input i output jak w przykładzie (patrz rysunek 8). Jako typ należy wybrać WORD zaś w adresie należy wpisać wcześniej sprawdzone adresy dla analogowych modułów wejść/wyjść. Należy wybrać odpowiedni typ rejestru (I lub Q) oraz określić rejestr (w tym przypadku były to I 64 dla wejść analogowych i Q 80 dla wyjścia). W tym przykładzie utworzono jeden tag input dla pierwszego z dwóch wejść analogowych oraz tag output dla jedynego wyjścia analogowego. W razie potrzeb można jeszcze zadeklarować tagi dla pozostałych wejść analogowych oraz wejść/wyjść cyfrowych, jednak nie jest to teraz konieczne. Rys.8. Deklarowanie tagów. 7
Po zadeklarowaniu tagów należy powiązać wyjście analogowe z serwerem Modbus. W tym celu dodano dwa bloki MOVE przed i po bloku MB_SERVER (patrz rysunek 9). W wejściu IN górnego bloku należy wpisać tag związany z analogowym wyjściem, w tym wypadku jest to output. W OUT należy wybrać pierwszy rejestr bloku pamięci zadeklarowanego dla serwera Modbus. W tym wypadku blok pamięci nazywa się Data_block_2, zaś pierwszy rejestr nosi nazwę MB, więc cały wpis to Data_block_2.MB. W czasie wpisywania nazwy bloku pamięci pojawi się lista dostępnych nazw, po wybraniu odpowiedniej pokaże się lista dostępnych w danym bloku pamięci rejestrów. Po wybraniu pierwszego rejestru pole powinno uzupełnić się automatycznie. Podobnie należy wpisać wartości w bloku MOVE pod MB_SERVER jednak trzeba zamienić miejscami wartości wpisywane do IN i OUT (rysunek 9). Rys.9. Dodawanie bloków MOVE. Pozostało utworzyć jeszcze tablicę do podglądania wartości poszczególnych rejestrów. W tym celu należy w zakładce Watch and force tables utworzyć nową tablicę i zadeklarować w niej rejestry do podglądu. W niej trzeba umieścić wszystkie rejestry bloku pamięci serwera Modbus oraz rejestry output i input (patrz rysunek 10). W polu Modify value można wpisywać wartości, które będą wymuszane na danych rejestrach. Monitor value podaje aktualną wartość rejestru. Jednak aby zapisać/odczytać rejestry należy wybrać odpowiednią opcję z menu, które pokaże się po kliknięciu prawym przyciskiem myszy w oknie. 8
Rys.10. Podgląd rejestrów. Należy teraz skompilować utworzony program, załadować do sterownika i uruchomić klikając odpowiednie przyciski w górnym menu. Kompilację i załadowanie można wykonać klikając prawym przyciskiem myszy na nazwę urządzenia w drzewku projektu i wybierając Compile lub Download. Klient Modbus w środowisku MATLAB. Zadaniem jest napisanie skryptu, pozwalającego na komunikację z wcześniej przygotowanym sterownikiem programowalnym z wykorzystaniem protokołu Modbus. Skrypt ma za zadanie wysyłać odpowiednio sformatowaną ramkę do SP oraz odebrać i wyświetlić od niego odpowiedź. Przydatne funkcje znajdują się w sekcji Przydatne informacje. Jako bazowy skrypt należy wykorzystać skrypt dołączony w materiałach. Bibliografia [1] MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3 - www.modbus.org [2] MODBUS FAQ - www.modbus.org [3] Instrukcja PSI Protokół Modbus 2012-2013, mgr inż. Paweł Ilczyszyn, mgr inż. Paweł Dobrowolski [4] http://www.simplymodbus.ca/faq.htm#modbus (z dnia 19.03.2014) 9
Przydatne informacje a) Komendy MATLAB. Poniżej znajdują się komendy przydatne do napisania skryptu wymaganego w punkcie 3.2. Po szczegółowe opisy należy sięgnąć do dokumentacji MATLAB. echotcpip tcpip fopen set(con,'timeout',.5); fwrite fread fclose Wł/wył echo serwer Tworzy obiekt tcp/ip Otwiera zadeklarowany strumień Ustawia czas oczekiwania na odpowiedź Zapisuje dane do strumienia Odczytuje dane ze strumienia Zamyka otwarty strumień b) Formaty PDU poszczególnych funkcji Modbus. Więcej informacji na http://www.simplymodbus.ca/faq.htm#modbus (z dnia 18.03.2014) 1) Odczyt wyjść bitowych funkcja 01h 10
2) Odczyt wejść cyfrowych funkcja 02h 3) Odczyt n rejestrów funkcja 03h 11
4) Odczyt n rejestrów wejściowych funkcja 04h 5) Zapis 1 bitu funkcja 05h 12
6) Zapis 1 rejestru funkcja 06h 7) zapis n bitów funkcja 0Fh 13
8) zapis n rejestrów funkcja 10h 14
Wykorzystanie programu RSSim i Matlaba do analizy ramek Modbus 1. Pobrać program mod_rssim ze strony http://www.plcsimulator.org/downloads w wersji 8.18, wypakować, uruchomić 2. Odblokować ruch sieciowy dla tego programu za pomocą deaktywacji firewalli 3. Uruchomić Matlaba i wybrać polecenie NewScript 4. Wpastować poniższy kod echotcpip('on',4012) t = tcpip('localhost',502); fopen(t) fwrite(t,uint8([0 0 0 0 0 6 1 6 0 1 0 234])) odpowiedz = fread(t, 10) fclose(t); delete(t) echotcpip('off') %Ramka MODBUS TCP/IP 5. Zapisać kod pod dowolną nazwą z rozszerzeniem *.m 6. Porozkładać okna na ekranie monitora tak, aby mieć jednoczesny podgląd na okno programu RSSim, CommandWindow Matlaba oraz okno edytora skryptów 7. Uruchomić kod poleceniem Run z edytora i obserwować efekt na RS Sim oraz odpowiedź w CommandWindow 8. W programie RSSim naciskając Comms otrzymamy zapis komunikacji 9. Modyfikować linię kodu z poleceniem fwrite tak, aby uzyskać różne polecenia Matlaba 15
Wykorzystanie programu RSSim i RealTerm do analizy ramek Modbus 1. Pobrać program mod_rssim ze strony http://www.plcsimulator.org/downloads w wersji 8.18, wypakować, uruchomić 2. Odblokować ruch sieciowy dla tego programu za pomocą deaktywacji firewalli 3. Pobrać program RealTerm ze strony http://realterm.sourceforge.net/index.html#downloads_download 4. Zainstalować i uruchomić program RealTerm. 5. W zakładce Display ustawić uint8. 6. W zakładce Port ustawić localhost:502 i kliknąć Open. Po prawej stronie powinien się zapalić na zielono Status Connected. 16
7. W zakładce Send wpisać ramkę MODBUS przykładowego polecenia - zapisu pierwszego rejestru wartością 234 : 0 0 0 0 0 6 1 6 0 1 0 234 8. Zaznaczyć pola w sekcji EOL: +CR, +LF oraz w sekcji \n pole After. 9. Kliknąć Send Numbers aby wysłać ramkę MODBUS do symulatora sterownika. 10. W głównej części terminala pokaże się odpowiedź symulatora. 17
Procedura tworzenia ramki MODBUS 1. Określić rodzaj polecenia jaki ma wykonać sterownik ( odczyt lub zapis, operacje na danych bitowych lub rejestrach). 2. Wyszukanie odpowiedniej funkcji z sekcji Przydatne informacje. 3. Rozpisanie ramki zgodnie ze specyfikacją standardu. Przykład: RAMKA TCP RAMKA MODBUS PDU 2 Bajty 2 Bajty 2 Bajty 1 Bajt 1 Bajt Różnie Identyfikator transakcji Identyfikator protokołu Pole długości Identyfikator jednostki Kod funkcji Dane Polecenie: zapisać w rejestrze numer 1 wartość 234. Zapis liczby w postaci 2 bajtów: pierwszy bajt reprezentuje krotność liczby 256, drugi resztę z dzielenia przez 256. Liczba 300 zapisana na 2 bajtach ma postać: 1 44 co oznacza 1 * 256 + 44. Pierwszy krok: Odszukać odpowiednią funkcję. W tym wypadku jest to funkcja 6. Drugi krok: Skomponować ramkę MODBUS PDU zapisując wszystkie jej pola zgodnie ze specyfikacją: a) Zapisanie pola Function Code o wartości 6 używając jednego bajtu: 6 b) Dopisanie pola Register Address o wartości 1 (rejestr numer 1) używając dwóch bajtów: 6 0 1 c) Dopisanie pola Register Value o wartości 234 (wartość rejestru) używając dwóch bajtów: 6 0 1 0 234 d) Postać ramki MODBUS PDU to 6 0 1 0 234. W zależności od numeru funkcji może być więcej pól do wypisania. 18
Trzeci krok: Skomponować resztę ramki MODBUS TCP/IP: a) Dopisanie pola Identyfikator jednostki przed ramką PDU, w przykładzie jest to 1 zapisane przy użyciu jednego bajta: 1 6 0 1 0 234 b) Dopisanie Pole długości przed składaną ramką. Pole długości oznacza ilość bajtów w polach po prawej stronie od niego. W tym wypadku jest to 6 zapisane przy użyciu dwóch bajtów: 0 6 1 6 0 1 0 234 c) Dopisanie pola Identyfikator protokołu przed składaną ramką. Wartość identyfikująca protokół, w wypadku dostępu do określonych pojedynczych urządzeń może być dowolna w zakresie liczby możliwej do zapisania na 2 bajtach. W przykładzie jest to 0: 0 0 0 6 1 6 0 1 0 234 d) Dopisanie pola Identyfikator transakcji przed składaną ramką. Wartość identyfikująca transakcję, w wypadku dostępu do określonych pojedynczych urządzeń może być dowolna w zakresie liczby możliwej do zapisania na 2 bajtach. W przykładzie jest to 0: 0 0 0 0 0 6 1 6 0 1 0 234 e) Kompletna ramka ma postać 0 0 0 0 0 6 1 6 0 1 0 234 19
Skrypt MATLAB do komunikacji z wykorzystaniem protokołu MODBUS Poniżej znajduje się skrypt do skopiowania do Matlaba. W wypadku błędów związanych z echotcpip należy wykonać ostatnią linią skryptu przed ponownym jego uruchomieniem. Ewentualne ostrzeżenia (Warning) można zignorować. Skrypt: echotcpip('on',502) t = tcpip('192.168.1.173',502); fopen(t); set(t,'timeout',.5); mod_function=uint8([3]) mod_message=uint8([0 0 0 3]); len=length([mod_function mod_message]); mess=[uint8(0) uint8(0) uint8(0) uint8(0) uint8(0) uint8(len+1) uint8(1) mod_function mod_message ] fwrite(t,mess) A = fread(t); A' fclose(t) echotcpip('off') 20