Modbus: Úvod do protokolu

Modbus je otevřený komunikační protokol na úrovni aplikační vrstvy ISO/OSI modelu, umožňující komunikaci typu klient – server na různých typech sítí a sběrnic. Aktuálně podporuje komunikaci na celé řadě médií jako je například Ethernet (s využitím TCP/IP), Optické a rádiové sítě, různé typy sériových linek (RS-232, RS 485, atd.). Komunikace probíhá metodou požadavek – odpověď a požadovaná funkce je určena za pomocí specifického kódu jenž je součástí požadavku. Tento protokol by vytvořen společností Modicon v roce 1979.

Příklady implementace protokolu Modbus

Příklady implementace protokolu Modbus

Obecný popis protokolu

Protokol definuje jasně danou strukturu zprávy na úrovni protokolu PDU (Protocol Data Unit) nezávisle na typu komunikační vrstvy. V závislosti na typu sítě na které je protokol použit je PDU rozšířena o další části a tvoří tak zprávu na aplikační vrstvě ADU (Application Data Unit).

Tvar Modbus zprávy

Tvar Modbus zprávy

Kód funkce říká serveru jaký druh operace má provést. Rozsah kódu je 1 až 255 kdy kódy 128 až 522 jsou vyhrazeny pro oznámení chyby. Některé kódy funkcí obsahují i kód podfunkce specifikují požadovanou operaci. Obsah datové části zprávy posílané klientem slouží serveru k uskutečnění operace. Obsahem může být například adresa a počet vstupů, které má server přečíst nebo hodnota, kterou má server zapsat do registrů. U některých operací datová část není za potřebí a tudíž může být zcela vynechána.

Pokud server operaci provedl úspěšně, odpoví klientovi zprávou která obsahuje kód funkce provedené operace čímž stvrdí úspěšné vykonání operace. V datové části odpovědi předá server klientovi požadovaná data (pokud existují).

Modbus transakce problěhla v pořádku

Modbus transakce problěhla v pořádku

Pokud při vykonávání požadované operace dojde k nějaké chybě, server vrátí kód požadované funkce s nastaveným nejvyšším bitem sdělujícím neúspěch. V datové části je vrácen chybový kód upřesňující důvod vzniklé chyby.

Modbus transakce problěhla s chybou

Modbus transakce problěhla s chybou

Kódování dat

Modbus využívá tzv. „Big-endian“ representaci dat. To znamená že při posílání datových položek delších než 1 byte je jako první posílán nejvyšší byte a jako poslední nejnižší byte.

Datový model

Datový model Modbusu je založen na ssadě tabulek s charakteristickým významem. Definovány jsou čtyři základní tabulky:

Tabulka Typ položky Přístup Popis Adresa
Diskrétní vstupy

(Discrete Inputs)

1 bit Pouze čtení Data poskytována I/O systémem 10000 – 19999
Cívky

(Coils)

1 bit Čtení / Zápis Data modifikována aplikačním programem 0 – 9999
Vstupní registry

(Input Registers)

16-bitové slovo Pouze čtení Data poskytována I/O systémem 30000 – 39999
Uchovávací registry

(Holding Registers)

16-bitové slovo Čtení / Zápis Data modifikována aplikačním programem 40000 – 49999

Mapování tabulek do adresního prostoru je závislé na konkrétním zařízení. Každá z tabulek může mít vlastní adresní prostor nebo se mohou částečně či úplně překrývat. Každá z tabulek může mít dle protokolu až 65536 položek. Z důvodu zpětné kompatibility bývá ale adresní prostor rozdělen na bloky o velikosti 10000 položek tak jak je uvedeno ve sloupci Adresa. Přístupná je každá položka jednotlivě nebo lze přistupovat ke skupině položek najednou. Velikost skupiny položek je omezena maximální velikostí datové části zprávy.

Adresovací model

Modbus přesně definuje adresovací pravidla ve zprávách (PDU):

V Modbus zprávách (PDU) jsou datové položky adresovány od 0 do 65535.

Také je definováno adresování v rámci datového modelu složeného ze 4 datových bloků:

V Modbus datovém modelu jsou položky v datových blocích číslovány o 1 do n.

Mapování položek datového modelu Modbusu do aplikace v serveru je zcela v režii výrobce.

Kódy základních funkcí

Kód Název funkce Popis
01 Read Coils Čtení jednoho nebo více bitů
02 Read Discrete Inputs Čtení jednoho nebo více bitů
03 Read Holding Registers Čtení jednoho nebo více 16bitových registrů
04 Read Input Registers Čtení jednoho nebo více 16bitových registrů
05 Write Single Coil Zápis jednoho bitu
06 Write Single Register Zápis jednoho 16bitového registru
15 Write Multiple Coils Zápis více bitů
16 Write Multiple Registers Zápis více 16bitových registrů

Implementace Modbusu

Modbus standard definuje kromě aplikační vrstvy ISO/OSI modelu i některé implementace protokolu na konkrétní typ sítě nebo sběrnice. Příkladem je Modbus na TCP/IP a Modbus na sériové lince.

Modbus na TCP/IP

Na obrázku je znázorněn formát Modbus zprávy na TCP/IP. Pro identifikaci Modbus ADU je použita MBAP hlavička.

Modbus TCP/IP

Modbus TCP/IP

Pro posílání Modbus ADU je vyhrazen registrovaný port 502.

Modbus na sériové lince

Protokol Modbus Seriál Line je typu Master-Slave a je definován na úrovni 2 ISO/OSI modelu. Na fyzické úrovni 0 ISO/OSI modelu můžou být použita různá sériová rozhraní, například RS-232 nebo RS-485 a jejich varianty.

Princip protokolu

Jedná se o Master/Slave protokol. V jeden okamžik může být na sběrnici pouze jeden master a 1 až 247 slave jednotek. Komunikaci vždy zahajuje master, slave nesmí nikdy vysílat data bez pověření mastera,

Master posílá požadavky slave jednotkám ve dvou režimech:

  • unicast režim – master adresuje požadavek jedné konkrétní jednotce a ta pošle odpověď.
  • bordcast režim – Master posílá požadavek všem jednotkám, žádná jednotka neodpoví.
Adresovací pravidla

Adresní prostor je 256 různých adres. Master nemá žádnou specifickou adresu, pouze slave jednotky musejí mít svojí unikátní adresu.

0 1 až 247 248 až 255
Broadcast adresa Adresy slave jednotek Rezervováno

Na obsázku 6 je vyobrazen základní formát Modbus zprávy na sériové lince. Zpráva kromě standartního PDU obsahuje také adresu jednotky. Toto pole obsahuje adresu slave jednotky. Pole kontrolní součet slouží k detekci chyb a obsahuje CRC nebo LRC kód v závislosti na vysílacím režimu.

Modbus Sériová linka

Modbus Sériová linka

Vysílací režimy

MODBUS protokol definuje dva sériové vysílací režimy, Modbus RTU a Modbus ASCII. Režim určuje, v jakém formátu jsou data vysílána, jak dekódována. Každá jednotka musí podporovat režim RTU, režim ASCII je nepovinný. Všechny jednotky na jedné sběrnici musejí pracovat ve stejném vysílacím režimu.

Modbus RTU

V režimu RTU obsahuje každý 8-bitový byte zprávy dva 4-bitové hexadecimální znaky. Vysílání zprávy musí být souvislé, mezery mezi znaky nesmějí být delší než 1.5 znaku. Začátek a konec zprávy je identifikován podle pomlky na sběrnici delší než 3.5 znaku.

Začátek Adresa Funkce Data CRC Konec
> 3.5 znaku 8 bitů 8 bitů N * 8 bitů 16 bitů > 3.5 znaku
Modbus ASCII

V režimu ASCII je každý 8-bitový byte posílán jako dvojice ASCII znaků. Oproti režimu RTU je tedy pomalejší, ale umožňuje vysílat znaky s mezerami až 1 s. Začátek a konec zprávy je totiž určen odlišně od RTU módu. Začátek zprávy je indikován znakem „:“ a konec zprávy dvojicí řídicích znaků CR, LF.

Začátek Adresa Funkce Data LRC Konec
Znak „:“ 2 znaky 2 znaky 0 až 2 * 252 znaků 2 znaky CR, LF

 

Lukáš Vlček

Autor je SW vývojář primárně se zaměřující na platformu .NET Framework/.NET Core. Avšak jiné moderní technologie mu nejsou cizí. Mezi jeho koníčky paří vedle sportu i amatérské "bastlení" s Arduinem a Raspberry Pi.