Modbus je otevřený komunikační protokol založený na architektuře master-slave ( anglicky master -slave ; ve standardu Modbus se používá termín klient-server ). Je široce používán v průmyslu k organizaci komunikace mezi elektronickými zařízeními . Lze použít pro přenos dat přes sériové komunikační linky RS-485 , RS-422 , RS-232 a sítě TCP/IP (Modbus TCP). Existují i nestandardní implementace využívající UDP [1] [2] .
Nezaměňujte „Modbus“ a „Modbus Plus“. Modbus Plus je proprietární protokol vlastněný společností Schneider Electric . Fyzická vrstva Modbus Plus je jedinečná, podobná Ethernetu 10BASE-T , poloviční duplex přes jednu kroucenou dvojlinku , rychlost 2 Mbps. Transportní protokol Modbus Plus je HDLC , přes který je specifikováno rozšíření pro přenos Modbus PDU.
JBUS je podmnožinou protokolu Modbus RTU s drobnými rozdíly ve způsobu adresování [3] .
Modbus byl vyvinut společností Modicon (nyní ve vlastnictví Schneider Electric ) pro použití v jejich programovatelných logických automatech . Specifikace protokolu byla poprvé publikována v roce 1979 [4] . Jednalo se o otevřený standard, který popisoval formát zpráv a způsob jejich přenosu přes síť různých elektronických zařízení.
Zpočátku kontroléry MODICON používaly sériové rozhraní RS-232 [4] . Později se začalo používat rozhraní RS-485, protože poskytuje vyšší spolehlivost, umožňuje používat delší komunikační linky a připojit více zařízení na jednu linku.
Řada výrobců elektronických zařízení tento standard podporuje, na trhu se objevily stovky produktů, které jej využívají.
Modbus v současnosti vyvíjí nezisková organizace Modbus-IDA [5] .
Modbus specifikuje 4 typy dat:
Standardy Modbus se skládají ze 3 částí:
Hlavní předností standardu je otevřenost a masový charakter. Průmysl nyní (2014) vyrábí velké množství typů a modelů senzorů, akčních členů, modulů pro zpracování signálu a normalizace atd. Téměř všechny průmyslové monitorovací a řídicí systémy mají softwarové ovladače pro práci se sítěmi Modbus.
Norma byla v zásadě vyvinuta v roce 1979 s přihlédnutím k tehdejším potřebám a výpočetním možnostem a mnoho otázek relevantních pro moderní průmyslové sítě nebylo zohledněno [6] . Absence těchto vlastností je důsledkem jednoduchosti protokolu, která usnadňuje jeho studium a urychluje implementaci.
Regulátory na sběrnici Modbus komunikují pomocí modelu master-slave na základě transakcí skládajících se z požadavku a odpovědi.
Obvykle je v síti pouze jedno master ( angl. client , podle staré terminologie master ) zařízení a několik slave ( angl. server , podle staré terminologie slave ) zařízení. Master inicializuje transakce (vysílá požadavky). Master může adresovat požadavek jednotlivě kterémukoli podřízenému zařízení nebo iniciovat vysílanou zprávu všem podřízeným. Podřízené zařízení poté, co rozpoznalo svou adresu, odpoví na požadavek adresovaný konkrétně jemu. Když je přijat požadavek na vysílání, podřízená zařízení nevygenerují odpověď.
Specifikace Modbus popisuje strukturu požadavků a odpovědí. Jejich základem je základní protokolový balíček, tzv. PDU ( Protocol Data Unit ). Struktura PDU je nezávislá na typu linky a zahrnuje funkční kód a datové pole. Funkční kód je zakódován jako jednobajtové pole a může nabývat hodnot v rozsahu 1…127. Rozsah hodnot 128…255 je vyhrazen pro chybové kódy. Datové pole může mít proměnnou délku. Velikost paketu PDU je omezena na 253 bajtů.
Modbus PDUfunkční kód | data |
---|---|
1 bajt | N ≤ 252 (bajt) |
Pro přenos paketu přes fyzické komunikační linky se PDU umístí do jiného paketu obsahujícího další pole. Tento balíček se nazývá ADU ( Application Data Unit ). Formát ADU závisí na typu odkazu. Existují tři varianty ADU, dvě pro přenos dat přes asynchronní rozhraní a jedna přes sítě TCP/IP:
Obecná struktura ADU je následující (v závislosti na implementaci mohou některá pole chybět):
adresa podřízeného (slave) zařízení | funkční kód | data | blok detekce chyb |
---|
kde
Maximální velikost ADU pro sériové sítě RS232/RS485 je 256 bajtů, pro sítě TCP je to 260 bajtů.
Pro Modbus TCP ADU vypadá takto:
ID transakce | ID protokolu | délka balení | adresa otroka | funkční kód | data |
---|
kde
Je třeba poznamenat, že v Modbus TCP není žádné pole kontroly chyb, protože integrita dat je zajištěna zásobníkem TCP / IP.
Aktuální specifikace protokolu definuje tři kategorie funkčních kódů:
Standardní příkazy Jejich popis musí být zveřejněn a schválen Modbus-IDA. Tato kategorie zahrnuje jak již definované, tak aktuálně nepoužívané kódy. Vlastní příkazy Dva rozsahy kódů (65 až 72 a 100 až 110), kterým může uživatel přiřadit libovolnou funkci. Není však zaručeno, že některé jiné zařízení nebude používat stejný kód k provedení jiné funkce. Rezervováno Tato kategorie zahrnuje kódy funkcí, které nejsou standardní, ale jsou již používány v zařízeních vyráběných různými společnostmi. Jedná se o kódy 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 a 127.Jedním z typických použití protokolu je čtení a zápis dat do registrů řadiče. Specifikace protokolu definuje čtyři datové tabulky:
Stůl | Typ položky | Typ přístupu |
---|---|---|
Vlajkové registry ( cívky ) | jeden kousek | číst a psát |
Diskrétní vstupy _ | jeden kousek | pouze čtení |
Vstupní registry _ | 16bitové slovo | pouze čtení |
Vedení registrů _ | 16bitové slovo | číst a psát |
K prvkům v každé tabulce se přistupuje pomocí 16bitové adresy, první buňka je adresa 0. Každá tabulka tedy může obsahovat až 65536 prvků. Specifikace nedefinuje, jaké prvky tabulky by měly být fyzicky a na jakých interních adresách zařízení by měly být dostupné. Například je přijatelné uspořádat překrývající se tabulky. V tomto případě budou instrukce, které pracují s diskrétními daty a s 16bitovými registry, ve skutečnosti přistupovat ke stejným datům.
Určitý zmatek je spojen se způsobem adresování dat. Modbus byl původně vyvinut pro regulátory Modicon. V těchto kontrolérech bylo použito speciální číslování pro každou z tabulek. Například první vstupní registr měl číslo pozice 30001 a první udržovací registr byl 40001. Adresa 107 udržovacího registru v příkazu Modbus byla tedy číslo registru 40108 řadiče. I když takové porovnávání adres již není součástí standardu, některé softwarové balíčky mohou automaticky „opravovat“ adresy zadané uživatelem, například odečtením 40001 od adresy registru úložiště. Referenční příručka z roku 1996 https://modbus.org/docs/PI_MBUS_300.pdf , kde bylo podobné adresování implicitně převzato, označeno jako zastaralé ("zastaralé" a "POUZE PRO STARŠÍ APLIKACE"), aktuální specifikace protokolu https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf používá pouze absolutní adresování - 01 (0x01) Read Coils 0x0000 až 0xFFFF, 03 (0x03) Read Holding Registers 0x0000 až 0xFFFF.
Chcete-li číst hodnoty z datových tabulek uvedených výše, použijte kódy funkcí 1-4 ( hexadecimální hodnoty 0x01-0x04):
Dotaz se skládá z adresy prvního prvku tabulky, jehož hodnota má být načtena, a počtu prvků, které mají být načteny. Adresa a množství dat jsou uvedeny jako 16bitová čísla, přičemž nejvýznamnější byte každého z nich je přenášen jako první.
Požadovaná data jsou odeslána v odpovědi. Počet bajtů dat závisí na počtu požadovaných položek. Před daty se přenese jeden bajt, jehož hodnota se rovná počtu bajtů dat.
Hodnoty úložných registrů a vstupních registrů se přenášejí počínaje zadanou adresou, dva bajty na registr, nejprve se přenese horní bajt každého registru:
bajt 1 | bajt 2 | bajt 3 | bajt 4 | … | byte N-1 | bajt N |
---|---|---|---|---|---|---|
R A,1 | R A,0 | R A+1,1 | R A+1,0 | … | R A+Q-1.1 | R A+Q-1,0 |
Hodnoty příznaků a digitálních vstupů jsou přenášeny v zabalené formě: jeden bit na příznak. Jedna znamená zapnuto, nula znamená vypnuto. Hodnoty požadovaných příznaků vyplňují nejprve první bajt, počínaje nejméně významným bitem, poté další bajty, rovněž od nejméně významného bitu k nejvýznamnějším. Nejméně významný bit prvního datového bytu obsahuje hodnotu příznaku zadaného v poli "adresa". Pokud požadovaný počet příznaků není násobkem osmi, pak jsou hodnoty extra bitů vyplněny nulami:
bajt 1 | … | bajt N | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F A+7 | F A+6 | F A+5 | F A+4 | F A+3 | F A+2 | F A+1 | F A | … | 0 | … | 0 | F A+Q-1 | F A+Q-2 | … |
Příkaz se skládá z adresy prvku (2 bajty) a nastavené hodnoty (2 bajty).
U přídržného registru je hodnota jednoduše 16bitové slovo.
U příznaků hodnota 0xFF00 znamená zapnuto, 0x0000 znamená vypnuto, ostatní hodnoty jsou neplatné.
Pokud je příkaz úspěšný, slave vrátí kopii požadavku.
Záznam více hodnotPříkaz se skládá z adresy prvku, počtu prvků, které se mají změnit, počtu bajtů nastavených hodnot, které mají být přeneseny, a samotných nastavených hodnot. Data jsou zabalena stejným způsobem jako v příkazech pro čtení dat.
Odpověď se skládá z počáteční adresy a počtu změněných prvků.
Změna registrůPříkaz se skládá z adresy registru a dvou 16bitových čísel, která se používají jako masky, které lze použít k individuálnímu resetování nebo nastavení jednotlivých bitů v registru. Konečný výsledek je určen vzorcem:
Výsledek = ( Current_value AND Mask_AND ) OR ( Mask_OR AND (NOT Mask_AND ))
Čtení s psanímTento funkční kód provádí kombinaci jedné operace čtení a jedné operace zápisu v jedné transakci Modbus.
Datové frontyFunkce je navržena tak, aby přijímala 16bitová slova z fronty FIFO (first-in-first-out).
Přístup k souboruTyto funkce se používají pro přístup k 16bitovým registrům organizovaným do souborů o libovolné délce záznamů. Příkaz specifikuje číslo souboru, číslo záznamu a délku záznamu v 16bitových slovech. Jediným příkazem můžete zapisovat nebo číst několik záznamů, ne nutně sousedních.
Příkaz navíc obsahuje jednobajtový kód označující typ datového odkazu. Aktuální verze standardu definuje pouze jeden typ (popsaný výše) s kódem 0x06.
Níže uvedené funkce jsou pro zařízení na sériových linkách (Modbus RTU a Modbus ASCII).
Funkce je určena pro získávání informací o stavových indikátorech na vzdáleném zařízení. Funkce vrací jeden bajt, jehož každý bit odpovídá stavu jednoho indikátoru.
Tyto funkce jsou určeny k testování funkčnosti sériové linky.
Funkce je určena pro získání informací o typu zařízení a jeho stavu. Formát odpovědi závisí na zařízení.
Funkce je navržena pro přenos dat v libovolných formátech (definovaných jinými standardy) z master (klienta) na slave (server) a naopak.
Typ přenášených dat je určen doplňkovým kódem (MEI - Modbus Encapsulated Interface) vysílaným za číslem funkce. Norma definuje MEI 13 (0x0D), která má zapouzdřit protokol CANopen . MEI 14 (0x0E) se používá k získání informací o zařízení a MEI v rozsahu 0-12 a 15-255 jsou vyhrazeny.
Během komunikace mohou nastat dva typy chyb:
Při přenosu po asynchronních komunikačních linkách jsou chyby prvního typu detekovány kontrolou souladu přijatého požadavku se zavedeným formátem ADU a výpočtem kontrolního součtu. Navíc lze ke kontrole každého znaku použít paritní bit . Pokud slave zařízení detekuje poškození dat, přijatý požadavek je ignorován a nevygeneruje se žádná zpráva s odpovědí. Hostitel může detekovat chybu bez odezvy.
Modbus TCP neposkytuje další kontroly integrity dat. Přenos dat bez zkreslení zajišťují protokoly TCP/IP.
Při chybách druhého typu podřízené zařízení odešle chybovou zprávu (pokud je požadavek adresován tomuto zařízení; na broadcastové požadavky není odeslána žádná odpověď). Indikace, že odpověď obsahuje chybovou zprávu, je nastavený horní bit čísla funkce. Za číslem funkce následuje kód chyby a případně další chybové údaje místo obvyklých údajů.
Níže je uveden příklad odezvy hlavního povelu a podřízeného zařízení (pro Modbus RTU).
Žádost | |||||||||||
Směr přenosu | adresa podřízeného zařízení | číslo funkce | Adresa | Počet příznaků | Počet datových bytů | Data | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
vysoký bajt | nízký bajt | vysoký bajt | nízký bajt | vysoký bajt | nízký bajt | nízký bajt | vysoký bajt | ||||
Klient→Server | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Odpovědět | |||||||||||
Směr přenosu | adresa podřízeného zařízení | číslo funkce | Adresa | Počet příznaků | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
vysoký bajt | nízký bajt | vysoký bajt | nízký bajt | nízký bajt | vysoký bajt | ||||||
Server→Klient | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Chybové hlášení | |||||||||||
Směr přenosu | adresa podřízeného zařízení | číslo funkce | chybový kód | CRC | |||||||
nízký bajt | vysoký bajt | ||||||||||
Server→Klient | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Fyzické vrstvy |
| ||||||
Protokoly |
| ||||||
Oblasti použití | |||||||
Implementace |
|