Rozdział III MODBUS Interfejs MODBUS został opracowany w firmie Modicon i stał się wkrótce standardem przyjętym przez większość znanych producentów sterowników przemysłowych dla asynchronicznej, znakowej wymiany informacji pomiędzy urządzeniami systemów pomiarowo-kontrolnych. O jego popularności i rozpowszechnieniu zadecydowały takie cechy,jak: prosta reguła dostępu do łącza oparta na zasadzie master-slave", " zabezpieczenie przesyłanych komunikatów przed błędami, " potwierdzanie wykonania rozkazów zdalnych i sygnalizacja błędów, " skuteczne mechanizmy zabezpieczające przed zawieszeniem systemu, wykorzystanie asynchronicznej transmisji znakowej zgodnej z RS-232C. 3.1. Transakcje w systemie MODBUS Kontrolery urządzeń pracujących w systemie MODBUS komunikują się ze sobą przy wykorzystaniu protokołu typu master-slave, w którym tylko jedno urządzenie mo\e inicjować transakcje (jednostka nadrzędna - master), a pozostałe (jednostki podrzędne - slave) odpowiadają jedynie na zdalne zapylania mastera. Transakcja składa się z polecenia (query) wysyłanego z jednostki master do slave oraz z odpowiedzi (response) przesyłanej z jednostki slave do master. Odpowiedz zawiera dane \ądane przez master lub potwierdzenie realizacji jego polecenia. Na rysunku 3.1 przedstawiono transakcję jako cykl polecenie - odpowiedz pomiędzy urządzeniem master i urządzeniem slavc. Master mo\e adresować indywidualnych odbiorców (jednostki slave) lub te\ przesyłać wiadomości rozgłoszeniowe" (broadcast), przeznaczone dla wszystkich urządzeń podrzędnych w systemie. Na polecenia rozgłoszeniowe jednostki slave nie przesyłają odpowiedzi. Protokół MODBUS określa format wiadomości przesyłanych z jednostki master do slave. Zawiera on adres odbiorcy, kod funkcji reprezentujący \ądane polecenie, dane oraz słowo kontrolne zabezpieczające przesyłaną wiadomość. Odpowiedz urządzenia slave wysyłana jest równie\ zgodnie z formatem zdefiniowanym w protokole MODBUS. Zawiera ona pole potwierdzenia realizacji rozkazu, dane \ądane przez master oraz słowo kontrolne zabezpieczające odpowiedz przed błędami. Je\eli urządzenie slave wykryje błąd przy odbiorze wiadomości, lub nie jest w stanie wykonać polecenia, przygotowuje specjalny komunikat o wystąpieniu błędu i przesyła go jako odpowiedz do mastera. Przy transmisji w trybie ASCII stosuje się zabezpieczenie części informacyjnej ramki kodem LRC (Longitudinal Redundancy Check). Format ramki w trybie ASCII przedstawiono na rysunku 3.2. Znacznikiem początku ramki jest znak dwukropka (":" - ASCII 3Ah). Dopuszczalnymi znakami dla pozostałych pól (za wyjątkiem znacznika końca ramki) są 0-9, Ah-Fh. Urządzenie po wykryciu znacznika początku ramki sprawdza, czy pole adresowe zawiera jego adres własny. Je\eli tak, to odczytuje zawartość pola funkcji i związana z nią zawartość pola danych. Część informacyjna ramki (bez znaku ":") zabezpiecza pole kontrolne LRC. Ramka kończy się przesłaniem dwóch znaków: CR i LF. Odstęp pomiędzy znakami tworzącymi ramkę nie mo\e przekraczać 1 s. Je\eli odstęp ten będzie większy od podanej wartości, urządzenie odbierające dane sygnalizuje błąd. 3.2.2. Ramka w trybie RTU W trybie RTU wiadomości rozpoczynają się odstępem czasowym trwającym minimum 3.5 x (czas trwania pojedynczego znaku), w którym panuje cisza na łączu. Najprostsza implementacja wymienionego interwału czasowego jest wielokrotne odmierzanie czasu trwania znaku przy zadanej szybkości bodowej przyjętej w łączu. Na rysunku 3.3 3.2. Ramka w systemie MODBUS przedstawiającym format ramki w trybie RTU, odstęp początkowy zaznaczono symbolicznie jako T1-T2-T3-T4, czyli równy czterem długościom znaku (jednostki informacyjnej). W systemie MODBUS wiadomości są zorganizowane w ramki o określonym początku i Pierwszym polem informacyjnym ramki jest adres urządzenia. końcu. Pozwala to urządzeniu odbierającemu na odrzucenie ramek niekompletnych i Dopuszczalnymi znakami transmitowanymi w ramach pól ramki są 0-9, A-F. Połączone sygnalizację związanych z tym błędów. Ze względu na mo\liwość pracy w jednym z w system urządzenia stale (łącznie z przedziałami ciszy) monitorują magistralę. Po dwóch ró\nych trybów transmisji (ASCII lub RTU), definiuje się dwie ramki. odebraniu zawartości pola adresu urządzenia sprawdzają, czy przesłany adres jest ich adresem własnym. Je\eli tak, to kontynuują interpretację pozostałych pól wchodzących w skład ramki. 3.2.1. Ramka w trybie ASCII W trybie ASCII, ka\dy bajt w wiadomości przesyłany jest w postaci dwóch znaków ASCII. Podstawowa zaleta tego trybu transmisji jest to, \e pozwala on na długie odstępy między znakami (do 1 s) bez powodowania błędów. Format znaku przesyłanego w trybie transmisji ASCII jest następujący: " system kodowania: heksadecymalny, znaki ASCII 0-9, A-F. Jeden znak heksadecymalny zawarty jest w ka\dym znaku ASCII wiadomości. " jednostka informacyjna: ograniczona znakami start (na początku) i stop (na końcu), 10-bitowa. Ramkę kończy przerwa czasowa trwająca conajmniej 3.5 x (długości znaku). Po tym Pole danych odstępie mo\na wysłać następna ramkę, traktując go jako jej przerwę początkowa. Cała ramka musi zostać przesłana w postaci ciągłej, tzn. odstęp pomiędzy kolejnymi znakami Pole danych tworzy zestaw dwucyfrowych liczb heksadccymalnych, o zakresie 00 - FF. tworzącymi ramkę nic mo\e być większy od 1.5 x (długości znaku). Je\eli odstęp ten Liczby te przy transmisji w trybie ASCII reprezentowane są dwoma znakami, a przy przekroczy podana wartość, to urządzenie odbierające uzna ramkę za niekompletno i transmisji w trybie RTU jednym. następny znak przyjmie za bajt pola adresowego kolejnej wiadomości. Podobnie, je\eli Pole danych ramki polecenia zawiera dodatkowe informacje potrzebne jednostce slave nowa wiadomość pojawi się na magistrali przed upływem koniecznej przerwy (3.5 x do wykonania rozkazu określonego kodem funkcji. Mogą to być adresy rejestrów, liczba (długość znaku)), to urządzenie odbierające potraktuje ja jako kontynuację poprzedniej bajtów w polu danych, dane itp. Na przykład, je\eli master \ąda odczytu grupy rejestrów wiadomości. To doprowadzi do błędu sumy kontrolnej, poniewa\ urządzenie odbierające (kod funkcji 03), pole danych zawiera nazwę (adres) rejestru początkowego oraz ilość będzie obliczać CRC dwóch wiadomości i porównywać go z CRC drugiej. rejestrów do odczytu. Przy operacji zapisu grupy rejestrów (kod funkcji l0h), na polu danych znajdują się następujące informacje: adres rejestru początkowego, ilość rejestrów, ilość pozostałych bajtów w polu danych, dane przeznaczone do zapisu. Je\eli nie wystąpi 3.23. Charakterystyka pól ramki Pole błąd, pole danych odpowiedzi zawiera \ądane informacje. Wykrycie błędu powoduje zapisanie przez jednostkę slave kodu błędu na polu danych ramki odpowiedzi, co umo\liwia adresowe adekwatna reakcję mastera. W niektórych ramkach polecenia pole danych mo\e posiadać zerowa długość. Tak jest Pole adresowe w ramce zawiera dwa znaki (w trybie ASCII) lub osiem bitów (w trybie zawsze w sytuacji, gdy operacja określona kodem funkcji nie wymaga \adnych parametrów. RTU). Zakres adresów jednostek slave wynosi 0 - 247. Master adresuje jednostkę slave umieszczając jej adres na polu adresowym ramki. Kiedy jednostka slave wysyła odpowiedz, Pole kontrolne umieszcza swój własny adres na polu adresowym ramki, co pozwala masterowi sprawdzić, z która jednostka realizowana jest transakcja. W standardzie MODBUS słowo kontrole zabezpieczające część informacyjna zale\y od Adres 0 jest wykorzystywany jako adres rozgłoszeniowy, rozpoznawany przez wszystkie zastosowanego trybu transmisji. jednostki slave podłączone do magistrali. W trybie ASCII pole kontrolne składa się z dwóch znaków ASCII, które są rezultatem obliczenia Longitudinal Redundancy Check (LRC) na zawartości części informacyjnej ramki Pole funkcji (bez znaczników początku i końca). Znaki LRC są dołączane do wiadomości jako ostatnie pole ramki, bezpośrednio przed znacznikiem końca (CR, LF). Pole funkcji w ramce zawiera dwa znaki w trybie ASCII łub osiem bitów w trybie RTU. W trybie RTU słowo kontrolne jest 16-bitowc i powstaje jako rezultat obliczenia Zakres kodów operacji 1 - 255. Cyclical Redundancy Check (CRC) na zawartości ramki. Pole kontrolne zajmuje dwa bajty Przy transmisji polecenia z jednostki master do slavc, pole funkcji zawiera kod rozkazu, dołączane na końcu ramki. Jako pierwszy przesyłany jest mniej znaczący bajt, jako ostani określający działanie, które ma podjąć jednostka slave na \ądanie mastera. Przykładowymi starszy bajt, który jest jednocześnie znakiem kończącym* ramkę. Zasady obliczania słów rozkazami mogą być: rozkaz odczytu zespołu rejestrów, odczyt statusu, zapis rejestrów w kontrolnych w obu trybach transmisji przedstawiono w punkcie Generacja LRC/CRC". jednostce slave, ładowanie, odczytywanie lub weryfikacja programu jednostki slave. Kiedy jednostka slavc odpowiada masterowi, pole funkcji wykorzystuje do potwierdzenia 3.3. Generacja słów zabezpieczających LRC i CRC 3.3.1. wykonania polecenia lub sygnalizacji błędu, je\eli z jakiś przyczyn nic mo\e wykonać rozkazu. Potwierdzenie pozytywne realizowane jest poprzez umieszczenie na polu funkcji kodu wykonanego rozkazu. W przypadku stwierdzenia błędu, jednostka slave umieszcza na Wyznaczanie LRC polu funkcji szczególna odpowiedz" (exccption response), która stanowi kod funkcji z Ośmiobitowa wartość LRC obliczana jest przez urządzenie nadające, które dołączają do ustawionym na 1 najstarszym bitem. Na przykład, plecenie (z mastera do jednostki slave) wiadomości i przesyła na końcu ramki w postaci dwóch znaków ASCII. Urządzenie odczytu zespołu rejestrów posiada kod funkcji 0000 0011 (03h). odbierające oblicza LRC podczas odbioru ramki i porównuje wyznaczona przez siebie Je\eli jednostka slave wykona rozkaz, w swojej odpowiedzi zwraca ta sama wartość na polu wartość ze słowem kontrolnym w ramce odebranej. Je\eli obie wartości są ró\ne, to znaczy funkcji. Je\eli wykryje błąd, zwróci 1000 0011 (83h). \e wystąpił błąd. Oprócz szczególnej odpowiedzi" sygnalizującej błąd, jednostka slave umieszcza kod błędu Obliczanie LRC polega na sumowaniu kolejnych 8-bitowych bajtów wiadomości, na polu danych ramki odpowiedzi. Pozwala to masterowi określić rodzaj lub powód błędu. odrzuceniu przeniesień i na koniec wyznaczeniu uzupełnienia dwójkowego wyniku. Program wykonywany przez jednostkę master jest odpowiedzialny za obsługę błędów. Sumowanie obejmuje całą wiadomość za wyjątkiem znaczników początku i końca ramki. Typowa reakcja na wystąpienie błędu jest powtórzenie ramki polecenia, odczyt informacji Poni\ej przedstawiono procedurę obliczania LRC zapisaną w języku C. statusowych umo\liwiających diagnostykę błędów, powiadomienie operatora. /*Funkcja lrcgen wyliczająca bajt kontrolny LRC, parametry funkcji:*/ /*fptr - wskaznik do bufora wiadomości, nb - ilość bajtów w buforze*/ char lrcgen (fptr,nb) /*funkcja zwraca jeden bajt*/ unsigned char *fptr; unsigned nb; { unsigned char lrc, sum = 0; while (nb--) sum += *fptr++; /*sumowanie kolejnych bajtów bez przeniesień*/ lrc = ~sum + 1; /*uzupełnienie do 2*/ return (lrc); } 3.3.2. Wyznaczanie CRC Słowo kontrolne CRC stanowi 16-bitowa wartość wyznaczana przez urządzenie nadające, które dołącza ja na końcu tamki w postaci dwóch 8-bitowych znaków. Urządzenie odbierające dokonuje analogicznego obliczenia podczas odbioru ramki i porównuje wyznaczona przez siebie wartość z odebranym słowem kontrolnym CRC. Je\eli obie wartości są ró\ne, to znaczy \e wystąpił błąd. Obliczanie CRC realizowane jest według następującego algorytmu: 1. Załadowanie FFFFh do 16-bitowego rejestru CRC. 2. Pobranie bajtu z bloku danych (zabezpieczana wiadomość) i wykonanie operacji EXOR z młodszym bajtem rejestru CRC (CRCLO). Umieszczenie rezultatu w rejestrze CRC. 3. Przesuniecie zawartości rejestru CRC w prawo o jeden bit połączone z wpisaniem 0 na najbardziej znaczący bit (MSB=0). 4. Sprawdzenie stanu najmłodszego bilu (LSB) w rejestrze CRC. Je\eli jego stan równa się 0, to następuje powrót do kroku 3 (kolejne przesunięcie), je\eli 1, to wykonywana jest operacja EXOR rejestru CRC ze stała A00lh. 5. Powtórzenie kroków 3 i 4 osiem razy, co odpowiada przetworzeniu całego bajtu (ośmiu bitów). 6. Powtórzenie sekwencji 2, 3,4, 5 dla kolejnego bajtu wiadomości. Kontynuacja tego procesu a\ do przetworzenia wszystkich bajtów wiadomości. 7. Zawartość CRC po wykonaniu wymienionych operacji jest poszukiwana wartością CRC. Zawartość rejestru CRC po realizacji przedstawionego algorytmu stanowi słowo kontrolne CRC, które dołączane jest na końcu ramki i przesyłane w dwóch bajtach (tryb RTU). Na rysunku 3.4 przedstawiono schemat blokowy procedury wyznaczania sumy kontrolnej CRC. Wyliczanie CRC jest stosunkowo zło\one i trwa długo, szczególnie przy du\ym rozmiarze zabezpieczanego pola informacyjnego. Istnieje jednak szybszy sposób wyznaczania słowa CRC, który polega na umieszczeniu wartości CRC w dwóch tablicach (256-elementowa tablica wartości CRCLO i 256-elementowa tablica wartości CRCHI) oraz określeniu wskazników do wspomnianych tablic na podstawie zawartości bloku danych. Prawdziwa trudność polega na właściwym przygotowaniu wspomnianych tablic, wyznaczenie wskazników realizowane jest przez prosty program, który wykonuje się w czasie znacznie krótszym ni\ procedura przedstawiona na rysunku 3.4. Przykład obliczania słowa kontrolnego CRC oparty na tablicach znalezć mo\na w [10]. Pole danych znaku mo\e być (opcjonalnie) zabezpieczone bitem kontroli parzystości lub 3.4. Format znaku przy transmisji szeregowej nieparzystości. Wspomniane wcześniej zabezpieczenie LRC lub CRC dotyczy całej treści ramki. Oba zabezpieczenia, tzn. zabezpieczenie znaku oraz całej ramki, generowane są przez W standardzie MODBUS znaki są przesyłane szeregowo od najmłodszego do urządzenie nadające i dołączane do wiadomości przed transmisjo. Urządzenie odbierające najstarszego bitu. sprawdza bit parzystości znaku (o ile występuje) oraz słowo kontrolne. Organizacja jednostki informacyjnej w trybie ASCII: " 1 bit startu, 3.5. Przerwanie transakcji " 7 bitów pola danych, jako pierwszy wysyłany jest najmniej znaczący bit, " 1 bit kontroli parzystości (nieparzystości) lub brak bitu kontroli parzystości, W jednostce master u\ytkownik ustawia wa\ny parametr jakim jest maksymalny czas I bit stopu przy kontroli parzystości lub 2 bity stopu przy braku kontroli odpowiedzi na ramkę zapytania", po którego przekroczeniu transakcja jest przerywana. Czas parzystości. ten dobiera się tak, aby ka\da jednostka slave pracująca w systemie (nawet ta najwolniejsza) zdą\yła normalnie odpowiedzieć na ramkę zapytania. Przekroczenie tego czasu świadczy Zasada wypracowywania bitu kontroli parzystości w jednostce informacyjnej jest zatem o błędzie i tak te\ jest traktowane przez jednostkę master. następująca: Je\eli jednostka slavc wykryje błąd transmisji, nie wykonuje polecenia oraz nie wysyła " Kontrola parzystości (even parity) - bit posiada wartość 1, je\eli ilość jedynek na \adnej odpowiedzi. Spowoduje to przekroczenie czasu oczekiwania na ramkę odpowiedzi i polu danych jest nieparzysta oraz 0, je\eli ilość jedynek jest parzysta. przerwanie transakcji. Program realizowany w jednostce master powinien w takiej sytuacji " Kontrola nieparzystości (odd parity) - bit posiada wartość 1, je\eli ilość jedynek na przejść do obsługi błędu. W szczególności przerwanie transakcji powoduje zaadresowanie polu danych jest parzysta oraz 0, je\eli ilość jedynek jest nieparzysta. nie istniejącego urządzenia slave. Organizacja jednostki informacyjnej w trybie RTU: " 1 bit startu, " 8 bitów pola danych, jako pierwszy wysyłany jest najmniej znaczący bit, 3.6. Funkcje w interfejsie MODBUS " 1 bit kontroli parzystości (nieparzystości) lub brak bitu kontroli parzystości, " 1 bit stopu przy kontroli parzystości lub 2 bity stopu przy braku kontroli parzystości. Producenci sterowników przemysłowych wyposa\onych w kontrolery interfejsu MODBUS opracowali dla wykonywanych przez siebie urządzeń wiele funkcji (rozkazów Na rysunku 3.5 przedstawiono format jednostki informacyjnej w trybie ASCII oraz RTU. zdalnych), których zadaniem jest realizacja wymiany danych pomiędzy jednostka master a urządzeniem slavc. Na rysunku 3.6 przedstawiono przykład funkcji umo\liwiającej zdalny odczyt grupy rejestrów wejściowych urządzenia slave o adresie 07h zdefiniowanej dla rodziny sterowników Modicon 384. W ramce polecenia znajduje się adres urządzenia slave (07h), do którego jest ono\ skierowane, kod funkcji (04h) oraz jej argumenty (adres rejestru początkowego 0003h oraz ilość rejestrów w grupie 0002h) znajdujące się na polu danych ramki. Na początku ramki odpowiedzi urządzenie slave umieszcza swój adres (07h), po którym następuje kod wykonanej funkcji (04h) oraz dane stanowiące zawartość odczytywanych rejestrów (08Clh, 5A3Bh). Podstawowymi funkcjami w interfejsie MODBUS są: " odczyt stanu wybranego wejścia dwustanowego, " odczyt stanu wybranego wyjścia dwustanowego, " odczyt zawartości grupy rejestrów, " ustawienie (ON/OFF) wybranego wyjścia dwustanowego, " ustawienie (ON/OFF) grupy wyjść dwustanowych, " zapis wartości początkowej do rejestru, zapis wartości początkowej do grupy rejestrów, " odczyt rejestru statusu urządzenia slave, " odczyt licznika komunikatów.