https://ipc2u.cz/articles/simple-decisions/podrobny-popis-protokolu-modbus-tcp-s-priklady-prikazu/
00:44 16.12.2018
Katalog Novinky +420-727 965 000 sales@ipc2u.cz
Sady
Vybrané zboží
Vybrané zboží
Vybrané zboží
Cena na vyžádání
Registrace / Autorizace
Autorizace
Uživatelské jméno:
Heslo:


Zapomněli jste heslo? Zaregistrovat se
Zapomněli jste heslo?
E-mail:
Zapomněli jste heslo?
Průmyslové počítače a řešení pro automatizaci a komunikace
Ringhofferova 115/1,  155 21 Praha 5 , Czech Republic
+49 511 807 259-0, sales@ipc2u.cz
Košík
Cena na vyžádání
Sleva -
Celkem:

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

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

Tento článek pojednává o protokolu Modbus TCP, který vznikl vývojem protokolu Modbus RTU.

Kam poslat příkaz protokolu Modbus TCP?

V síti Ethernet je adresou zařízení jeho IP adresa. Zařízení jsou obvykle ve stejné podsíti, kde se IP adresy liší posledními dvěma číslicemi 192.168.1.20 při použití nejobvyklejší 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 odstraní adresa SlaveID na začátku a kontrolní součet CRC na konci, čímž vznikne PDU, neboli datová jednotka protokolu.

Níže je uveden příklad požadavku protokolu Modbus RTU na získání hodnoty AI uchovávacích (holding) registrů z registrů č. 40108 až 40110 s adresou zařízení 17.

11 03 006B 0003 7687

11Adresa zařízení SlaveID (17 = 11 hex)
03Kód funkce (čtení holding registrů analogového výstupu)
006BAdresa prvního registru (40108-40001 = 107 = 6B hex)
0003Počet požadovaných registrů (čtení 3 registrů od 40108 do 40110)
7687Kontrolní 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. hlavička MBAP (Modbus Application Header), která obsahuje následující data:

Hlavička MBAP

Identifikátor transakce: master nastaví 2 bajty, které jednoznačně identifikují každý požadavek. Ty mohou být libovolné. Zařízení slave tyto bajty v odpovědi zopakuje, protože jeho odpovědi nemusejí být vždy přijaty ve stejném pořadí jako požadavky.

Identifikátor protokolu: master nastaví 2 bajty, vždy to budou 00 00, což odpovídá protokolu Modbus.

Délka: master nastaví 2 bajty, které identifikují počet bajtů v následující zprávě. Počítá se od identifikátoru jednotky do konce zprávy.

Identifikátor jednotky: master nastaví 1 bajt. Zařízení slave ho zopakuje pro jedinečnou identifikaci zařízení slave.

Celkově dostaneme:

Modbus RTUSlave IDInquiryCRC
Modbus RTU1103 006B 00037687
Modbus TCP0001 0000 0006 1103 006B 0003
Modbus TCPHlavička MBAPPDU
Modbus TCPADU (Application Data Unit – aplikační datová jednotka)

Kde:

0001Identifikátor transakceIdentifikátor transakce
0000Identifikátor protokolu LaIdentifikátor protokolu
0006Délka (následuje 6 bajtů)Délka zprávy
11Adresa zařízení (17 = 11 hex)Identifikátor jednotky
03Kód funkce (čtení holding registrů analogového výstupu)Kód funkce
006BAdresa prvního registru (107 = 40108-40001 = 6B hex)Datová adresa prvního registru
0003Počet požadovaných registrů (číst 3 registry 40108 až 40110)Celkový počet registrů

Jako odpověď od zařízení slave protokolu Modbus TCP dostaneme:

0001 0000 0009 11 03 06 022B 0064 007F

Kde:

0001Identifikátor transakceIdentifikátor transakce
0000Identifikátor protokoluIdentifikátor protokolu
0009Délka (následuje 9 bajtů)Délka zprávy
11Adresa zařízení (17 = 11 hex)Identifikátor jednotky
03Kód funkce (čtení holding registrů analogového výstupu)Kód funkce
06Počet následujících bajtů (následuje 6 bajtů)Počet bajtů
02Hodnota horní části registru (02 hex)Horní část hodnoty registru (AO0)
2BHodnota předčasného vyprázdnění registru (2B hex)Dolní část hodnoty registru (AO0)
00Hodnota horní části registru (00 hex)Horní část hodnoty registru (AO1)
64Hodnota dolní části registru (64 hex)Dolní část hodnoty registru (AO1)
00Hodnota horní části registru (00 hex)Horní část hodnoty registru (AO2)
7FHodnota předčasného vyprázdnění registru (7F hex)Dolní část hodnoty registru (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 funkceCo funkce děláTyp hodnotyTyp přístupu
01 (0x01)Čtení DOČtení stavu cívkyDiskrétníČtení
02 (0x02)Čtení DIČtení stavu vstupuDiskrétníČtení
03 (0x03)Čtení AOČtení holding registrů16bitováČtení
04 (0x04)Čtení AIČtení vstupních registrů16bitováČtení
05 (0x05)Zápis jednoho DONastavení stavu jedné cívkyDiskrétníZápis
06 (0x06)Zápis jednoho AONastavení jednoho registru16bitováZápis
15 (0x0F)Zápis více DONastavení stavu více smyčekDiskrétníZápis
16 (0x10)Zápis více AONastavení více registrů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ů.

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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0604
01Adresa zařízení01Adresa zařízení
01Kód funkce01Kód funkce
00Adresa prvního bajtu horní části registru01Počet následujících bajtů
00Adresa prvního bajtu dolní části registru02Hodnota registru DO 0-1
00Horní bajt počtu registrů
02Dolní 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 1DO 0
Bity00000010
Hex02

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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0604
01Adresa zařízení01Adresa zařízení
02Kód funkce02Kód funkce
00Adresa prvního bajtu horní části registru01Počet následujících bajtů
00Adresa prvního bajtu dolní části registru03Hodnota registru DI 0-1
00Horní bajt počtu registrů
02Dolní 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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0607
01Adresa zařízení01Adresa zařízení
03Kód funkce03Kód funkce
00Adresa prvního bajtu horní části registru04Počet následujících bajtů
00Adresa prvního bajtu dolní části registru02Horní část hodnoty registru (AO0)
00Horní bajt počtu registrů2BDolní část hodnoty registru (AO0)
02Dolní bajt počtu registrů00Horní část hodnoty registru (AO1)
64Dolní čá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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0607
01Adresa zařízení01Adresa zařízení
04Kód funkce04Kód funkce
00Adresa prvního bajtu horní části registru04Počet následujících bajtů
00Adresa prvního bajtu dolní části registru00Horní část hodnoty registru (AI0)
00Horní bajt počtu registrů0ADolní část hodnoty registru (AI0)
02Dolní bajt počtu registrů00Horní část hodnoty registru (AI1)
64Dolní čá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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0606
01Adresa zařízení01Adresa zařízení
05Kód funkce05Kód funkce
00Horní bajt adresy registru00Horní bajt adresy registru
01Dolní bajt adresy registru01Dolní bajt adresy registru
FFVýznam horního bajtuFFVýznam horního bajtu
00Význam dolního bajtu00Vý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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0606
01Adresa zařízení01Adresa zařízení
06Kód funkce06Kód funkce
00Horní bajt adresy registru00Horní bajt adresy registru
01Dolní bajt adresy registru01Dolní bajt adresy registru
55Význam horního bajtu55Význam horního bajtu
FFVýznam dolního bajtuFFVý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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0806
01Adresa zařízení01Adresa zařízení
0FKód funkce0FKód funkce
00Adresa prvního bajtu horní části registru00Adresa prvního bajtu horní části registru
00Adresa prvního bajtu dolní části registru00Adresa prvního bajtu dolní části registru
00Horní bajt počtu registrů00Horní bajt počtu zapsaných registrů
02Dolní bajt počtu registrů02Dolní bajt počtu zapsaných registrů
01Počet následujících bajtů
02Hodnota 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.

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0B06
01Adresa zařízení01Adresa zařízení
10Kód funkce10Kód funkce
00Adresa prvního bajtu horní části registru00Adresa prvního bajtu horní části registru
00Adresa prvního bajtu dolní části registru00Adresa prvního bajtu dolní části registru
00Horní bajt počtu registrů00Horní bajt počtu zapsaných registrů
02Dolní bajt počtu registrů02Dolní bajt počtu zapsaných registrů
04Počet následujících bajtů
00Hodnota horního bajtu AO0
0AHodnota dolního bajtu AO0
01Hodnota horního bajtu AO1
02Hodnota 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žadavkuChybový kód funkce v odpovědi
01 (01 hex) 0000 0001129 (81 hex) 1000 0001
02 (02 hex) 0000 0010130 (82 hex) 1000 0010
03 (03 hex) 0000 0011131 (83 hex) 1000 0011
04 (04 hex) 0000 0100132 (84 hex) 1000 0100
05 (05 hex) 0000 0101133 (85 hex) 1000 0101
06 (06 hex) 0000 0110134 (86 hex) 1000 0110
15 (0F hex) 0000 1111143 (8F hex) 1000 1111
16 (10 hex) 0001 0000144 (90 hex) 1001 0000

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

BajtPožadavekBajtOdpověď
(Hex)Název pole(Hex)Název pole
01Identifikátor transakce01Identifikátor transakce
0202
00Identifikátor protokolu00Identifikátor protokolu
0000
00Délka zprávy00Délka zprávy
0603
0AAdresa zařízení0AAdresa zařízení
01Kód funkce81Kód funkce se změněným bitem
04Adresa prvního bajtu horní části registru02Kód chyby
A1Adresa prvního bajtu dolní části registru
00Horní bajt počtu registrů
01Dolní bajt počtu registrů

Vysvětlení chybových kódů

01Přijatý kód funkce nelze zpracovat.
02Datová adresa uvedená v požadavku není dostupná.
03Hodnota obsažená v datovém poli dotazu je neplatná.
04Vyskytla se neodstranitelná chyba při pokusu zařízení slave o provedení požadovaného úkonu.
05Zaří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.
06Zaří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é.
07Zaří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ě.
08Zaří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. Stáhnout

Modbus Master Tool

Modbus TCP client s podporou pro Modbus TCP. Stáhnout

Modbus TCP client

https://ipc2u.cz/articles/simple-decisions/podrobny-popis-protokolu-modbus-tcp-s-priklady-prikazu/
00:44 16.12.2018