Katedra Inżynierii Systemów Sterowania WEiA PG Przemysłowe Sieci Informatyczne Laboratorium Instrukcja do ćwiczenia: Komunikacja z wykorzystaniem protokołu MODBUS Opracowali: Mgr inż. Tomasz Karla Dr inż. Jarosław Tarnawski na podstawie: [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) Zawartość 1. Cele laboratorium... 2 2. Charakterystyka protokołu Modbus [2]... 2 2.1 Protokół Modbus wykorzystujący transmisję szeregową... 2 2.1.1 Tryby transmisji szeregowej Modbus... 3 2.2. Modbus TCP/IP... 4 3. Zadania do wykonania... 4 3.1 Modbus RTU i Modbus Tester... 4 3.2 Konfiguracja sterownika programowalnego Siemens.... 5 3.3 Klient Modbus w środowisku MATLAB.... 9 3.4 Pętla sterowania z wykorzystaniem protokołu Modbus (opcjonalne)... 10 4. Przydatne informacje... 10 4.1 Komendy MATLAB.... 10 4.2 Formaty PDU poszczególnych funkcji Modbus.... 10 1
1. Cele 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 firm Siemens i GE Fanuc będących typowymi przedstawicielami przemysłowych urządzeń sterujących. W trakcie realizacji laboratorium należy wykonać następujące zadania: OBOWIĄZKOWE a) zestawić połączenie wykorzystujące transmisję szeregową pomiędzy sterownikiem programowalnym GeFanuc i programem MBus (Modbus Tester), dokonać odczytu wskazanych wejść binarnych i rejestrów, zapisać stan wyjść binarnych i rejestrów, przeanalizować i zanotować w sprawozdaniu strukturę ramki protokołu komunikacyjnego Modbus/RTU, b) zestawić połączenie wykorzystujące transmisję sieciową TCP/IP pomiędzy sterownikiem programowalnym Siemens i środowiskiem MATLAB za pomocą skryptu definiującego ramkę MODBUS, dokonać odczytu wskazanych wejść binarnych i rejestrów, zapisać stan wyjść binarnych i rejestrów, przeanalizować i zanotować strukturę ramki protokołu komunikacyjnego Modbus TCP, c) uzupełnić opracowany w zadaniu b) skrypt o funkcjonalność odczytu i zapisu danych ze sterowników wykorzystywanych przez innych Studentów (co najmniej dwa inne sterowniki) oraz sterownik i adresy rejestrów wskazane przez Prowadzącego zajęcia. OPCJONALNE d) zrealizować układ sterowania z modelem obiektu symulowanym w środowisku MATLAB i regulatora zaimplementowanego w sterowniku programowalnym z wykorzystaniem protokołu komunikacyjnego MODBUS. 2. 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. 2.1 Protokół Modbus wykorzystujący transmisję szeregową Komunikacja pomiędzy urządzeniami odbywa się asynchronicznie, z wykorzystaniem interfejsu RS232 lub zgodnych RS- 422, 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. 2
2.1.1 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. 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. protokołu Modbus - tryb RTU. 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 błędnych Dane pole to zawiera dodatkowe dane potrzebne do wykonania 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
2.2. 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. Modbus TCP/IP. 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 ą. 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. 3. Zadania do wykonania 3.1 Modbus RTU i Modbus Tester Należy nawiązać łączność ze sterownikiem programowalnym GeFanuc za pomocą programu Mbus (Modbus Tester), który powinien znajdować się na pulpicie. Pozwala on wysyłać do sterownika programowalnego (SP) wykorzystując protokół Modbus RTU oraz podglądać formaty ramek, zarówno wysyłanych jak i otrzymywanych. Każde stanowisko składa się z dwóch komputerów, na których zostały już przygotowane odpowiednie konfiguracje dla SP w oprogramowaniu Proficy (projekty o nazwie PSI MODBUS). Prowadzący wskaże, na których komputerach mają być uruchomione programy Mbus. W zakładce Modbus Settings należy ustawić odpowiednie parametry komunikacji poprzez port szeregowy (numer portu COM zależy od komputera, pozostałe parametry to standardowo 19.2 kbps, 8 bitów, ODD parity i 1 bit stopu). W zakładce View Data wybiera się komendy do wysłania do SP. Aby możliwe było łatwe zarejestrowanie ramek komunikacyjnych należy ustawić Scan rate na więcej niż 5 sekund a następnie wybrać odpowiednią komendę (w programie wybiera się typ rejestru na który chcemy wpłynąć, 0:Coils to wyjścia cyfrowe, 1: Input wejścia cyfrowe, 3: Input registers to wejścia analogowe zaś 4: Holding registers to rejestry pamięci SP). Po wyborze komendy należy przejść na zakładkę Communication Spy, połączyć się za sterownikiem i zarejestrować ramki komunikacyjne. Po udanej komunikacji najlepiej rozłączyć połączenie. W czasie ćwiczenia należy zarejestrować ramki następujących poleceń i ich : 1. Odczytanie wejścia cyfrowego numer [1 plus reszta z dzielenia liczby liter w nazwisku studenta przez 8 ], 2. Aktywacja wyjścia cyfrowego numer [1 plus reszta z dzielenia liczby liter w imieniu studenta przez 8], 3. Zapis wybraną wartością rejestru numer [1 plus reszta z dzielenia liczby liter w nazwisku studenta przez 8], 4. Odczyt wartości rejestru numer [1 plus reszta z dzielenia liczby liter w imieniu studenta przez 8] po wcześniejszym zapisaniu go wybraną wartością za pomocą oprogramowania Proficy. Ramki poleceń i ich zwrotne od SP należy umieścić w sprawozdaniu. 4
W przypadku sterowników firmy GE-Fanuc, występują następujące zależności pomiędzy obszarami pamięci, a kodowaniem danych w ramce: %Qxxxx numeracja od 0xxxx (np. %Q0001 00 000), %Ixxxx numeracja od 1xxxx (np. %I0001 10 000), %AIxxxx numeracja od 3xxxx (np. %AI0001 30 000), %Rxxxx numeracja 4xxxx (np. %R0001 40 000). 3.2 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. UWAGA: Numery IP dla poszczególnych SP są opisane w pliku E200.pdf. 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. 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 numer 3, 6 i 16. 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 kliknąć Data block, wybrać typ Global DB oraz zaznaczyć Standard compatible with S7-300/400 (patrz rysunek 4). Rys.4. Tworzenie bloku danych. 5
Po utworzeniu bloku należy w nim ustawić odpowiednią strukturę rejestrów. Na potrzeby serwera należy zadeklarować 11 rejestrów typu WORD. Rys.5. Zadeklarowane rejestry. 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). Rys.6. Deklarowanie obszaru pamięci dostępnego dla serwera Modbus. W ten sposób został przygotowany moduł alny 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. 6
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ć. 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. 7
Rys.8. Deklarowanie tagów. 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 i załadować do sterownika klikając odpowiednie przyciski w górnym menu. 3.3 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 rozdziale 4. tej instrukcji. Po opracowaniu skryptu należy wykonać zestaw następujących poleceń za pomocą odpowiednich ramek i funkcji protokołu Modbus: 1. 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]. W jakiej kolejności aktywują się wyjścia cyfrowe? 2. Aktywować przełącznikami losowe wejścia cyfrowe (co najmniej 2) i odczytać za pomocą jednej komendy wartość wszystkich wejść cyfrowych modułu. W jaki sposób interpretować odpowiedź serwera Modbus? 3. 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. 4. 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. 5. 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. 6. Aktywacja wyjścia cyfrowego numer [reszta z dzielenia roku urodzenia studenta przez 8] na stanowisku obok i odczyt rejestru numer [liczba liter w nazwisku studenta] na SP wskazanym przez prowadzącego. Należy zapisać ramki poszczególnych komend oraz serwera Modbus na kartce wraz z podziałem ramki na poszczególne części i ich ewentualną analizą. 9
3.4 Pętla sterowania z wykorzystaniem protokołu Modbus (opcjonalne). Należy zamodelować prosty obiekt sterowania np. inercję pierwszego rzędu. Następnie zaimplementować dla danego obiektu regulator w SP i zapewnić komunikację między obiektami z wykorzystaniem protokołu Modbus. 4. Przydatne informacje 4.1 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ń 4.2 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
SPRAWOZDANIE PSI 2 PROTOKÓŁ MODBUS Imię Nazwisko Data Godzina Liczba liter w imieniu (LLI) Reszta z dzielenia LLI przez 8 Liczba liter w nazwisku (LLN) Reszta z dzielenia LLN przez 8 Rok urodzenia (RU) Reszta z dzielenia RU przez 8 Reszta z dzielenia LLI przez 5 Poniżej należy umieścić zarejestrowane ramki i zaznaczyć ich podział na poszczególne części składowe. Ramki 3.1.1. Ramki 3.1.2. Ramki 3.1.3. Ramki 3.1.4. Ramki 3.3.1. 15
Ramki 3.3.2. Ramki 3.3.3. Ramki 3.3.4. Ramki 3.3.5. Ramki 3.3.6. 16