Modbus: Az eredeti ipari terepibusz-protokoll
Modbus remains widely deployed because its data model is simple, not because every implementation is simple. This guide explains frames, register mapping, ti...
A terepibusz ipari hálózatokban használt kommunikációs protokoll, amely a terepi eszközöket ipari vezérlőkhöz csatlakoztatja. A terepibusz csökkenti a vezérlők és eszközök közötti szükséges kábelezés mennyiségét, mivel több eszköz ugyanahhoz a két vezetékhez csatlakozhat.
Számos népszerű terepibusz-technológia létezik, köztük a Modbus, a Profibus, a Foundation Fieldbus, a ControlNet, a DeviceNet és sok más.
1979-ben a Modicon új protokollt vezetett be, amely az OSI-modell alkalmazási rétegét használta ki, kifejezetten a PLC-ihez. Ezt a protokollt Modbusnak nevezték el, és ez lett az automatizálás történetének első széles körben használt terepi busza.

1. ábra. Terepi eszközökhöz csatlakoztatott PLC
Bevezetés a Modbusba
A Modbust a terepi eszközök ipari vezérlőkhöz való csatlakoztatására tervezték. Feltalálásakor a legtöbb eszköz feszültség- vagy áramértékekkel reprezentálta és kommunikálta az állapotát. A Modbus hatékonyan képes kezelni az érzékelők és beavatkozók magas/alacsony állapotát tükröző diszkrét biteket, valamint az analóg folyamatértékeknek megfelelő egész számokat tároló regisztereket.
A terepibusz-technológiákra való lassú áttérés következtében a Modbus az egyik legegyszerűbb protokoll lett, amelyhez az évek során új verziókat is hozzáadtak.
A Modbust eredetileg soros kommunikációs kapcsolaton, azaz RS-232/RS-485-ön keresztül valósították meg. Ezek a változatok ma is gyakran használatosak Modbus RTU és ASCII néven. A protokollt később TCP/IP és Ethernet használatára is adaptálták. Ezt általában Modbus TCP-nek nevezik, és ez a Modbus leggyakoribb megvalósítása a modern telepítésekben.
Kommunikációs modell
A Modbus kommunikációhoz mester/szolga modellt használ (Modbus TCP esetén kliens/szerver modellt). A Modbus-mester kérést küld egy Modbus-szolgának, amely végrehajtja a műveleteket, majd választ küld a mesternek. Ebben a helyzetben a mester gyakran PLC, míg a terepi eszközök szolgaként működnek.
A Modbusban az üzenetkeret egy alkalmazási adategységből (ADU) és egy protokoll-adategységből (PDU) áll. Az ADU a használt Modbus típusától függően eltérő, míg a PDU független a kommunikációs módszertől.
A PDU általában egy funkciókódból és némi adatból áll. Ezt az ADU egy címmel és hibavizsgálati kóddal egészíti ki. A Modbus TCP az ADU-ban MBAP (Modbus alkalmazási protokoll) fejlécet használ.

2. ábra. Modbus ADU és PDU Modbus ASCII/RTU (felül), illetve Modbus TCP (alul) esetén. A kép a Modbus.org alapján készült
Ahhoz, hogy a PDU független maradjon az alapul szolgáló kommunikációs rétegtől, meg kell felelnie az eredeti soros specifikáció méretkorlátainak. Ez az RS-485-ön továbbított ADU esetében 256 bájt volt. Ezért figyelembe kell vennünk az ADU-t: 1 cím bájtot és 2 hibakereső bájtot, ami azt jelenti, hogy a PDU teljes mérete legfeljebb 253 bájt lehet. Ne feledje, hogy az ADU-ban szereplő cím valójában a Modbus-hálózaton lévő slave eszköz azonosítója.
A PDU adatrésze a funkciókódhoz tartozó mezőket, valamint a ténylegesen továbbított adatokat tartalmazza. Ezeket a mezőket a cikk későbbi részében részletesen tárgyaljuk.
Adatábrázolás
A klasszikus Modbusnak két átviteli módja van: ASCII és RTU.
ASCII módban az adatokat 0–9 és A–F közötti ASCII-karakterekként küldik, míg RTU módban az adatok 8 bites bináris formában jelennek meg. Az adatokat és a címeket big-endian kódolással kódolják, ezért a legjelentősebb bájt kerül elsőként továbbításra.
A Modbus-adatoknak négy elsődleges típusa van:
- Diszkrét bemenetek
- Tekercsek (kimenetek)
- Bemeneti regiszterek
- Tartóregiszterek
A diszkrét bemenetek egyetlen adatbitet jelentenek, és csak olvashatók. A tekercsek szintén egyetlen bitet jelentenek, de olvashatók és írhatók is. A bemeneti regiszterek 16 bites csak olvasható adatokat jelentenek, míg a tartóregiszterek 16 bites írható-olvasható adatokat tartalmaznak.

3. ábra. Forrás: Modbus-protokoll specifikációja
Mindegyik típus esetén legfeljebb 2^16 (65536) adatelem helyezhető el az eszköz memóriájában. Az egyes adattípusok eléréséhez külön funkciókódok tartoznak, és gyakran minden típus saját dedikált memóriablokkal rendelkezik.
Egy adatelem címzéséhez a master egyszerűen a 0–65535 közötti tartományt használja. Az 1. adatelem a 0x0000 címen található. A 2. adatelem címe 0x0001. A 65536. adatelem a 0xFFFF címen található. Ne feledje, hogy az eszközöknek nem kötelező mind a 65536 adatelemmel rendelkezniük; a legtöbb Modbust használó távoli I/O-terminál valójában jóval a maximális határérték alatt marad.
Modbus-tranzakciók
Most, hogy megértettük, hogyan történik az adatok ábrázolása a Modbusban, részletesen megvizsgálhatjuk a tranzakciókat. Ezt a PDU szemszögéből tesszük, mivel a PDU kommunikációs rétegtől független.
A Modbus-tranzakciók hexadecimális karakteres utasításokat használnak, ahol egyetlen 8 bites bájt 0x00 formátumú, és minden karakter esetén a 0–F tartományt használja. Egy 16 bites regiszter így két bájtnak felel meg, 0x0000 formátumban ábrázolva.
A Modbus-specifikáció a PDU-k három típusát határozza meg:
- Modbus-kérés
- Modbus-válasz
- Modbus kivételválasz
A master a funkciókód használatával kezdeményezi a kérést, a slave pedig válaszként küldi el a választ. Sikeres válasz esetén a slave visszaküldi a master által küldött funkciókódot. Kivételválasz esetén ugyanazt a funkciókódot küldi vissza, de az MSB-t (legnagyobb helyiértékű bitet) magasra állítja annak jelzésére, hogy valami hiba történt.
A Modbus-specifikáció számos funkciókódot határoz meg. A 0x01 funkciókód a Read Coils funkciót jelöli.
A 4. ábra egy coilok olvasására irányuló kérés és válasz lehetséges formáját mutatja. A Modbus-master 0x01 funkciókóddal (Read Coils) küld kérést az első adatelemtől (0x0000 cím) kezdve, és mindössze egy coilt olvas. A Read Coils funkcióval egyszerre akár 2000 (0x7D0) coil is olvasható.

4. ábra. Coilok olvasására irányuló tranzakció
Siker esetén a slave ugyanazzal a funkciókóddal, valamint a válaszban szereplő coilok számával válaszol. A coilok állapotát n bájt tartalmazza, amelyek mindegyik bitje azt jelzi, hogy az adott coil BE (1) vagy KI (0) van-e kapcsolva.
Ebben az esetben a 0x0000 címen található coil BE van kapcsolva. Ha a kérés nem járt volna sikerrel, a kivételválasz a magasra állított MSB-vel rendelkező funkciókódot (0x81), valamint egy, a hiba okát megmagyarázó kivételkódot tartalmazott volna. A 0x02 kivételkód azt jelenti, hogy érvénytelen adatcímet használtak, vagyis ennek a slave-nek a memóriájában nincs coil a 0x0000 címen.
A következő példa egy egyetlen regiszter írására irányuló tranzakciót szemléltet (0x06 funkciókód). Ebben az esetben a master 0xA0A0 adatot kér a 0x00FF címen történő írásra. A slave válasza egyszerűen a kérés visszhangja.
Az itt látható példabeli kivételválasz a magasra állított MSB-vel rendelkező funkciókódot, valamint a 0x04 kivételkódot mutatja. Ez a kód azt jelenti, hogy helyreállíthatatlan hiba történt, miközben a slave megpróbálta végrehajtani a kérést.

5. ábra. Egyetlen regiszter írására irányuló tranzakció
Minden Modbus-funkciókód a fent bemutatott két példához hasonló mintát követ.
A 6. ábra a gyakori funkciókódok listáját mutatja a kivételválaszokhoz tartozó kivételkódokkal együtt. További információért tekintse meg a Modbus-specifikációt.

6. ábra. Funkciókódok és kivételkódok
Összegzés
A Modbus lehetővé teszi, hogy a PLC-k különféle távoli egységekkel kommunikáljanak, többek között I/O-bankokkal, terminálegységekkel és egyéb vezérlőkkel. Ehhez szabványos módszert használ a diszkrét és egész szám típusú információk olvasására és írására, így szinte minden olyan esetet lefed, amely digitális adatok átvitelével jár.
A Modbus ma ipari szabványnak számít, és mindeddig a legelterjedtebb jogdíjmentes ipari protokoll, annak ellenére, hogy megelőzi a legtöbb modern vezérlőrendszer megjelenését. Világszerte megtalálható üzemekben és gyárakban, és hosszú fennállása ellenére várhatóan még sok éven át releváns ipari protokoll marad.