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.