A Modbus egy nyílt kommunikációs protokoll , amely a master-slave architektúrán alapul ( angolul master -slave ; a Modbus szabványban a kliens-szerver kifejezéseket használják ). Az iparban széles körben használják elektronikus eszközök közötti kommunikáció megszervezésére . Használható adatátvitelre soros kommunikációs vonalakon RS-485 , RS-422 , RS-232 és TCP/IP (Modbus TCP) hálózatokon. Vannak nem szabványos UDP -t használó implementációk is [1] [2] .
Ne keverje össze a "Modbus" és a "Modbus Plus" kifejezéseket. A Modbus Plus a Schneider Electric tulajdonában lévő szabadalmaztatott protokoll . A Modbus Plus fizikai rétege egyedülálló, hasonló az Ethernet 10BASE-T- hez , félduplex egy csavart érpáron , sebessége 2 Mbps. A Modbus Plus szállítási protokoll a HDLC , amelyen a Modbus PDU átvitel kiterjesztése van megadva.
A JBUS a Modbus RTU protokoll egy részhalmaza, kis eltérésekkel a címzési módszerben [3] .
A Modbus-t a Modicon (jelenleg a Schneider Electric tulajdona ) fejlesztette ki programozható logikai vezérlőiben való használatra . A protokoll specifikációt először 1979-ben tették közzé [4] . Ez egy nyílt szabvány volt, amely leírta az üzenetek formátumát és azt, hogy hogyan továbbították őket különféle elektronikus eszközök hálózatán.
Kezdetben a MODICON vezérlők az RS-232 [4] soros interfészt használták . Később az RS-485 interfészt kezdték használni, mivel nagyobb megbízhatóságot biztosít, lehetővé teszi hosszabb kommunikációs vonalak használatát és több eszköz csatlakoztatását egy vonalhoz.
Számos elektronikai berendezés gyártója támogatta a szabványt, több száz ezt használó termék jelent meg a piacon.
A Modbus fejlesztését jelenleg a Modbus-IDA [5] non-profit szervezet végzi .
A Modbus 4 adattípust határoz meg:
A Modbus szabványok 3 részből állnak:
A szabvány fő előnyei a nyitottság és a tömegjelleg. Az ipar jelenleg (2014) számos típusú és modellt gyárt érzékelőkből, aktuátorokból, jelfeldolgozó és normalizáló modulokból stb. Szinte minden ipari felügyeleti és vezérlőrendszer rendelkezik szoftver-illesztőprogramokkal a Modbus hálózatokkal való együttműködéshez.
A szabványt alapvetően 1979-ben dolgozták ki, figyelembe véve az akkori igényeket és számítási lehetőségeket, és számos, a modern ipari hálózatok szempontjából lényeges kérdést nem vettek figyelembe [6] . Ezen jellemzők hiánya a protokoll egyszerűségének a következménye, ami megkönnyíti a tanulmányozását és felgyorsítja a megvalósítást.
A Modbus buszon lévő vezérlők egy kérésből és válaszból álló tranzakciókon alapuló master-slave modell segítségével kommunikálnak.
Általában csak egy master ( a régi terminológia szerint master ) eszköz van a hálózatban, és több slave ( a régi terminológia szerint slave szerver ) eszköz . A mester tranzakciókat kezdeményez (kéréseket küld). A master egyenként címezheti a kérést bármelyik slave-nek, vagy üzenetszórási üzenetet kezdeményezhet az összes slave számára. A slave eszköz, miután felismerte a címét, válaszol egy kifejezetten neki címzett kérésre. Ha üzenetszórási kérelem érkezik, a slave eszközök nem generálnak választ.
A Modbus specifikáció leírja a kérések és válaszok szerkezetét. Alapjuk egy elemi protokollcsomag, az úgynevezett PDU ( Protocol Data Unit ). A PDU felépítése független a kapcsolat típusától, és egy funkciókódot és egy adatmezőt tartalmaz. A funkciókód egybájtos mezőként van kódolva, és 1…127 tartományban vehet fel értékeket. A 128…255 értéktartomány a hibakódok számára van fenntartva. Az adatmező változó hosszúságú lehet. A PDU-csomag mérete 253 bájtra korlátozott.
funkció kódja | adat |
---|---|
1 bájt | N ≤ 252 (byte) |
Egy csomag fizikai kommunikációs vonalakon való továbbításához a PDU-t egy másik, további mezőket tartalmazó csomagba kell helyezni. Ezt a csomagot ADU-nak ( Application Data Unit ) hívják. Az ADU formátuma a hivatkozás típusától függ. Az ADU-nak három változata létezik, kettő adatátvitelre aszinkron interfészen , egy pedig TCP/IP hálózaton keresztül:
Az ADU általános felépítése a következő (a megvalósítástól függően előfordulhat, hogy néhány mező hiányzik):
a szolga (szolga) eszköz címe | funkció kódja | adat | hibaérzékelő blokk |
---|
ahol
Az ADU maximális mérete RS232/RS485 soros hálózatoknál 256 bájt, TCP hálózatoknál 260 bájt.
A Modbus TCP ADU esetében így néz ki:
Tranzakció azonosítója | Protokollazonosító | csomag hossza | rabszolga cím | funkció kódja | adat |
---|
ahol
Meg kell jegyezni, hogy a Modbus TCP-ben nincs hibaellenőrző mező, mivel az adatok integritását a TCP / IP verem biztosítja.
A jelenlegi protokollspecifikáció a funkciókódok három kategóriáját határozza meg:
Szabványos parancsok Leírásukat a Modbus-IDA-nak közzé kell tennie és jóvá kell hagynia. Ez a kategória magában foglalja a már definiált és jelenleg nem használt kódokat is. Egyéni parancsok Két kódtartomány (65-72 és 100-110), amelyekhez a felhasználó tetszőleges funkciót rendelhet. Nem garantált azonban, hogy más eszközök nem használják ugyanazt a kódot egy másik funkció végrehajtására. fenntartott Ebbe a kategóriába tartoznak azok a funkciókódok, amelyek nem szabványosak, de a különböző cégek által gyártott készülékekben már használatosak. Ezek a 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 és 127 kódok.A protokoll egyik tipikus felhasználási módja az adatok olvasása és írása a vezérlőregiszterekbe. A protokoll specifikációja négy adattáblát határoz meg:
asztal | Tárgy típusa | Hozzáférés típusa |
---|---|---|
Zászlóregiszterek ( tekercsek ) | egy kicsit | Olvass és írj |
Diszkrét bemenetek _ | egy kicsit | csak olvasni |
Bemeneti regiszterek _ | 16 bites szó | csak olvasni |
Birtoknyilvántartások _ _ | 16 bites szó | Olvass és írj |
Az egyes táblák elemei 16 bites címmel érhetők el, az első cella a 0. Így minden tábla legfeljebb 65536 elemet tartalmazhat. A specifikáció nem határozza meg, hogy fizikailag melyek legyenek a táblázatelemek, és milyen belső eszközcímeken legyenek elérhetők. Például elfogadható az egymást átfedő táblázatok rendezése. Ebben az esetben a diszkrét adatokkal és 16 bites regiszterekkel működő utasítások ténylegesen ugyanazokhoz az adatokhoz férnek hozzá.
Némi zűrzavar társul az adatok kezelésének módjához. A Modbus eredetileg Modicon vezérlőkhöz lett kifejlesztve. Ezekben a vezérlőkben minden táblázathoz külön számozást használtak. Például az első bemeneti regiszter a 30001 helyszámú, az első tartási regiszter pedig a 40001 volt. Így a Modbus parancsban a 107-es tárolóregiszter-cím a vezérlő 40108-as regiszterszáma volt. Bár az ilyen címegyeztetés már nem része a szabványnak, egyes szoftvercsomagok képesek automatikusan "javítani" a felhasználó által beírt címeket, például úgy, hogy a tárolóregiszter-címből levonják a 40001-et. Referencia kézikönyv 1996-ból https://modbus.org/docs/PI_MBUS_300.pdf , ahol implicit módon hasonló címzést alkalmaztak, elavultként jelölve ("elavult" és "CSAK RÖGÖLT ALKALMAZÁSOKHOZ"), a jelenlegi protokoll specifikáció https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf csak abszolút címzést használ - 01 (0x01) Olvasási tekercsek 0x0000 - 0xFFFF, 03 (0x03) 0x0000 - 0xFFFF tárolóregiszterek olvasása.
A fent felsorolt adattáblázatok értékeinek kiolvasásához használja az 1-4 függvénykódokat ( hexadecimális értékek 0x01-0x04):
A lekérdezés a táblázat első elemének címéből, amelynek értékét be kell olvasni, és az olvasandó elemek számából áll. A címet és az adatmennyiséget 16 bites számként adjuk meg, mindegyikből a legjelentősebb bájt kerül először továbbításra.
A kért adatokat a válaszban elküldjük. Az adatok bájtjainak száma a kért elemek számától függ. Az adatok előtt egy bájt kerül átvitelre, amelynek értéke megegyezik az adatbájtok számával.
A tárolóregiszterek és a bemeneti regiszterek értékei a megadott címtől kezdve, regiszterenként két bájttal kerülnek átvitelre, először minden regiszter magas bájtja:
1. bájt | 2. bájt | 3. bájt | 4. bájt | … | N-1 bájt | bájt 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 |
A zászlók és a digitális bemenetek értékei csomagolt formában kerülnek továbbításra: zászlónként egy bit. Az egyik azt jelenti, hogy be van kapcsolva, a nulla azt jelenti, hogy kikapcsolt. A kért jelzők értékei először az első bájtot töltik ki, a legkisebb jelentőségű bittel kezdve, majd a következő bájtokat, szintén a legkisebb jelentőségű bittől a legjelentősebbekig. Az első adatbájt legkisebb jelentőségű bitje a "cím" mezőben megadott flag értékét tartalmazza. Ha a jelzők kért száma nem nyolcszoros, akkor az extra bitek értékeit nullákkal töltjük fel:
1. bájt | … | bájt 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 | … |
A parancs az elem címéből (2 bájt) és a beállított értékből (2 bájt) áll.
Egy holdingregiszter esetében az érték egyszerűen egy 16 bites szó.
A jelzők esetében a 0xFF00 érték bekapcsolt, a 0x0000 kikapcsolt értéket jelenti, a többi érték érvénytelen.
Ha a parancs sikeres, a slave visszaküldi a kérés másolatát.
Több érték rögzítéseA parancs az elem címéből, a módosítandó elemek számából, a továbbítandó beállított értékek bájtjaiból és magukból a beállított értékekből áll. Az adatok csomagolása ugyanúgy történik, mint az adatolvasási parancsokban.
A válasz a kiindulási címből és a megváltozott elemek számából áll.
Regiszterek megváltoztatásaA parancs egy regiszter címéből és két 16 bites számból áll, amelyek maszkként használhatók a regiszter egyedi bitjeinek visszaállítására vagy beállítására. A végeredményt a következő képlet határozza meg:
Eredmény = ( Jelenlegi_érték ÉS Maszk_ÉS ) VAGY ( Maszk_VAGY ÉS (NEM maszk_ÉS ))
Olvasás írássalEz a funkciókód egy olvasási és egy írási művelet kombinációját hajtja végre egy Modbus tranzakcióban.
AdatsorokA funkciót úgy tervezték, hogy 16 bites szavakat fogadjon egy first-in-first-out ( FIFO ) sorból.
Fájl hozzáférésEzek a funkciók tetszőleges hosszúságú rekordokba rendezett 16 bites regiszterek elérésére szolgálnak . A parancs 16 bites szavakban adja meg a fájl számát, a rekord számát és a rekord hosszát. Egyetlen paranccsal több rekordot írhat vagy olvashat, nem feltétlenül szomszédosakat.
Ezenkívül a parancs egy egybájtos kódot tartalmaz az adathivatkozás típusának jelzésére. A szabvány jelenlegi verziója csak egy típust határoz meg (a fentebb leírtak szerint) 0x06 kóddal.
Az alább felsorolt funkciók soros vonalon (Modbus RTU és Modbus ASCII) lévő eszközökre vonatkoznak.
A funkció célja, hogy információkat szerezzen a távoli eszköz állapotjelzőiről. A függvény egy bájtot ad vissza, amelynek minden bitje egy indikátor állapotának felel meg.
Ezek a funkciók a soros kapcsolat működőképességének tesztelésére szolgálnak.
A funkció célja, hogy információkat szerezzen az eszköz típusáról és állapotáról. A válasz formátuma az eszköztől függ.
A funkciót úgy tervezték, hogy tetszőleges (más szabványok által meghatározott) formátumban továbbítsa az adatokat a mesterről (kliensről) a slave-re (szerverre) és fordítva.
A továbbított adatok típusát a funkciószám után továbbított kiegészítő kód (MEI - Modbus Encapsulated Interface) határozza meg. A szabvány a MEI 13-at (0x0D) határozza meg, amelynek célja a CANopen protokoll beágyazása . A MEI 14 (0x0E) az eszközinformációk lekérésére szolgál, a 0-12 és 15-255 tartományba eső MEI-k pedig le vannak foglalva.
A kommunikáció során kétféle hiba fordulhat elő:
Aszinkron kommunikációs vonalakon keresztül történő átvitel során az első típusú hibákat a fogadott kérés beállított ADU formátumnak való megfelelőségének ellenőrzésével és az ellenőrző összeg kiszámításával észleljük. Ezenkívül egy paritásbit is használható az egyes karakterek ellenőrzésére . Ha a slave adatsérülést észlel, a kapott kérést figyelmen kívül hagyja, és nem generál válaszüzenetet. A gazdagép képes észlelni a nincs válasz hibát.
A Modbus TCP nem biztosít további adatintegritás-ellenőrzést. A torzításmentes adatátvitelt a TCP/IP protokollok biztosítják.
A második típusú hibák esetén a szolga eszköz hibaüzenetet küld (ha a kérés ennek az eszköznek szól, nem küld választ a broadcast kérésekre). Azt jelzi, hogy a válasz hibaüzenetet tartalmaz, a függvényszám beállított magas bitje. A funkciószámot a hibakód és szükség esetén a szokásos adatok helyett további hibaadatok követik.
Az alábbiakban egy példa látható a master parancsra és a slave válaszokra (Modbus RTU-hoz).
Kérés | |||||||||||
Átviteli irány | slave eszköz címe | funkció száma | Cím | A zászlók száma | Adatbájtok száma | Adat | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
magas bájt | alacsony bájt | magas bájt | alacsony bájt | magas bájt | alacsony bájt | alacsony bájt | magas bájt | ||||
Kliens → Szerver | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Válasz | |||||||||||
Átviteli irány | slave eszköz címe | funkció száma | Cím | A zászlók száma | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
magas bájt | alacsony bájt | magas bájt | alacsony bájt | alacsony bájt | magas bájt | ||||||
Szerver→ Kliens | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Hiba üzenet | |||||||||||
Átviteli irány | slave eszköz címe | funkció száma | hibakód | CRC | |||||||
alacsony bájt | magas bájt | ||||||||||
Szerver→ Kliens | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Fizikai rétegek |
| ||||||
Protokollok |
| ||||||
Felhasználási területek | |||||||
Megvalósítások |
|