fbpx

Modbus - przemysłowy protokół komunikacji

Dawid Pawlak , 8 grudnia 2023

Modbus

Protokół Modbus stworzony przez firmę Modicon w 1979 roku, jest jednym z najstarszych protokołów komunikacyjnych w przemyśle. Jego otwarty charakter przyczynił się do szybkiego rozwoju i rozpowszechnienia się standardu, czyniąc go powszechnie używanym standardem komunikacji w przemyśle.  

Protokół  Modbus operuje na zasadzie modelu komunikacji master-slave (klient-serwer). Dzięki wykorzystaniu protokołu komunikacyjnego możliwa jest wymiana danych między różnymi sterownikami PLC, zdalnymi modułami I/O, przemiennikami częstotliwości i komputerami np. z systemem SCADA. Konfiguracja komunikacji zależy od środowiska w którym dane urządzenie jest programowane, bądź odbywa się za pomocą jego wbudowanego interfejsu. Spośród kilku wariantów protokołu, najczęściej stosowane są Modbus RTU (Remote Terminal Unit) korzystający ze standardu szeregowego, zazwyczaj RS-485 lub RS-232 oraz Modbus TCP/IP (Transmission Control Protocol), który operuje za pomocą ethernetu i protokołu TCP.

Protokół Modbus RTU

Modbus RTU jest tanim rozwiązaniem, gdyż wykorzystuje tylko jedną parę przewodów. Protokół umożliwia przesyłanie ośmiobitowych liczb, które są przesyłane w formie binarnej, zaś sama transmisja odbywa się w trybie Half-Duplex. Sieć ModBus RTU jest zbudowana w topologii magistrali szeregowej, zaś urządzenia w sieci pracują w modelu master-slave. Tylko urządzenie typu master może zainicjować wymianę danych, urządzenia typu slave mogą jedynie odpowiadać swojemu masterowi.

Specyfikacja sieci Modbus RTU

W jednej sieci Modbus RTU może funkcjonować tylko jedno urządzenie typu  master i do 247 urządzeń typu slave podległych pod mastera. W przypadku łączenia ponad 32 urządzeń należy zastosować odpowiednią ilość repeaterów, tak by na każdej linii sieci było maksymalnie 32 urządzenia.  Urządzenia typu slave są adresowane od 1 do 247. Ponadto funkcjonuje jeszcze adres broadcastu o numerze 0, służący do przesyłania pakietu do wszystkich urządzeń w sieci. 

Maksymalna prędkość transmisji wynosi 115.2 Kbps, zaś długość pojedynczej linii może osiągnąć długość nawet 1200m. Stosując repeatery można zwiększyć całkowitą długość infrastruktury. Podczas budowania sieci należy pamiętać, żeby na każdym urządzeniu ustawić te same parametry: prędkości transmisji, bitu parzystości, bitu stopu.

Z powodu zachodzących zjawisk falowych linia komunikacji musi być odpowiednio zakończona, inaczej dochodziłoby do odbicia sygnału. W tym celu dokonuje się zaterminowania linii poprzez połączenie linii przez rezystor o oporze 120 Ω (nazywany terminatorem). W przypadku linii narażonych na większe zakłócenia należy zastosować dwa rezystory po 60 Ω i kondensator o pojemności 220pF. Należy również zwrócić uwagę, czy urządzenie samo w sobie nie zawiera terminatora, którego można dołączyć do sieci przestawiając fizyczny przełącznik.

Specyfikacja ramki danych Modbus RTU

Dane w sieci Modbus RTU wysyłane są w sposób asynchroniczny, a ramka składa się z:

  • Adresu urządzenia slave (1 bajt);
  • Kod funkcji (1 bajt);
  • Dane ( max 252 bajty);
  • Suma kontrolna CRC (2 bajty).
Kody funkcji Modbus
0x01Odczyt wyjść bitowych
0x02Odczyt wejść bitowych
0x03Odczyt rejestrów
0x04Odczyt rejestrów wejściowych
0x05Zapis 1 bitu
0x06Zapis 1 rejestru
0x07Odczyt statusu urządzenia slave
0x08Test diagnostyczny
0x0FZapis bitów
0x10Zapis rejestrów
0x11Identyfikacja urządzenia slave

Protokół Modbus ASCII

Warto zaznaczyć, że istnieje także protokół Modbus ASCII, który działa na podobnej zasadzie co RTU, przy czym dane są przesyłane jako znaki ASCII kodowane heksadecymalnie. Niemniej jednak jest to protokół rzadziej spotykany. Komunikaty Modbus ASCII, choć są bardziej czytelne dzięki użyciu znaków ASCII, są też mniej wydajne i stosują mniej skuteczne sprawdzanie błędów przy użyciu sumy kontrolnej LRC.

Tryb ASCII wykorzystuje znaki ASCII do rozpoczęcia i zakończenia wiadomości, podczas gdy tryb RTU wykorzystuje przerwy czasowe (3,5 razy długość znaku) do kadrowania. Ponadto te dwa tryby są niekompatybilne, co oznacza, że urządzenie skonfigurowane do trybu ASCII nie jest w stanie komunikować się z urządzeniem korzystającym z protokołu RTU i odwrotnie. Komunikaty Modbus ASCII wymagają również dwukrotnie większej liczby bajtów do przesłania tej samej treści w porównaniu do komunikatów Modbus RTU.

Protokół Modbus TCP

W Modbusie TCP dane przesyłane są również w ramkach, które są już przesyłane po protokole TCP/IP. Transmisja odbywa się na porcie 502 przy wykorzystaniu architektury klient-serwer.
Zastosowanie sieci Ethernet z protokołem TCP pozwala na posiadanie wielu serwerów w ramach jednej sieci. Serwer jest tutaj odpowiednikiem master z Modbus RTU.

Specyfikacja sieci Modbus TCP

Adresem urządzenia w tym protokole jest jego IP. Pozwala to na łatwą integrację z innymi systemami działającymi na tym samym modelu sieciowym oraz umożliwia zdalne zarządzanie siecią. Serwer może się komunikować z kilkoma klientami równocześnie. Maksymalna prędkość transmisji wynosi 100Mbps, a odległość między urządzeniami może wynosić maksymalnie 100m. Sieć może być zbudowana w oparciu o różne topologie do maksymalnie 247 urządzeń typu serwer.

Specyfikacja ramki danych Modbus TCP

Ramka w tym protokole została zmodyfikowana względem Modbusa RTU, usunięty z niej został adres urządzenia i suma kontrolna CRC co wynika z faktu, że protokół TCP realizuje funkcję sprawdzania poprawności danych. Dodano natomiast 7 bajtowy nagłówek ramki (MBAP).

Ramka wygląda następująco:

  • identyfikator transmisji (2 bajty)
  • identyfikator protokołu (2 bajty)
  • długość danych (2 bajty)
  • identyfikator urządzenia (1 bajt)
  • kod funkcji (1 bajt)
  • dane (max 252 bajty)
Modyfikacja ramki Modbus RTU do TCP

Typy danych

W protokole Modbus dane mogą posiadać dwa typy: bit  liczba (dwubajtowe). W praktyce wartość bitowa jest wykorzystywana do włączania (wartość 1) i wyłączania (wartość 0) urządzeń oraz odczytywania ich statusu. 

Dane typu liczba są nazywane rejestrami i mogą reprezentować takie parametry jak:  prędkość silnika, czas hamowania, odczyt pomiaru temperatury. Czasami zachodzi potrzeba przechowywania liczb 32 i 64-bitowych, wtedy wykorzystuje się kolejne po sobie rejestry.

Adresacja

Bity i rejestry są zaadresowane od 1 do 9999. Adresy danych urządzenia oraz ich typ są ustalane przez producenta. W zależności od typu (bit/rejestr) i trybu dostępu (czy tylko do odczytu czy do zapisu) dodaje się do nich prefiks (liczbę 10000, 30000, 40000 w zależności od trybu) np. nr rejestru/bitu 2001, 12001, 32001, 42001 odnoszą się do tego samego adresu, ale w innym trybie.

Rejestry i bity w Modbus mają numerację od 1, natomiast w pamięci urządzenia adresacja zaczyna się od 0. Dlatego ważne jest uwzględnienie przesunięcia o +1 podczas przeliczania.

Typ danychTyp zapisuNr rejestru/ bituAdres danych
Bity wyjścioweodczyt i zapis1-99990x0 - 0x270E
Bity wejścioweodczyt 10001-199990x0 - 0x270E
Rejestry wejścioweodczyt30001-399990x0 - 0x270E
Rejestry pamiętająceodczyt i zapis40001-499990x0 - 0x270E

Biblioteki do komunikacji z Modbus

Komunikacja z Modbus przez Raspberry Pi 

Dzięki swojej popularności powstały biblioteki i rozwiązania, które pomagają zaimplementować na urządzeniach typu Raspberry Pi protokół komunikacyjny Modbus. Bardzo popularna jest biblioteka PyModbus dla języka Python, posiada ona pełną implementację protokołu Modbus i wspiera zarówno komunikację RS-485 (Modbus RTU) i Ethernet (Modbus TCP). Można zaimplementować zarówno klienta jak i serwer Modbus w wersji synchronicznej i asynchronicznej.

Wprowadzenie takiego rozwiązania pozwala na połączenie m.in.: sterownika PLC z dedykowanym rozwiązaniem systemu nadrzędnego oraz zbierania danych i kontrolę nad produkcją. Wystarczy zainstalować bibliotekę na np. Raspberry PI poprzez pip install pymodbus, a w kodzie stworzyć klienta z danymi w celu nawiązywania komunikacji. Następnie po nawiązaniu połączenia, można używać takich funkcji jak jak read_coils(), write_coils(). Tych samych funkcji można też używać do rejestrów w celu wymiany danych przez Modbus, wystarczy jako argument podać adres zmiennej i numer urządzenia.

Jeśli do wymiany danych używa się tylko Modbus RTU zaleca się zainstalowanie lżejszej biblioteki: MinimalModbus.

Raspberry Pi

Biblioteki do komunikacji z Modbus

JęzykNazwa bibliotekiLink do biblioteki
Pythonpymodbusgithub.com/pymodbus-dev/pymodbus
MinimalModbusgithub.com/pyhys/MinimalModbus
pyModbusTCPgithub.com/sourceperl/pyModbusTCP
Javajamodgithub.com/openhab/jamod
j2modgithub.com/steveohara/j2mod
C/C++libmodbusgithub.com/stephane/libmodbus
FreeModbuswww.embedded-experts.at/en/freemodbus/
C#Nmodbusgithub.com/NModbus/Nmodbus
JavaScript (NodeJS)modbus-serialgithub.com/yaacov/node-modbus-serial
jsmodbusgithub.com/Cloud-Automation/node-modbus

Podsumowanie

Protokół Modbus dzięki swojej stabilności i otwartości znajduje szerokie zastosowanie. Przepływ informacji w systemie ERP wykorzystującym ten protokół jest wysoce kompatybilny z wieloma urządzeniami, co pozwala na wszechstronną otwartość i poszukiwanie rozwiązań u różnych producentów. Modbus jest nie tylko wykorzystywany w automatyce przemysłowej, ale również w automatyce budynkowej do m.in.: integracji systemów klimatyzacji, systemów alarmowych i stacji pogodowych. 

Zazwyczaj prostsze urządzenia typu czujniki temperatury i wilgotności, czytniki RFID, mierniki energii, czy przemienniki częstotliwości posiadają możliwość komunikacji Modbus RTU, w związku z małymi rozmiarami hardwaru i niskim kosztem. Natomiast bardziej zaawansowane urządzenia typu sterowniki PLC, wyspy sygnałowe, panele HMI posiadają dodatkowo też Modbus TCP. Tak jak przedstawiono poniżej, Modbus RTU jest wykorzystywany do komunikacji z urządzeniami obiektowymi, natomiast Modbus TCP służy do zbierania i wizualizacji danych na serwerze poprzez system SCADA.

Sieć zbudowana w oparciu o Modbus TCP i RTU
Sieć przemysłowa zbudowana w oparciu o Modbus TCP i Modbus RTU
1