Přeskočit na obsah

Podrobný popis protokolu Modbus TCP s příklady příkazů

 

Kam poslat příkaz protokolu Modbus TCP?

V síti Ethernet je adresou zařízení jeho IP adresa. Zařízení jsou obvykle umístěna ve stejné podsíti, kde se adresy IP liší podle posledních číslic 192.168.1.20 při použití nejběžnější masky podsítě 255.255.255.0.

Rozhraní je síť Ethernet, protokol pro přenos dat je TCP/IP.

Používaný port TCP je: 502.

Popis protokolu Modbus TCP

Příkaz protokolu Modbus TCP se skládá z části zprávy protokolu Modbus RTU a speciální hlavičky.

Ze zprávy protokolu Modbus RTU se odstraňuje adresa SlaveID na začátku a kontrolní součet CRC na konci, čímž vznikne PDU, neboli protokolová datová jednotka.

Níže je uveden příklad požadavku protokolu Modbus RTU na získání hodnoty AI holdingových registrů z registrů od # 40108 do 40110 s adresou zařízení 17.

11 03 006B 0003 7687

11 Adresa zařízení SlaveID (17 = 11 hex)
03 Kód funkce Function Code (čtení analogových výstupních registrů - Analog Output Holding Registers)
006B Adresa prvního registru (40108-40001 = 107 = 6B hex)
0003 Počet požadovaných registrů (čtení 3 registrů od 40108 do 40110)
7687 Kontrolní součet CRC

Vynecháme adresu SlaveID a kontrolní součet CRC a získáme PDU: 03 006B 0003

03 006B 0003

Na začátek přijaté zprávy PDU se přidá nová 7bajtová hlavička, tzv. MBAP Header (Modbus Application Header), která obsahuje následující data: 

Identifikátor transakce (Transaction Identifier): Zařízení Master nastaví 2 bajty, aby každý požadavek jednoznačně identifikoval. Mohou být libovolné. Tyto bajty jsou v odezvě opakovány zařízením Slave, protože odezvy zařízení Slave nemusí být vždy přijímány ve stejném pořadí jako požadavky.

Identifikátor protokolu (Protocol Identifier): Zařízení Master nastaví 2 bajty, vždy to budou 00 00, což odpovídá protokolu Modbus.

Délka (Length): Zařízení Master nastaví 2 bajty a identifikuje počet bajtů v následující zprávě. Počítá se od Unit Identifier do konce zprávy.

Identifikátor jednotky nebo adresa zařízení (Unit Identifier): Zařízení Master nastaví 1 bajt. Opakuje se zařízením Slave, aby bylo možné zařízení Slave jednoznačně identifikovat.

Celkově dostaneme:

Modbus RTU Slave ID Inquiry CRC
Modbus RTU 11 03 006B 0003 7687
Modbus TCP 0001 0000 0006 11 03 006B 0003
Modbus TCP MBAP Header PDU
Modbus TCP ADU (Application Data Unit – aplikační datová jednotka)

Kde:

0001 Identifikátor transakce Transaction Identifier
0000 Identifikátor protokolu  Protocol Identifier
0006 Délka (následuje 6 bajtů) Message Length
11 Adresa zařízení (17 = 11 hex) Unit Identifier
03 Kód funkce (čtení analogových výstupních registrů) Function Code
006B Adresa prvního registru (107 = 40108-40001 = 6B hex) Data Address of the first register
0003 Počet požadovaných registrů (čtení 3 registrů od 40108 do 40110) The total number of registers

 

 Jako odpověď od zařízení Slave protokolu Modbus TCP získáme:

0001 0000 0009 11 03 06 022B 0064 007F

Kde:

0001 Identifikátor transakce Transaction Identifier
0000 Identifikátor protokolu Protocol Identifier
0009 Délka (následuje 9 bajtů) Message Length
11 Adresa zařízení (17 = 11 hex) Unit Identifier
03 Kód funkce (čtení analogových výstupních registrů) Function Code
06 Počet následujících bajtů (následuje 6 bajtů) Byte Count
02 Hodnota horní části registru (02 hex) Register value Hi (AO0)
2B Hodnota předčasného vyprázdnění registru (2B hex) Register value Lo (AO0)
00 Hodnota horní části registru (00 hex) Register value Hi (AO1)
64 Hodnota dolní části registru (64 hex) Register value Lo (AO1)
00 Hodnota horní části registru (00 hex) Register value Hi (AO2)
7F Hodnota předčasného vyprázdnění registru (7F hex) Register value Lo (AO2)

Registr analogového výstupu AO0 má hodnotu 02 2B HEX, neboli 555 v desítkové soustavě.

Registr analogového výstupu AO1 má hodnotu 00 64 HEX, neboli 100 v desítkové soustavě.

Registr analogového výstupu AO2 má hodnotu 00 7F HEX, neboli 127 v desítkové soustavě.

Typy příkazů protokolu Modbus TCP

Níže je uvedena tabulka s kódy pro čtení z registrů a zapisování do registrů protokolu Modbus TCP.

Kód funkce Co funkce dělá Typ hodnoty Typ přístupu
01 (0x01) Čtení DO Read Coil Status Diskrétní Čtení
02 (0x02) Čtení DI Read Input Status Diskrétní Čtení
03 (0x03) Čtení AO Read Holding Registers 16bitová Čtení
04 (0x04) Čtení AI Read Input Registers 16bitová Čtení
05 (0x05) Zápis jednoho DO Force Single Coil Diskrétní Zápis
06 (0x06) Zápis jednoho AO Preset Single Register 16bitová Zápis
15 (0x0F) Zápis více DO Force Multiple Coils Diskrétní Zápis
16 (0x10) Zápis více AO Preset Multiple Registers 16bitová Zápis

 

Jak poslat příkaz protokolu Modbus TCP ke čtení diskrétního výstupu? Příkaz 0x01

Tento příkaz se používá ke čtení hodnot digitálních výstupů DO.

V požadavku PDU je uvedena počáteční adresa prvního registru DO a následný počet požadovaných hodnot DO. Hodnoty DO jsou v PDU adresovány počínaje nulou.

Hodnoty DO v odpovědi jsou v jednom bajtu a odpovídají hodnotě bitů.

Tento příkaz slouží ke čtení hodnot diskrétních DO výstupů.
Požadavek PDU specifikuje počáteční adresu prvního registru DO a následující počet požadovaných hodnot DO. V PDU jsou hodnoty DO adresovány od nuly.
Hodnoty DO v odezvě jsou v jednom bajtu a odpovídají hodnotě bitů.

Hodnoty bitů jsou definovány jako 1 = ZAPNUTO a 0 = VYPNUTO.

Dolní bit prvního datového bajtu obsahuje hodnotu DO, jehož adresa byla uvedena v požadavku. Zbývající hodnoty DO následují v rostoucích hodnotách až k nejvyšší hodnotě bajtu zprava doleva.

Pokud bylo požadováno méně než osm hodnot DO, zbývající bity v odpovědi budou vyplněny nulami (ve směru od dolního k hornímu bajtu). Číslo v poli Počet bajtů pak dále určuje počet plných datových bajtů v odpovědi.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 04
01 Adresa zařízení 01 Adresa zařízení
01 Kód funkce 01 Kód funkce
00 Adresa prvního bajtu horní části registru 01 Počet následujících bajtů
00 Adresa prvního bajtu dolní části registru 02 Hodnota registru DO 0-1
00 Horní bajt počtu registrů
02 Dolní bajt počtu registrů

Stavy výstupu DO0-1 jsou uvedeny jako hodnoty 02 hex, neboli v binární soustavě 0000 0010.

Hodnota DO1 bude druhá zprava a DO0 bude první zprava (nejnižší bit).

Ostatních šest bitů je vyplněno nulami do celého bajtu, protože nejsou požadované.

Kanály - - - - - - DO 1 DO 0
Bity 0 0 0 0 0 0 1 0
Hex 02

Jak poslat příkaz protokolu Modbus TCP ke čtení digitálního vstupu? Příkaz 0x02

Tento příkaz se používá ke čtení hodnot digitálních vstupů DI.

Dotaz a odpověď pro DI jsou podobné jako dotaz pro DO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 04
01 Adresa zařízení 01 Adresa zařízení
02 Kód funkce 02 Kód funkce
00 Adresa prvního bajtu horní části registru 01 Počet následujících bajtů
00 Adresa prvního bajtu dolní části registru 03 Hodnota registru DI 0-1
00 Horní bajt počtu registrů
02 Dolní bajt počtu registrů

 

Stavy výstupu DI 0-1 jsou uvedeny jako hodnoty 03 hex, neboli v binární soustavě 0000 0011.

Hodnota DI1 bude druhá zprava a hodnota DI0 bude první zprava (nejnižší bit).

Zbylých šest bitů je vyplněno nulami.

Jak poslat příkaz protokolu Modbus TCP ke čtení analogového výstupu? Příkaz 0x03

Tento příkaz se používá ke čtení hodnot analogových výstupů AO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 07
01 Adresa zařízení 01 Adresa zařízení
03 Kód funkce 03 Kód funkce
00 Adresa prvního bajtu horní části registru 04 Počet následujících bajtů
00 Adresa prvního bajtu dolní části registru 02 Horní část hodnoty registru (AO0)
00 Horní bajt počtu registrů 2B Dolní část hodnoty registru (AO0)
02 Dolní bajt počtu registrů 00 Horní část hodnoty registru (AO1)
64 Dolní část hodnoty registru (AO1)

 

Výstupní stavy AO0 jsou zobrazeny jako 02 2B hex, neboli v desítkové soustavě 555.

Výstupní stavy AO1 jsou zobrazeny jako 00 64 hex, neboli v desítkové soustavě 100.

Jak poslat příkaz protokolu Modbus TCP ke čtení analogového vstupu? Příkaz 0x04

Tento příkaz se používá ke čtení hodnot analogových vstupů AI.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 07
01 Adresa zařízení 01 Adresa zařízení
04 Kód funkce 04 Kód funkce
00 Adresa prvního bajtu horní části registru 04 Počet následujících bajtů
00 Adresa prvního bajtu dolní části registru 00 Horní část hodnoty registru (AI0)
00 Horní bajt počtu registrů 0A Dolní část hodnoty registru (AI0)
02 Dolní bajt počtu registrů 00 Horní část hodnoty registru (AI1)
64 Dolní část hodnoty registru (AI1)

 

Výstupní stavy AI0 jsou zobrazeny jako 00 0A hex, neboli v desítkové soustavě 10.

Výstupní stavy AI1 jsou zobrazeny jako hodnoty bajtů 00 64 hex, neboli v desítkové soustavě 100.

Jak poslat příkaz protokolu Modbus TCP k zápisu diskrétního výstupu? Příkaz 0x05

Tento příkaz se používá k zápisu jedné hodnoty digitálního výstupu DO.

Hodnota FF 00 hex nastaví výstup na ZAPNUTO.

Hodnota 00 00 hex nastaví výstup na VYPNUTO.

Všechny ostatní hodnoty jsou neplatné a neovlivní stav výstupu.

Normální odpovědí na takový požadavek je echo (zopakování požadavku v odpovědi) a vrací se po změně stavu DO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 06
01 Adresa zařízení 01 Adresa zařízení
05 Kód funkce 05 Kód funkce
00 Horní bajt adresy registru 00 Horní bajt adresy registru
01 Dolní bajt adresy registru 01 Dolní bajt adresy registru
FF Význam horního bajtu FF Význam horního bajtu
00 Význam dolního bajtu 00 Význam dolního bajtu

 

Stav výstupu DO1 se změnil z VYPNUTO na ZAPNUTO.

Jak poslat příkaz protokolu Modbus TCP k zápisu analogového výstupu? Příkaz 0x06

Tento příkaz se používá k zápisu jedné hodnoty analogového výstupu AO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 06
01 Adresa zařízení 01 Adresa zařízení
06 Kód funkce 06 Kód funkce
00 Horní bajt adresy registru 00 Horní bajt adresy registru
01 Dolní bajt adresy registru 01 Dolní bajt adresy registru
55 Význam horního bajtu 55 Význam horního bajtu
FF Význam dolního bajtu FF Význam dolního bajtu

 

Stav výstupu AO0 se změnil na 55 FF hex, neboli v desítkové soustavě 22015.

Jak poslat příkaz protokolu Modbus TCP k zápisu více diskrétních pinů? Příkaz 0x0F

Tento příkaz se používá k zápisu více hodnot digitálního výstupu DO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
08 06
01 Adresa zařízení 01 Adresa zařízení
0F Kód funkce 0F Kód funkce
00 Adresa prvního bajtu horní části registru 00 Adresa prvního bajtu horní části registru
00 Adresa prvního bajtu dolní části registru 00 Adresa prvního bajtu dolní části registru
00 Horní bajt počtu registrů 00 Horní bajt počtu zapsaných registrů
02 Dolní bajt počtu registrů 02 Dolní bajt počtu zapsaných registrů
01 Počet následujících bajtů
02 Hodnota bajtu

 

Stav výstupu DO1 se změnil z VYPNUTO na ZAPNUTO.

Stav výstupu DO0 zůstává VYPNUTO.

Jak poslat příkaz protokolu Modbus TCP k zápisu více analogových výstupů? Příkaz 0x10

Tento příkaz se používá k zápisu více hodnot analogového výstupu AO.

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
0B 06
01 Adresa zařízení 01 Adresa zařízení
10 Kód funkce 10 Kód funkce
00 Adresa prvního bajtu horní části registru 00 Adresa prvního bajtu horní části registru
00 Adresa prvního bajtu dolní části registru 00 Adresa prvního bajtu dolní části registru
00 Horní bajt počtu registrů 00 Horní bajt počtu zapsaných registrů
02 Dolní bajt počtu registrů 02 Dolní bajt počtu zapsaných registrů
04 Počet následujících bajtů
00 Hodnota horního bajtu AO0
0A Hodnota dolního bajtu AO0
01 Hodnota horního bajtu AO1
02 Hodnota dolního bajtu AO1

 

Stav výstupu AO0 se změnil na 00 0A hex, neboli v desítkové soustavě 10.

Stav výstupu AO1 se změnil na 01 02 hex, neboli v desítkové soustavě 258.

Chyby požadavku protokolu Modbus TCP

Pokud zařízení nemůže požadavek po přijetí zpracovat, bude odeslána odpověď s kódem chyby.

Odpověď bude obsahovat modifikovaný kód funkce s nejvyšším bitem 1.

Příklad:

Původní Modifikovaný
Kód funkce v požadavku Chybový kód funkce v odpovědi
01 (01 hex) 0000 0001 129 (81 hex) 1000 0001
02 (02 hex) 0000 0010 130 (82 hex) 1000 0010
03 (03 hex) 0000 0011 131 (83 hex) 1000 0011
04 (04 hex) 0000 0100 132 (84 hex) 1000 0100
05 (05 hex) 0000 0101 133 (85 hex) 1000 0101
06 (06 hex) 0000 0110 134 (86 hex) 1000 0110
15 (0F hex) 0000 1111 143 (8F hex) 1000 1111
16 (10 hex) 0001 0000 144 (90 hex) 1001 0000

Příklad požadavku a odpovědi s chybou:

Bajt Požadavek Bajt Odpověď
(Hex) Název pole (Hex) Název pole
01 Identifikátor transakce 01 Identifikátor transakce
02 02
00 Identifikátor protokolu 00 Identifikátor protokolu
00 00
00 Délka zprávy 00 Délka zprávy
06 03
0A Adresa zařízení 0A Adresa zařízení
01 Kód funkce 81 Kód funkce se změněným bitem
04 Adresa prvního bajtu horní části registru 02 Kód chyby
A1 Adresa prvního bajtu dolní části registru
00 Horní bajt počtu registrů
01 Dolní bajt počtu registrů

 

Vysvětlení chybových kódů

01 Přijatý kód funkce nelze zpracovat.
02 Datová adresa uvedená v požadavku není dostupná.
03 Hodnota obsažená v datovém poli dotazu je neplatná.
04 Vyskytla se neodstranitelná chyba při pokusu zařízení slave o provedení požadovaného úkonu.
05 Zařízení slave přijalo požadavek a zpracovává ho, ale trvá to dlouhou dobu. Tato odpověď brání hostiteli vygenerovat chybu časového limitu.
06 Zařízení slave je zaneprázdněno zpracováváním příkazu. Master musí zprávu zopakovat později, až bude zařízení slave volné.
07 Zařízení slave nemůže vykonat programovou funkci uvedenou v požadavku. Tento kód se vrací při neúspěšném požadavku programu prostřednictvím funkcí s čísly 13 nebo 14. Master si musí od zařízení slave vyžádat diagnostické informace nebo informace o chybě.
08 Zařízení slave zjistilo chybu parity při čtení rozšířené paměti. Master může požadavek zopakovat, ale obvykle jsou v takových případech potřeba opravy.

 

Programy pro práci s protokolem Modbus TCP

Níže jsou uvedeny programy, které vám pomohou snadno komunikovat se zařízeními využívajícími protokol Modbus TCP.

Modbus Master Tool s podporou pro Modbus RTU, ASCII, TCP.

 

Modbus TCP client s podporou pro Modbus TCP. 

Přejít do kolekce produktů Modbus Gateway

Předchozí článek Kompletní nabídka vybavení pro průmyslový internet věcí (IIoT)
Další článek Základní rozdíly mezi RS-232, RS-422 a RS-485