PLC

Páteční průmyslový protokol: Modbus — rámec, registry a past s 40001

Zdroj: Modbus Organization

Grafika s označením Modbus a rámcovým diagramem MBAP
Ilustrace: redakce

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.

Modbus TCP — MBAP + PDU

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.

RoleSériová linkaTCP / aplikace
ptá se, iniciuje transakcimasterclient
odpovídá, vykoná akcislave (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
Kdo se ptá a kdo odpovídá — cesta přes bránu TCP/RTU

Struktura telegramu

RTU rámec pro čtení dvou holding registrů od adresy 0 (co odpovídá 40001):

BajtPoleHodnotaVýznam
0Adresa0x01slave uzel 1
1Funkce0x03čtení holding registrů
2–3Start addr0x0000offset 0 = 40001
4–5Počet0x0002dva registry
6–7CRC-16dopočítá selittle-endian

Když dorazí výjimka, je to nejlepší diagnostika: 0x02 znamená neplatnou adresu, tedy špatný offset — ne kabel.

Datový model

TabulkaPřístupFunkceAdresa v praxi
Coilsčtení/zápis01, 05, 1500001–09999
Discrete inputsjen čtení0210001–19999
Input registersjen čtení0430001–39999
Holding registersčtení/zápis03, 06, 1640001–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žítměření, energetika, měniče, jednoduché I/O
Nepoužítdeterministické 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

  1. Modbus Application Protocol Specification V1.1b3 — Modbus Organization
  2. 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.