Přeskočit na obsah

Protokol Modbus RTU v kostce s popisy a příklady

Protokolu Modbus RTU v kostce (s podrobnými popisy a příklady)

Popis protokolu Modbus RTU

Komunikační protokol Modbus je založen na architektuře master-slave. K přenosu dat využívá rozhraní RS-485, RS-422, RS-232 i TCP/IP sítě Ethernet (protokol Modbus TCP).

Zpráva protokolu Modbus RTU se skládá z adresy zařízení SlaveID, kódu funkce, speciálních dat v závislosti na kódu funkce a kontrolního součtu CRC.

SlaveID Kód funkce Speciální data CRC

Pokud odstraníte adresu SlaveID a kontrolní součet CRC, získáte PDU, neboli datovou jednotku protokolu.

SlaveID je adresa zařízení, která může mít hodnotu z rozsahu 0 až 247, adresy od 248 do 255 jsou vyhrazené.

Data v modulu jsou uložena ve 4 tabulkách.

Dvě tabulky jsou pouze ke čtení a dvě umožňují čtení i zápis.

V každé tabulce je umístěno 9999 hodnot.

ČÍSLO REGISTRU HEXADECIMÁLNÍ ADRESA REGISTRU TYP NÁZEV TYP
1-9999 0000 až 270E čtení-zápis Smyčky diskrétního výstupu DO
10001-19999 0000 až 270E čtení Kontakty diskrétního vstupu DI
30001-39999 0000 až 270E čtení Registry analogového vstupu AI
40001-49999 0000 až 270E čtení-zápis Holding registry analogového výstupu

AO

Zpráva protokolu Modbus používá adresu registru.

Například první registr holdingového registru AO má číslo 40001, ale jeho adresa je 0000.

Rozdíl mezi těmito dvěma hodnotami je „posun“ (offset).

Každá tabulka má vlastní posun, pro jednotlivé tabulky je: 1, 10001, 30001 a 40001.

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

11 ADRESA ZAŘÍZENÍ SLAVEID (17 = 11 HEX)
03 Kód funkce
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

Jako odpověď pro zařízení slave protokolu Modbus RTU dostaneme:

11 03 06 AE41 5652 4340 49AD

Kde:

11 ADRESA ZAŘÍZENÍ (17 = 11 hex) SlaveID
03 Kód funkce Kód funkce
06 Počet dalších bajtů (následuje 6 bajtů) Počet bajtů
AE Hodnota horní části registru (AE hex) Horní část hodnoty registru (AO0)
41 Dolní část registru (41 hex) Dolní část hodnoty registru (AO0)
56 Hodnota horní části registru (56 hex) Horní část hodnoty registru (AO1)
52 Dolní část registru (52 hex) Dolní část hodnoty registru (AO1)
43 Hodnota horní části registru (43 hex) Horní část hodnoty registru (AO2)
40 Dolní část registru (40 hex) Dolní část hodnoty registru (AO2)
49 Kontrolní součet Horní část hodnoty CRC
AD Kontrolní součet

Dolní část hodnoty CRC

Registr analogového výstupu AO0 má hodnotu AE 41 HEX, neboli 44609 v desítkové soustavě.

Registr analogového výstupu AO1 má hodnotu 56 52 HEX, neboli 22098 v desítkové soustavě.

Registr analogového výstupu AO2 má hodnotu 43 40 HEX, neboli 17216 v desítkové soustavě.

Hodnota AE 41 HEX představuje 16 bitů 1010 1110 0100 0001 a může nabývat i jiné hodnoty v závislosti na typu vyjádření.

Hodnota registru 40108 v kombinaci s registrem 40109 dává 32bitovou hodnotu.

Příklad vyjádření:

Typ zobrazení Rozsah hodnot Příklad v HEX V desítkové soustavě
16bitové celé číslo bez znaménka 0 až 65535 AE41 44,609
16bitové celé číslo se znaménkem -32768 až 32767 AE41 -20,927
dvouznakový řetězec ASCII 2 znaky AE41 ® A
diskrétní hodnota zapnuto/vypnuto 0 a 1 0001 0001
32bitové celé číslo bez znaménka 0 až 4,294,967,295 AE41 5652 2,923,517,522
32bitové celé číslo se znaménkem -2,147,483,648 až 2,147,483,647 AE41 5652 -1,371,449,774
32bitové číslo s plovoucí desetinnou čárkou IEEE s jednoduchou přesností 1,2·10−38 až 3,4×10+38 AE41 5652 -4.395978 E-11
čtyřznakový řetězec ASCII 4 znaky AE41 5652 ® A V R

 

Jaké jsou příkazy protokolu Modbus RTU?

V tabulce níže jsou uvedeny kódy pro čtení z registrů a zápis do registrů protokolu Modbus RTU.

KÓD FUNKCE CO FUNKCE DĚLÁ TYP HODNOTY TYP PŘÍSTUPU
01 (0x01) Čtení DO Čtení stavu cívky Diskrétní Čtení
02 (0x02) Čtení DI Čtení stavu vstupu Diskré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 DO Nastavení stavu jedné cívky Diskrétní Zápis
06 (0x06) Zápis jednoho AO Nastavení jednoho registru 16bitová Zápis
15 (0x0F) Zápis více DO Nastavení stavu více smyček Diskrétní Zápis
16 (0x10) Zápis více AO Nastavení více registrů 16bitová Zápis

 

Jak poslat příkaz protokolu Modbus RTU 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). Počet bajtů – počet dalších bajtů označuje počet celých bajtů dat v odpovědi.

Příklad dotazu na DO od 20 do 56 pro adresu zařízení SlaveID 17. Adresa prvního registru bude 0013 hex = 19, protože adresy začínají od 0 (0014 hex = 20, nulový posun -1 = získáme 0013 hex = 19).

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
01 Kód funkce 01 Kód funkce
00 Horní bajt adresy prvního registru 05 Počet následujících bajtů
13 Dolní bajt adresy prvního registru CD Hodnota registru DO 27-20 (1100 1101)
00 Horní bajt počtu registrů 6B Hodnota registru DO 35-28 (0110 1011)
25 Dolní bajt počtu registrů B2 Hodnota registru DO 43-36 (1011 0010)
0E Kontrolní součet CRC 0E Hodnota registru DO 51-44 (0000 1110)
84 Kontrolní součet CRC 1B Hodnota registru DO 56-52 (0001 1011)
45 Kontrolní součet CRC
E6 Kontrolní součet CRC

Stavy výstupu DO 27-20 jsou uvedeny jako hodnoty CD hex, neboli v binární soustavě 1100 1101.

V registru DO 56-52 bylo požadováno 5 bitů vpravo, zbývající bity do celého bajtu jsou vyplněny nulami (0001 1011).

Kanály - - - DO 56 DO 55 DO 54 DO 53 DO 52
Bity 0 0 0 1 1 0 1 1
Hex 1B

 

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

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

Příklad požadavku na DI z registrů od č. 10197 do 10218 pro adresu zařízení SlaveID 17. Adresa prvního registru bude 00C4 hex = 196, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
02 Kód funkce 02 Kód funkce
00 Horní bajt adresy prvního registru 03 Počet následujících bajtů
C4 Dolní bajt adresy prvního registru AC Hodnota registru DI 10204-10197 (1010 1100)
00 Horní bajt počtu registrů DB Hodnota registru DI 10212-10205 (1101 1011)
16 Dolní bajt počtu registrů 35 Hodnota registru DI 10218-10213 (0011 0101)
BA Kontrolní součet CRC 20 Kontrolní součet CRC
A9 Kontrolní součet CRC 18 Kontrolní součet CRC

 

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

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

Příklad požadavku na AO z registrů od č. 40108 do 40110 pro adresu zařízení SlaveID 17. Adresa prvního registru bude 006B hex = 107, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
03 Kód funkce 03 Kód funkce
00 Horní bajt adresy prvního registru 06 Počet následujících bajtů
6B Dolní bajt adresy prvního registru AE Horní část hodnoty registru č. 40108
00 Horní bajt počtu registrů 41 Dolní část hodnoty registru č. 40108
03 Dolní bajt počtu registrů 56 Horní část hodnoty registru č. 40109
76 Kontrolní součet CRC 52 Dolní část hodnoty registru č. 40109
87 Kontrolní součet CRC 43 Horní část hodnoty registru č. 40110
40 Dolní část hodnoty registru č. 40110
49 Kontrolní součet CRC
AD Kontrolní součet CRC

 

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

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

Příklad požadavku na AI z registrů od č. 30009 pro adresu zařízení SlaveID 17. Adresa prvního registru je 0008 hex = 8, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
04 Kód funkce 04 Kód funkce
00 Horní bajt adresy prvního registru 02 Počet následujících bajtů
08 Dolní bajt adresy prvního registru 00 Horní část hodnoty registru č. 30009
00 Horní bajt počtu registrů 0A Dolní část hodnoty registru č. 30009
01 Dolní bajt počtu registrů F8 Kontrolní součet CRC
B2 Kontrolní součet CRC F4 Kontrolní součet CRC
98 Kontrolní součet CRC

 

Jak poslat příkaz protokolu Modbus RTU 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 nebudou ovlivněny hodnotou 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.

Příklad záznamu DO s registrem č. 173 pro adresu zařízení SlaveID 17. Adresa registru bude 00AC hex = 172, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
05 Kód funkce 05 Kód funkce
00 Horní bajt adresy prvního registru 00 Horní bajt adresy prvního registru
AC Dolní bajt adresy prvního registru AC Dolní bajt adresy prvního registru
FF Hodnota horních bajtů FF Hodnota horních bajtů
00 Hodnota dolních bajtů 00 Hodnota dolních bajtů
4E Kontrolní součet CRC 4E Kontrolní součet CRC
8B Kontrolní součet CRC 8B Kontrolní součet CRC

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

Jak poslat příkaz protokolu Modbus RTU 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.

Příklad záznamu do AO s registrem č. 40002 pro adresu zařízení SlaveID 17. Adresa prvního registru bude 0001 hex = 1, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
06 Kód funkce 06 Kód funkce
00 Horní bajt adresy prvního registru 00 Horní bajt adresy prvního registru
01 Dolní bajt adresy prvního registru 01 Dolní bajt adresy prvního registru
00 Hodnota horních bajtů 00 Hodnota horních bajtů
03 Hodnota dolních bajtů 03 Hodnota dolních bajtů
9A Kontrolní součet CRC 9A Kontrolní součet CRC
9B Kontrolní součet CRC 9B Kontrolní součet CRC

 

Jak poslat příkaz protokolu Modbus RTU 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.

Příklad zápisu do několika DO s registry od č. 20 do 29 pro adresu zařízení SlaveID 17. Adresa registru bude 0013 hex = 19, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
0F Kód funkce 0F Kód funkce
00 Horní bajt adresy prvního registru 00 Horní bajt adresy prvního registru
13 Dolní bajt adresy prvního registru 13 Dolní bajt adresy prvního registru
00 Horní bajt počtu registrů 00 Horní bajt počtu zapsaných registrů
0A Dolní bajt počtu registrů 0A Dolní bajt počtu zapsaných registrů
02 Počet následujících bajtů 26 Kontrolní součet CRC
CD Bajtová hodnota DO 27-20 (1100 1101) 99 Kontrolní součet CRC
01 Bajtová hodnota DO 29-28 (0000 0001)
BF Kontrolní součet CRC
0B Kontrolní součet CRC

V odpovědi se vrátí počet zapsaných registrů.

Jak poslat příkaz protokolu Modbus RTU 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.

Příklad zápisu do několika AO s registry č. 40002 a 40003 pro adresu zařízení SlaveID 17. Adresa prvního registru bude 0001 hex = 1, protože adresy začínají od 0.

BAJT POŽADAVEK BAJT ODPOVĚĎ
(Hex) Název pole (Hex) Název pole
11 Adresa zařízení 11 Adresa zařízení
10 Kód funkce 10 Kód funkce
00 Horní bajt adresy prvního registru 00 Horní bajt adresy prvního registru
01 Dolní bajt adresy prvního registru 01 Dolní bajt adresy prvního 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ů 12 Kontrolní součet CRC
00 Horní část hodnoty 40002 98 Kontrolní součet CRC
0A Dolní část hodnoty 40002
01 Horní část hodnoty 40003
02 Dolní část hodnoty 40003
C6 Kontrolní součet CRC
F0 Kontrolní součet CRC

 

Jaké jsou chyby požadavku protokolu Modbus?

Pokud zařízení obdrží požadavek, který nelze zpracovat, odpoví zařízení 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
0A Adresa zařízení 0A Adresa zařízení
01 Kód funkce 81 Kód funkce se změněným bitem
04 Horní bajt adresy prvního registru 02 Kód chyby
A1 Dolní bajt adresy prvního registru B0 Kontrolní součet CRC
00 Horní bajt počtu registrů 53 Kontrolní součet CRC
01 Dolní bajt počtu registrů
AC Kontrolní součet CRC
63 Kontrolní součet CRC

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 RTU

Níže jsou uvedeny programy, které usnadňují práci s protokolem Modbus.

DCON Utility Pro s podporou pro Modbus RTU, ASCII, DCON.

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

Klient protokolu Modbus TCP s podporou pro Modbus TCP.

Přejít do kolekce produktů Modbus Gateway

Předchozí článek Základní rozdíly mezi RS-232, RS-422 a RS-485
Další článek Nové moduly COM Express Type 10 CEM310 od společnosti Axiomtek