PLCBytes
Nástroje pro Modbus

Funkční a chybové kódy Modbus

Zadejte funkční kód, chybový kód nebo celou odpověď a uvidíte, co znamená a co ho obvykle způsobuje. Úplný seznam kódů následuje níže.

Vyhledat kód

Příklad

Desítkově nebo hex: 3, 16, 0x10, 0B. Chybová odpověď jako 83 02 nebo celý rámec jako 01 83 02 C0 F1.

Význam

Běží celé ve vašem prohlížeči. Nic z toho, co zadáte, se neodesílá na server.

Funkční kódy Modbus

Funkční kódy se píšou desítkově (FC 16) i hex (0x10), obojí znamená totéž. Kódy 65–72 a 100–110 jsou ponechány výrobcům pro vlastní funkce.

01 čtení coilů (Read Coils)

0x01 · Coily (0x)

Čte 1 až 2000 výstupních bitů (coilů). Požadavek nese počáteční adresu a počet, odpověď počet bajtů a bity po 8 v bajtu, první adresa v nejnižším bitu.

Coily jsou reléové výstupy nebo přepínatelné příznaky. Mnoho elektroměrů a střídačů coily vůbec nemá a stavové bity drží v holding registrech. Když 01 vrátí výjimku 01, hledejte registr, který bit nese.

02 čtení diskrétních vstupů (Read Discrete Inputs)

0x02 · Diskrétní vstupy (1x)

Čte 1 až 2000 vstupních bitů jen pro čtení (diskrétní vstupy), zabalených po 8 v bajtu jako coily.

Typické pro digitální vstupy I/O modulů a PLC. Elektroměry a střídače ho používají zřídka, stavy hlásí v registrech.

03 čtení holding registrů (Read Holding Registers)

0x03 · Holding registry (4x)

Čte 1 až 125 po sobě jdoucích 16bitových holding registrů. Požadavek nese počáteční adresu a počet, odpověď počet bajtů a dva bajty na registr, vyšší bajt první.

Zdaleka nejpoužívanější funkce. Většina elektroměrů, střídačů a měničů dává všechno do holding registrů, i měřené hodnoty jen pro čtení. Výjimka 02 obvykle znamená adresu posunutou o 1 nebo čtení přes mezeru v mapě registrů.

04 čtení input registrů (Read Input Registers)

0x04 · Input registry (3x)

Čte 1 až 125 16bitových input registrů jen pro čtení. Rámce vypadají přesně jako u funkce 03.

Některá zařízení drží měřené hodnoty v input registrech a nastavení v holding registrech. Když 03 vrátí výjimku 02 nebo samé nuly, zkuste 04 na stejné adrese, a naopak.

05 zápis jednoho coilu (Write Single Coil)

0x05 · Coily (0x)

Přepne jeden coil. Hodnota je FF 00 pro ZAP a 00 00 pro VYP, cokoli jiného je neplatné. Odpověď je přesná kopie požadavku.

Poslat 00 01 pro ZAP je častá chyba a končí výjimkou 03. Některá zařízení používají coil pro jednorázové akce, třeba vynulování čítačů energie.

06 zápis jednoho registru (Write Single Register)

0x06 · Holding registry (4x)

Zapíše jednu 16bitovou hodnotu do holding registru. Odpověď je přesná kopie požadavku.

Nehodí se pro 32bitové hodnoty, protože obě poloviny by se zapsaly v jiný okamžik. Některá zařízení přijmou 06 jen pro určité registry a pro ostatní vyžadují 16.

07 čtení stavu výjimky (Read Exception Status)

0x07 · jen sériová linka

Čte osm stavových bitů, jejichž význam si definuje každé zařízení samo.

Dnes se používá zřídka. Zda ho zařízení vůbec podporuje, zjistíte v návodu.

08 diagnostika (Diagnostics)

0x08 · jen sériová linka

Diagnostika vybraná podfunkcí. Podfunkce 0000 pošle data rovnou zpět (smyčka), ostatní čtou nebo nulují čítače sběrnice.

Podfunkce 0000 je rychlý test linky bez sahání na jakýkoli registr, pokud ji zařízení podporuje.

11 čítač komunikačních událostí (Get Comm Event Counter)

0x0B · jen sériová linka

Vrátí stavové slovo a čítač úspěšně zpracovaných zpráv.

Dvojí přečtení čítače ukáže, jestli zařízení vaše požadavky vůbec přijímá a zpracovává.

12 log komunikačních událostí (Get Comm Event Log)

0x0C · jen sériová linka

Vrátí stavové slovo, čítače událostí a zpráv a posledních 64 komunikačních událostí.

Podporuje ho málo zařízení. Hodí se hlavně při hledání občasných chyb.

15 zápis více coilů (Write Multiple Coils)

0x0F · Coily (0x)

Zapíše 1 až 1968 po sobě jdoucích coilů. Hodnoty jsou zabalené po 8 v bajtu jako u funkce 01, odpověď zopakuje počáteční adresu a počet.

Počet bajtů musí sedět s počtem coilů: 10 coilů potřebuje 2 bajty. Nesoulad končí výjimkou 03.

16 zápis více registrů (Write Multiple Registers)

0x10 · Holding registry (4x)

Zapíše 1 až 123 po sobě jdoucích holding registrů. Požadavek nese počáteční adresu, počet, počet bajtů a hodnoty, odpověď zopakuje počáteční adresu a počet.

Správná cesta pro zápis 32bitových hodnot, třeba float, protože obě poloviny se změní najednou. Některá zařízení odmítnou 16 pro jediný registr a chtějí 06, jiná odmítnou 06.

17 identifikace serveru (Report Server ID)

0x11 · jen sériová linka

Vrátí identifikační blok podle výrobce a příznak běh/stop.

Obsah se liší výrobce od výrobce. Strukturovanou náhradou je funkce 43/14.

20 čtení souborového záznamu (Read File Record)

0x14

Čte souborové záznamy: číslované skupiny registrů adresované číslem souboru a záznamu.

Některá zařízení tak zpřístupňují logy nebo konfiguraci. V praxi vzácné.

21 zápis souborového záznamu (Write File Record)

0x15

Zapisuje souborové záznamy: číslované skupiny registrů adresované číslem souboru a záznamu.

V praxi vzácné. Rozložení souborů popisuje návod k zařízení.

22 maskovaný zápis registru (Mask Write Register)

0x16 · Holding registry (4x)

Změní jednotlivé bity jednoho holding registru: výsledek = (obsah AND and_mask) OR (or_mask AND NOT and_mask).

Nastaví jeden bit řídicího slova bez předchozího čtení. Mnoho zařízení ji nepodporuje, pak čtěte funkcí 03, změňte bit a zapište zpět funkcí 06.

23 čtení a zápis více registrů (Read/Write Multiple Registers)

0x17 · Holding registry (4x)

Zapíše a přečte registry v jedné transakci, zápis proběhne první. Zapsat lze až 121 registrů a přečíst až 125.

Podporují ji hlavně PLC. Když zařízení odpoví výjimkou 01, použijte 16 a 03 po sobě.

24 čtení fronty FIFO (Read FIFO Queue)

0x18

Přečte až 31 registrů z fronty FIFO, před nimi jejich počet.

Podporuje se zřídka.

43 zapouzdřené rozhraní (Encapsulated Interface Transport)

0x2B

Obálka pro podprotokoly vybrané typem MEI. Typ MEI 0E, čtení identifikace zařízení, vrací textové objekty jako název výrobce, kód produktu a verzi firmwaru.

Šikovné, když potřebujete zjistit, co je na sběrnici, a nemáte návod. Podpora je volitelná a mnoho jednoduchých zařízení odpoví výjimkou 01.

Chybové kódy Modbus (výjimky)

V chybové odpovědi zařízení vrátí funkční kód zvětšený o 0x80 (z 03 je 83) a za ním jeden z těchto kódů. Kód 09 není definován.

01 nepovolená funkce (Illegal Function)

Zařízení tuto funkci nepodporuje. Typicky čtení input registrů (04) ze zařízení, které má jen holding registry (03), nebo naopak.

02 nepovolená adresa dat (Illegal Data Address)

Adresa nebo část rozsahu v zařízení neexistuje. Nejčastěji je adresa posunutá o 1 (registr 40001 je adresa 0) nebo čtení zasahuje do mezery v mapě registrů. Čtěte méně registrů nebo začněte přesně tam, kde uvádí návod.

03 nepovolená hodnota dat (Illegal Data Value)

Hodnota v požadavku není povolená. Nejčastěji počet: víc než 125 registrů nebo počet, který rozdělí 32bitovou hodnotu napůl. U zápisu může být hodnota mimo povolený rozsah.

04 porucha zařízení (Server Device Failure)

Zařízení selhalo při zpracování požadavku. Některá zařízení odpovídají 04 i u registrů, které jsou dočasně nedostupné.

05 potvrzeno, zpracovává se (Acknowledge)

Zařízení přijalo dlouhotrvající příkaz a ještě na něm pracuje. Zeptejte se později.

06 zařízení je zaneprázdněné (Server Device Busy)

Zařízení je zaneprázdněné dlouhotrvajícím příkazem. Požadavek zopakujte později.

07 záporné potvrzení (Negative Acknowledge)

Starý kód pro programovací příkazy. Současná zařízení ho nepoužívají.

08 chyba parity paměti (Memory Parity Error)

Chyba parity v paměti souborů. Objevuje se jen u funkcí 20 a 21.

0A brána nemá cestu (Gateway Path Unavailable)

Brána neví, kam požadavek poslat. Obvykle unit ID, pro které brána nemá cestu, nebo nenastavený port brány.

0B zařízení za bránou neodpovědělo (Gateway Target Device Failed to Respond)

Brána požadavek předala, ale zařízení za ní včas neodpovědělo. Zkontrolujte unit ID, rychlost, paritu, zapojení a zakončení sběrnice na sériové straně.

Jak fungují funkční a chybové kódy

Druhý bajt rámce Modbus RTU a první bajt každého PDU je funkční kód. Říká zařízení, co má udělat: číst coily, číst registry, zapsat hodnotu. Když zařízení požadavek provede, jeho odpověď začíná stejným funkčním kódem. Když ne, nastaví nejvyšší bit kódu (z 03 je 83) a přidá jeden bajt, chybový kód, který říká proč.

Výjimka je v jednom ohledu dobrá zpráva: zařízení rámec přijalo, CRC sedělo a adresa odpovídala. Zařízení, které neodpovídá vůbec, má jiný problém: špatnou adresu, rychlost nebo paritu, zapojení nebo zakončení. Výjimkou z tohoto pravidla jsou brány, které mlčící zařízení za sebou hlásí kódem 0B.

Časté chyby

Dekodér rámců ukáže funkční a chybový kód celého zachyceného rámce spolu s adresou a daty.

Otázky z praxe

Co znamená chybový kód Modbus 02?

Illegal Data Address, nepovolená adresa dat: aspoň jeden z požadovaných registrů v zařízení neexistuje. V praxi je adresa obvykle posunutá o 1 (40001 je adresa 0), funkce čte špatnou tabulku (03 místo 04) nebo čtení zasahuje do mezery v mapě registrů. Zkuste nejdřív přečíst jediný registr na přesné adrese z návodu.

Proč zařízení odpovídá 83 místo 03?

83 je 03 plus 0x80, znak chybové odpovědi: zařízení požadavek na čtení holding registrů pochopilo, ale odmítlo. Bajt za 83 je chybový kód s důvodem, například 02 pro adresu, která neexistuje.

Jaký je rozdíl mezi funkcí 03 a 04?

Funkce 03 čte holding registry (4xxxx), funkce 04 input registry (3xxxx). Input registry jsou jen pro čtení, holding registry se obvykle dají i zapisovat. Ve které tabulce hodnota je, záleží jen na zařízení; mapa registrů řekne, kterou funkci použít.

Je FC 16 totéž co funkční kód 0x10?

Ano. FC 16 je desítkový zápis, 0x10 hex, obojí znamená zápis více registrů (Write Multiple Registers). Pozor na 0x16: to je desítkově 22, maskovaný zápis registru, tedy jiná funkce.

Zařízení vůbec neodpovídá. Jaká je to výjimka?

Žádná. Výjimkou zařízení odpoví, jen když přijme platný rámec adresovaný sobě. Žádná odpověď znamená, že rámec nedorazil nebo nebyl platný: zkontrolujte adresu zařízení, rychlost, paritu, stop bity, zapojení A/B a zakončení sběrnice. Za bránou Modbus TCP hlásí tuto situaci brána výjimkou 0B.

Související nástroje