Protokol Modbus RTU v kostce s 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.