Skip to main content

Modbus to jeden z najstarszych i jednocześnie najpopularniejszych protokołów komunikacyjnych w automatyce przemysłowej. Stworzony w 1979 roku przez Modicon, do dziś jest standardem w tysiącach fabryk na całym świecie. A Python? Python potrafi mówić Modbusem. Dzięki bibliotece pymodbus możesz odczytywać dane ze sterowników PLC, czujników, falowników i innych urządzeń przemysłowych — wprost z poziomu laptopa.

W tym artykule pokażemy, czym jest Modbus, czym różni się TCP od RTU, jak zainstalować i skonfigurować bibliotekę pymodbus oraz jak napisać pierwszy skrypt odczytujący dane z PLC. Wszystko z praktycznymi przykładami kodu.

Czym jest Modbus i dlaczego warto go znać?

Modbus to protokół komunikacyjny typu master-slave (klient-serwer), który umożliwia wymianę danych między urządzeniami przemysłowymi. Jego największą zaletą jest prostota — Modbus definiuje zaledwie kilka typów operacji: odczyt rejestrów, zapis rejestrów, odczyt wejść cyfrowych i wyjść cyfrowych. Nie ma skomplikowanego handshake, nie wymaga certyfikatów ani licencji.

W praktyce Modbus jest używany wszędzie: od prostych czujników temperatury, przez falowniki i sterowniki PLC, po liczniki energii i stacje pogodowe. Jeżeli pracujesz w automatyce, prędzej czy później natkniesz się na urządzenie komunikujące się przez Modbus.

Modbus RTU vs Modbus TCP — czym się różnią?

Modbus występuje w dwóch głównych wariantach, które różnią się warstwą fizyczną i sposobem transmisji danych.

Modbus RTU działa na interfejsie szeregowym RS-485 lub RS-232. Dane są przesyłane w formacie binarnym, a każda ramka zawiera adres urządzenia, kod funkcji, dane i sumę kontrolną CRC. RTU jest szybki i niezawodny, ale wymaga fizycznego kabla szeregowego i konwertera USB-RS485.

Modbus TCP to ten sam protokół, ale opakowany w ramki TCP/IP. Zamiast kabla szeregowego używasz zwykłej sieci Ethernet — kablem RJ45 lub nawet przez Wi-Fi. Każde urządzenie ma swój adres IP, a komunikacja odbywa się na porcie 502. Modbus TCP jest wygodniejszy w konfiguracji i idealny do połączenia Pythona z PLC przez sieć lokalną.

CechaModbus RTUModbus TCP
Warstwa fizycznaRS-485 / RS-232Ethernet (TCP/IP)
Format danychBinarny + CRCTCP/IP + MBAP header
Port / MediumPort COM (szeregowy)Port 502 (Ethernet)
Prędkość9600–115200 baud10/100 Mbps
Zastosowanie z PythonemWymaga konwertera USB-RS485Bezpośrednio przez sieć LAN

Biblioteka pymodbus — Modbus w Pythonie

pymodbus to najpopularniejsza biblioteka Python do komunikacji Modbus. Obsługuje zarówno Modbus TCP, jak i RTU. Jest darmowa, open-source i aktywnie rozwijana. Instalacja zajmuje jedną linię w terminalu.

Terminal
pip install pymodbus

Po instalacji masz dostęp do klienta Modbus TCP i RTU, serwera (symulatora), narzędzi do konwersji danych oraz pełnej obsługi wszystkich kodów funkcji Modbus. Pymodbus działa na Windowsie, Linuxie i macOS.

Kody funkcji Modbus — co możesz odczytywać?

Modbus operuje na czterech typach danych, z których każdy ma przypisany kod funkcji. Zrozumienie tych typów jest kluczowe, żeby wiedzieć, której metody pymodbus użyć.

Typ danychKod funkcjiDostępMetoda pymodbus
Coils (wyjścia cyfrowe)01 / 05 / 15Odczyt / Zapisread_coils()
Discrete Inputs (wejścia)02Tylko odczytread_discrete_inputs()
Holding Registers03 / 06 / 16Odczyt / Zapisread_holding_registers()
Input Registers04Tylko odczytread_input_registers()

W praktyce najczęściej będziesz używać Holding Registers (kod 03) — to w nich sterowniki PLC przechowują wartości analogowe: temperatury, ciśnienia, prędkości, liczniki i inne dane procesowe.

Pierwszy skrypt — odczyt danych z PLC przez Modbus TCP

Czas na praktykę. Poniżej znajduje się kompletny skrypt, który łączy się z urządzeniem Modbus TCP i odczytuje 10 holding registers od adresu 0. To fundament, na którym zbudujesz bardziej zaawansowane rozwiązania.

odczyt_modbus.py
from pymodbus.client import ModbusTcpClient

# Konfiguracja połączenia
PLC_IP = "192.168.1.10"
PLC_PORT = 502

# Nawiązanie połączenia
client = ModbusTcpClient(PLC_IP, port=PLC_PORT)
client.connect()

# Odczyt 10 holding registers od adresu 0
result = client.read_holding_registers(
    address=0,
    count=10,
    slave=1
)

# Wyświetlenie wyników
if not result.isError():
    for i, val in enumerate(result.registers):
        print(f"Rejestr {i}: {val}")
else:
    print(f"Błąd: {result}")

# Zamknięcie połączenia
client.close()

Ten skrypt robi dokładnie to, co automatyk robiłby ręcznie w programie typu Modbus Poll — tylko automatycznie. Możesz go uruchomić cyklicznie, dodać zapis do pliku CSV, wysyłać alarmy mailem lub wyświetlać dane na dashboardzie.

Co robi każda linia kodu?

Linia 1: Importujemy klasę ModbusTcpClient z biblioteki pymodbus. To nasz klient Modbus TCP.

Linie 3–4: Ustawiamy adres IP sterownika PLC i port (standardowo 502 dla Modbus TCP).

Linia 7: Tworzymy obiekt klienta i nawiązujemy połączenie TCP z PLC.

Linie 10–14: Odczytujemy 10 holding registers, zaczynając od adresu 0. Parametr slave=1 to adres urządzenia Modbus (Unit ID).

Linie 17–21: Sprawdzamy, czy odczyt się powiódł i wyświetlamy wartości rejestrów. Jeśli wystąpił błąd — informujemy o tym użytkownika.

Monitoring w pętli — ciągły odczyt danych z PLC

Pojedynczy odczyt to dopiero początek. W rzeczywistym zastosowaniu chcesz monitorować dane ciągle — np. co sekundę odczytywać temperaturę i ciśnienie, reagować na przekroczenia i logować wyniki. Oto rozbudowany przykład z obsługą błędów:

monitoring_plc.py
import time
from pymodbus.client import ModbusTcpClient

client = ModbusTcpClient("192.168.1.10")

try:
    client.connect()
    print("Połączono z PLC!")

    while True:
        result = client.read_holding_registers(0, 4, slave=1)

        if not result.isError():
            temp = result.registers[0] / 10
            cisn = result.registers[1] / 100
            print(f"Temp: {temp}°C | Ciśnienie: {cisn} bar")

            if temp > 85.0:
                print("  ⚠ ALARM: Temperatura!")

        time.sleep(1)

except KeyboardInterrupt:
    print("Zatrzymano monitoring.")
finally:
    client.close()

Ten skrypt działa w nieskończonej pętli, co sekundę odczytując 4 rejestry z PLC. Rejestr 0 to temperatura (podzielona przez 10, bo PLC często przechowuje wartości pomnożone), rejestr 1 to ciśnienie. Gdy temperatura przekroczy 85°C — wyświetla alarm. Naciśnięcie Ctrl+C zatrzymuje monitoring i poprawnie zamyka połączenie.

A co z Modbus RTU? Komunikacja przez port szeregowy

Jeśli Twoje urządzenie komunikuje się przez RS-485, potrzebujesz konwertera USB-RS485 (kosztuje 30–80 zł) i drobnej zmiany w kodzie. Zamiast ModbusTcpClient używasz ModbusSerialClient:

modbus_rtu.py
from pymodbus.client import ModbusSerialClient

client = ModbusSerialClient(
    port="COM3",          # lub /dev/ttyUSB0 na Linux
    baudrate=9600,
    parity="N",
    stopbits=1,
    bytesize=8,
    timeout=3
)

client.connect()
result = client.read_holding_registers(0, 5, slave=1)
print(result.registers)
client.close()

Różnica to tylko konfiguracja połączenia — zamiast IP podajesz port COM i parametry transmisji szeregowej (baud rate, parity, stop bits). Reszta kodu jest identyczna. To ogromna zaleta pymodbus — jedna biblioteka, dwa protokoły.

Zapis do rejestrów Modbus

Modbus to nie tylko odczyt – możesz również zapisywać wartości do rejestrów PLC. Przydaje się to np. do zdalnego ustawiania parametrów produkcji, zmian setpointów czy włączania/wyłączania wyjść.

Do zapisu używamy funkcji write_register() (pojedynczy rejestr) lub write_registers() (wiele rejestrów naraz). Oto przykład:

zapis_modbus.py
from pymodbus.client import ModbusTcpClient

client = ModbusTcpClient('192.168.1.10', port=502)
client.connect()

# Zapis jednego rejestru (adres 100, wartość 1500)
client.write_register(100, 1500, slave=1)

# Zapis wielu rejestrów naraz
wartości = [100, 200, 300, 400]
client.write_registers(200, wartości, slave=1)

print("Zapisano wartości do PLC!")
client.close()

Uwaga: Zapis do rejestrów PLC zmienia realne parametry maszyny. Zawsze testuj skrypty najpierw na symulatorze, zanim podłączysz się do działającego systemu produkcyjnego.

Zapis danych Modbus do pliku CSV

Samo odczytywanie wartości z PLC to dopiero początek. W praktyce chcesz zapisywać dane do pliku, żeby później móc je analizować, tworzyć wykresy lub generować raporty. Najprostszym formatem jest CSV – otwońysz go w Excelu, Pythonie (pandas) czy dowolnym narzędziu BI.

modbus_do_csv.py
from pymodbus.client import ModbusTcpClient
import csv
from datetime import datetime
import time

client = ModbusTcpClient('192.168.1.10', port=502)
client.connect()

with open('dane_modbus.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Czas', 'Temperatura', 'Ciśnienie', 'Przepływ'])

    for i in range(100):
        result = client.read_holding_registers(0, 3, slave=1)
        if not result.isError():
            now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            writer.writerow([now] + result.registers)
        time.sleep(5)

client.close()
print("Dane zapisane do dane_modbus.csv")

Ten skrypt co 5 sekund odczytuje 3 rejestry z PLC i zapisuje je z timestampem do pliku CSV. Po zakończeniu masz gotowe dane do analizy – wystarczy otworzyć plik w Excelu lub załadować przez pandas.

Testowanie bez fizycznego PLC – symulator Modbus

Nie masz pod ręką sterownika PLC? Żaden problem. Możesz użyć symulatora Modbus, który udaje urządzenie slave na Twoim komputerze. Dzięki temu przetestujesz całą logikę swojego skryptu bez fizycznego sprzętu.

Popularne opcje to:

  • ModRSsim2 – darmowy symulator Modbus TCP/RTU dla Windows. Prosty interfejs, świetny na początek.
  • pymodbus server – możesz postawić symulator serwera Modbus bezpośrednio w Pythonie za pomocą biblioteki pymodbus.
  • diagslave – lekki symulator Modbus działający z linii komend (Linux, Windows).

Polecam zacząć od ModRSsim2 – wystarczy uruchomić, ustawić wartości w rejestrach i od razu możesz testować swoje skrypty Pythona na localhost (adres 127.0.0.1).

Gdzie nauczyć się Pythona w kontekście automatyki?

Jeśli chcesz opanować Pythona od podstaw z naciskiem na zastosowania w automatyce przemysłowej, sprawdź nasz kurs Python od podstaw. Omawiamy tam m.in. komunikację z PLC (Snap7, Modbus), przetwarzanie danych produkcyjnych, generowanie raportów i wiele praktycznych projektów.

Kurs jest skierowany do automatyków, programistów PLC i inżynierów utrzymania ruchu, którzy chcą rozszerzyć swoje kompetencje o programowanie w Pythonie – bez zbędnej teorii, z naciskiem na praktykę.

FAQ – często zadawane pytania

Czy pymodbus działa z każdym sterownikiem PLC?

Tak, pymodbus działa z każdym urządzeniem obsługującym protokół Modbus TCP lub RTU. Dotyczy to sterowników Siemens, Allen-Bradley, Schneider, ABB, Wago, Beckhoff i wielu innych. Warunek: PLC musi mieć włączony serwer Modbus (slave).

Czym się różni Modbus od OPC UA?

Modbus to prosty, lekki protokół oparty na rejestrach – łatwy do implementacji, ale bez wbudowanego szyfrowania czy struktury danych. OPC UA to nowoczesny standard z bogatym modelem informacyjnym, szyfrowaniem i mechanizmami bezpieczeństwa. W prostych projektach Modbus wystarczy w zupełności – OPC UA warto rozważyć przy większych systemach.

Jak odczytywać wartości zmiennoprzecinkowe (float) przez Modbus?

Wartości float (32-bit) zajmują 2 rejestry Modbus. Odczytujesz je jako parę rejestrów, a następnie konwertujesz za pomocą modułu struct w Pythonie. Ważna jest kolejność bajtów (byte order) – sprawdź w dokumentacji PLC, czy używa Big Endian czy Little Endian.

Czy mogę użyć Pythona do komunikacji Modbus na Raspberry Pi?

Oczywiście! Python z pymodbus działa świetnie na Raspberry Pi. Możesz podłączyć konwerter USB-RS485 do komunikacji RTU lub użyć portu Ethernet do Modbus TCP. Raspberry Pi to popularne rozwiązanie jako brama (gateway) między PLC a systemami nadrzędnymi.

Ile danych mogę odczytać w jednym zapytaniu Modbus?

W jednym zapytaniu możesz odczytać maksymalnie 125 rejestrów holding (250 bajtów) lub 2000 bitów coil/discrete. Jeśli potrzebujesz więcej danych, musisz podzielić odczyt na kilka zapytań. Pymodbus obsługuje to automatycznie – wystarczy odpowiednio skonfigurować parametry.

Podsumowanie

Python w połączeniu z biblioteką pymodbus to potężne narzędzie do komunikacji ze sterownikami PLC. Niezależnie od tego, czy pracujesz z Modbus TCP w sieci Ethernet, czy Modbus RTU po porcie szeregowym – Python daje Ci pełną kontrolę nad odczytem i zapisem rejestrów.

W tym artykule pokazałem Ci:

  • Czym jest Modbus i jakie są różnice między TCP a RTU
  • Jak zainstalować i skonfigurować pymodbus
  • Jak odczytywać i zapisywać rejestry PLC
  • Jak monitorować dane w pętli i zapisywać je do CSV
  • Jak testować skrypty bez fizycznego sprzętu

Kolejnym krokiem może być połączenie tych danych z bibliotekami do wizualizacji (matplotlib, Plotly) lub stworzenie dashboardu w Flask/Dash. Możliwości są praktycznie nieograniczone.

Jeśli chcesz systematycznie nauczyć się Pythona z naciskiem na automatykę – sprawdź nasz kurs Python od podstaw. Zaczynamy od zera i dochodzimy do zaawansowanych projektów z prawdziwymi sterownikami PLC.

O autorze

Szymon Adamek

Author Szymon Adamek

Automatyk, Dyrektor w ControlByte

Więcej postów tego autora Szymon Adamek