Páteční průmyslový protokol: Modbus — rámec, registry a past s 40001
Zdroj: Modbus Organization
Modbus vznikl v roce 1979 u Modiconu jako způsob, jak mluvit s PLC po dvoulince, a je to nejjednodušší průmyslový protokol, který se používá dodnes — nemá autentizaci, časová razítka ani typy dat. Právě proto se jím dá rozchodit cokoli, co má alespoň jeden registr. Čtyřicet pět let a pořád funguje.
Klíčová fakta
- PDU: funkce (1 B) + data (max. 253 B), stejné pro RTU, ASCII i TCP.
- RTU: adresa (1 B) + PDU + CRC-16. TCP: MBAP hlavička (7 B) + PDU, port 502.
- Adresy slave uzlů 1–247, 0 je broadcast, 248–255 rezervováno.
- RS-485: do 1200 m, 32 jednotek na segment, 120 Ω odpory na koncích.
- Bez autentizace, bez časových razítek, bez typů dat.
Kdo je kdo
Modbus má pro tutéž věc dvě jména. Sériová linka říká master a slave, aplikační vrstva a TCP říkají client a server.
| Role | Sériová linka | TCP / aplikace |
|---|---|---|
| ptá se, iniciuje transakci | master | client |
| odpovídá, vykoná akci | slave (adresa 1–247) | server |
| naslouchá na portu | — | server, port 502 |
Server tady není serverovna ani SCADA — je to zařízení, které odpovídá. Klidně měnič nebo teploměr. A PLC bývá client, když se ptá měniče.
Brána TCP/RTU dělá obojí: na síti vystupuje jako server na 502, na lince jako master. Unit ID (1 B) v MBAP je pozůstatek adresy z linky — u přímého spojení nemá co adresovat, smysl dostane až za bránou.
sequenceDiagram
participant C as Client (master)
participant G as Brána TCP/RTU
participant S as Server (slave)
C->>G: FC03, unit ID = 1, port 502
G->>S: FC03, adresa = 1
S->>G: data
G->>C: data
Struktura telegramu
RTU rámec pro čtení dvou holding registrů od adresy 0 (co odpovídá 40001):
| Bajt | Pole | Hodnota | Význam |
|---|---|---|---|
| 0 | Adresa | 0x01 | slave uzel 1 |
| 1 | Funkce | 0x03 | čtení holding registrů |
| 2–3 | Start addr | 0x0000 | offset 0 = 40001 |
| 4–5 | Počet | 0x0002 | dva registry |
| 6–7 | CRC-16 | dopočítá se | little-endian |
Když dorazí výjimka, je to nejlepší diagnostika: 0x02 znamená neplatnou adresu, tedy špatný offset — ne kabel.
Datový model
| Tabulka | Přístup | Funkce | Adresa v praxi |
|---|---|---|---|
| Coils | čtení/zápis | 01, 05, 15 | 00001–09999 |
| Discrete inputs | jen čtení | 02 | 10001–19999 |
| Input registers | jen čtení | 04 | 30001–39999 |
| Holding registers | čtení/zápis | 03, 06, 16 | 40001–49999 |
Klasická past: dokumentace výrobce píše 40001, protokol posílá offset 0. Obojí je správně, ale o jedničku vedle. Třicet let ztracených hodin v kompresorech.
Kdy to použít a kdy ne
| Modbus | |
|---|---|
| Použít | měření, energetika, měniče, jednoduché I/O |
| Nepoužít | deterministické cykly v ms, bezpečnostní funkce, cokoli za internetem |
| Pro koho | údržbu a integraci, kde výrobce nabízí „něco jako Modbus" |
Testování
from pymodbus.client import ModbusTcpClient
c = ModbusTcpClient("192.168.1.40", port=502)
c.connect()
print(c.read_holding_registers(address=0, count=4, slave=1).registers) # offset 0 = 40001
c.close()
Na sériové lince ModbusSerialClient(port="/dev/ttyUSB0", baudrate=19200, parity="N"),
pro rychlé sondování mbpoll a modpoll.
Pro údržbu: když zařízení po RS-485 neodpovídá, zkontrolujte v tomhle pořadí: přenosová rychlost a parita, adresa slave uzlu, záměna A/B na svorkovnici, zakončovací odpory. Teprve pak hledejte chybu v registrech.
Seriál Páteční průmyslový protokol vychází každý pátek. Další díl najdete v přehledu série.
Zdroje
- Modbus Application Protocol Specification V1.1b3 — Modbus Organization
- Modbus over Serial Line Specification V1.02 — Modbus Organization
Odkazy vedou na primární zdroje. Text článku je redakční shrnutí, ne převzatá zpráva.