MODBUS Messaging Implementation Guide 1 0 b
MODBUS Messaging Implementation Guide 1 0 b
MODBUS Messaging Implementation Guide 1 0 b
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Önálló laboratórium beszámoló<br />
SNC 42 Adatgyűjtő készülékbe<br />
<strong>MODBUS</strong> TCP protokoll implementálása<br />
Konzulens<br />
Dr. Csubák Tibor
1. Az SNC-42 adatgyűjtő készülék<br />
A Smart Network Calculator (SNC) egy nyolc csatornás adatgyűjtő készülék mely<br />
lehetőséget biztosít három darab DATAREC készülék XBUS hálózatra való csatlakoztatását és a<br />
mért értékek tárolására. A letárolt adatokat több napig képes megőrizni anélkül, hogy felül<br />
íródnának így akár egy hosszabb hálózati kimaradás esetén is képes az adatvesztést<br />
megakadályozni. Továbbá lehetséges a készülék paramétereinek módosítása, pillanatértékek<br />
megjelenítésé és a letárolt adatok táblázatos és grafikus megjelenítése a beágyazott HTTP szerveren<br />
keresztül. Az adatok archiválása érdekében az adatokat távoli FTP szerverre lehet letárolni. A<br />
készülék biztosítja az RS232 és RS485 alapú hálózatok ethernet hálózatra való illesztését. Az SNC-<br />
42 nem csak a távfelügyeletet teszi lehetővé, mert rendelkezik továbbá egy HMI interfésszel mely<br />
lehetővé teszi a technológiai személyzet számára is a felügyeletet.<br />
Az SNC-42 hardverjének az alapját képezi a Rabbit Semmiconductors által gyártott<br />
RCM4200-as core modul. A core modul a Rabbit 4000 mikroproceszorból és a hozzá illesztett<br />
perifériákból tevődik össze. A fontosabb perifériák a következők: program és adatmemória, ethernet<br />
modul, A/D átalakító, RS232 és RS485 modul. A modul alkalmazása esetén a felhasználónak csak a<br />
külső perifériák illesztéséről kell gondoskodnia, így nagyban csökken az új készülék kifejlesztésére<br />
szükséges mérnöki munkaóra és ennek következményeképpen a költségek alacsonyabbak lesznek.<br />
A Rabbit 4000 mikroprocesszor órajele maximálisan 60 MHz lehet és maximálisan 16 MB<br />
külső SRAM memóriát támogat melyhez három engedélyező jel és két-két írást, illetve olvasást<br />
engedélyező jeleket biztosítja, melyek segítségével maximum 6 darab modul illesztése lehetséges..<br />
A processzor tápfeszültsége 1,8V és 3,3V lehet emellett alacsony fogyasztású módokat is támogat.<br />
2. A <strong>MODBUS</strong> protokoll<br />
A modbus protokoll egy ipari alkalmazásokhoz fejlesztett kommunikációs protokoll melyet<br />
a Modicon cég fejlesztett ki és publikáltak 1979-ben. A protokollt eleinte PLC vezérlőikkel történő<br />
adatátvitelre tervezték. A Modbus protokoll az OSI modell szerinti alkalmazás rétegbe (application<br />
layer) sorolható.<br />
A protokoll előnyei, hogy ipari alkalmazásokhoz lett fejlesztve ezenkívül jogdíjmentesen<br />
használható és a specifikáció szabadon hozzáférhető. A protokoll master/slave alapú<br />
kommunikációt valósít meg. Egy hibamentes tranzakciót az alábbi kép szemlélteti:
A protokoll több változata is ismert melyek az alkalmazott fizikai réteghez történő illesztésben<br />
különböznek.<br />
Az általános <strong>MODBUS</strong> protokoll keretet a következő ábra szemlélteti:<br />
ADU: Application Data Unit, maximálisan 256 bájt.<br />
PDU: Protokoll Data Unit, maximális mérete 253 bájt.<br />
Error check: ellenörző összeg maximálisan 2 bájt.<br />
Additional address: a slave eszköz címe, 1 bájt<br />
A PDU független az alkalmazott <strong>MODBUS</strong> változattól értelmezése a <strong>MODBUS</strong> parancstól függ.<br />
<strong>MODBUS</strong> protokoll változatok:<br />
Modbus RTU:<br />
A modbus soros vonalon alkalmazott változatta. A fizikai réteg lehet RS232, RS422 vagy<br />
RS485. Az elküldendő adatokat a protokoll keretekbe csomagolja. A keret elejét és végét legalább<br />
3,5 bájt átvitelének megfelelő időintervallumnyi tétlen állapot jelzi (9600 baudnál 4 ms). A keret<br />
bájtjait egymás után küldjük el. Ha két bájt között nagyobb mint 1,5 karakternyi tétlenségi idő áll<br />
fenn, akkor a küldött keret érvénytelennek minősül.
A modbus RTU keret a slave eszköz címéből, a PDU-ból és a CRC ellenőrző összegből<br />
tevődik össze.<br />
Az érvényes slave eszköz címek:<br />
• 0 (broadcast)<br />
• 1-247 (érvényes slave címek)<br />
• 248-255 (fenntartott).<br />
A protokoll által előírt soros kommunikáció paraméterei:<br />
• 1 start bit<br />
• 8 adatbit LSB elöl<br />
• 1 paritás bit<br />
• 1 stop bit<br />
Modbus ASCII:<br />
Anyiban tér el a <strong>MODBUS</strong> RTU-tól, hogy az adatok ASCII karakterekben kerülnek<br />
továbbításra. Start bit helyett ':' karaktert, stop bit helyett CR LF (soremelés, kocsi vissza)<br />
karaktereket küldjük el. Hibadtektálásra LRC összeget használ. Ez a protokoll kevésbé effektív mint<br />
az RTU, mert 1 bájtot kettő karakterként küldünk el (például 0x5B esetén a 0x35 és a 0x42<br />
karaktereket kell elküldeni).<br />
A protokoll által előírt soros kommunikáció paraméterei:<br />
• 1 start bit<br />
• 7 adatbit LSB elöl<br />
• 1 paritás bit<br />
• 1 stop bit<br />
Modbus Plus(Modbus+,MB+,MBP):<br />
A modbus plus protokoll jogdíj köteles. A fizikai réteg szintén RS485 de Token üzenetek<br />
használ így maximum 1Mbit/s-os sebességet lehet elérni.<br />
Modbus TCP:<br />
A protokoll ezen változata lehetővé teszi, hogy a kommunikációt TCP/IP hálózaton keresztül<br />
valósítsuk meg. Mihelyt a legtöbb vállalat rendelkezik kiépített ethernet alapú hálózattal, ezért az<br />
adatgyűjtő vagy vezérlő eszközöket egyszerűen lehet a felsőbb vállalatirányítási rendszerekbe<br />
integrálni. A soros vonali változatokkal megőrizte a kompatibilitást ezért lehet olyan átjárókat<br />
készíteni melyek biztosítják a soros, illetve a TCP hálózat közötti átjárást.<br />
A soros vonali változatokhoz képesti eltérések a fejlécben és az ellenőrző összeg hiányában<br />
jelentkeznek. Az ellenőrző összeg elhagyható mert a TCP protokoll biztosítja az adatok hibátlan<br />
továbbítását és fogadását. Mihelyt a TCP protokol kapcsolat orientált ezért nem lehetséges<br />
broadcast üzenetek küldése.<br />
A modbus TCP header a következő adatmezőkből tevődik össze:<br />
• transaction identifier: a kérés és a megfelelő<br />
válasz párosítására szolgál.<br />
• protocol identifier: modbus protokoll esetén 0<br />
• length: a következő bájtok száma<br />
• unit identifier: a slave eszköz azonosítására<br />
szolgál
Kiterjesztett header miatt a keret teljes hossza 260 bájt lett de a PDU maximális hossza<br />
maradt 253 bájt.<br />
A modbus tcp protokoll alapértelmezetten az 502-es TCP portot használja de port szám<br />
általábban szabadon választható.<br />
A <strong>MODBUS</strong> PDU (Protokol Data Unit) :<br />
A modbus PDU általános felépítését az alábbi ábra szemlélteti:<br />
A function code mező a modbus parancs azonosítóját a Data mező pedig a parancs<br />
paramétereit vagy a választ tartalmazzák.<br />
A protokoll négy különböző adattipust különböztet meg:<br />
• Discrete Input: egy bites, csak olvasható, digitális bemenetek leképzésére alkalmazzák.<br />
• Coils: egy bites, írható-olvasható, digitális kimenetek leképzésére alkalmazzák.<br />
• Input Registers: 16 bites, csak olvasható regiszterek.<br />
• Holding Registers: 16 bites írható-olvasható regiszterek.<br />
A modbus parancsok három csoportra oszthatók: publikus parancsok, felhaználó által<br />
definiált parancsok, fentartott parancsok. Összesen 256 parancs definiálható.<br />
A publikus parancsokra a szabvány részletesen kiterjed. A specifikációk követése minden<br />
modbus protokollt alkalmazó eszköznek kötelező, mivel ez biztosítja a különböző gyártóktól érkező<br />
eszközök kompatibilitását. Ha el szeretnénk térni a specifikált parancsoktól akkor saját parancsok<br />
definiálása is lehetséges. Erre a célra a 65-72 és a 100-110-ig terjedő kódtartományt vehetjük<br />
igénybe. A fenntartott parancsok kategóriában található parancsokat néhány gyártó használja<br />
régebbi készülékeikkel történő kommunikációra.<br />
A parancskódok MSB bitje hibajelzésre szolgál. Hibajelzést csak a slave küldhet a master<br />
egységnek. A hibajelzést tartamazó PDU két adatmezőből áll: a módosított parancskódból és egy<br />
hibakódból melynek lehetséges értékeit és jelentéseit a következő táblázat szemlélteti.<br />
Modbus hibakódok<br />
kód<br />
jelentés<br />
01 Illegal Function<br />
02 Illegal Data Address<br />
03 Illegal Data Value<br />
04 Server Device Failure<br />
05 Acknowledge<br />
06 Server Device Bussy<br />
08 Memory parity error<br />
0A<br />
Gateway Path Unavailible
0B<br />
Modbus hibakódok<br />
Gateway Target Device Failed to Respond<br />
a publikus modbus parancsok<br />
A modbus parancsok közül a read holding register parancsot szeretném részletesebben<br />
bemutatni, mert ezzel a paranccsal lehet az egyszerűbb adatlekérdezéseket végrehajtani és az SNC-<br />
42-be is ezt a parancsot implementáltam.<br />
A modbus PDU function kód adatmezeje 03 értékű. A kezdő cím 0-65535 közötti tetszőleges<br />
érték lehet. A regiszterek száma 1-125 közötti értéket veheti fel a modbus keret 260 bájtos<br />
korlátozása miatt. A regiszterek számának megadásánál ügyelni kell arra, hogy a címzési tartományt<br />
ne lépjük túl.<br />
3. A megvalósított program:
A megvalósítandó feladatom az volt, hogy az SNC-42-ben tárolt pillanatértékeket modbus<br />
TCP protokoll segítségével le lehessen kérdezni személyi számítógépen keresztül. A feladat<br />
megoldásához a read holding register modbus parancsot valósítottam meg az eszközön.<br />
A program a Dynamic C fejlesztői környezetben lett megvalósítva mely a Rabbit cég által<br />
biztosított program. A Dynamic C alapját az ANSI C képzi, melyet a gyártó kiegészített a fejlesztést<br />
segítő utasításokkal mint például a kiterjesztett memória elérése vagy a multitaskingot támogató<br />
direktívákkal. Továbbá a fordítóhoz mellékelnek komplett függvénykönyvtárakat, melyek lehetővé<br />
teszik az I/O vonalak egyszerű kezelését. A függvénykönyvtárak tartalmaznak továbbá egy<br />
teljesértékű TCP/IP stacket és magasabb szintű szolgáltatásokat megvalósító kódrészleteket is, mint<br />
például Telnet, HTTP és FTP. A multi tasking megvalósításához a CoExec függvénykönyvtárat<br />
használjuk melyet az SHDesign cég készített el.<br />
Első lépésként a modbus parancsok számára létrehoztam a megfelelő holding regisztereket<br />
és a szabványnak megfelelő címkiosztást hoztam létre. Ehez definiáltam egy struktúrát mely<br />
tartalmazza a slave eszköz azonosítóját, az adat kezdőcímét, az adat hosszát, magát az adatot<br />
(fizikai memória címét). A regiszterek inicializálását a mb_reg_init függvény végzi el.<br />
slave azonosító kezdőcím hossz (bájtok száma) adat<br />
0 0 4 idő<br />
0 4 251 Saját adatgyűjtő<br />
pillanatértékekei<br />
1 0 251 1. állomás<br />
pillanatértékei<br />
2 0 251 2. állomás<br />
pillanatértékei<br />
3 0 251 3. állomás<br />
pillanatértékei<br />
A TCP/IP kommunikációt a mb_srv_task függvény végzi el. Ez a taszk folyamatosan<br />
várakozik bejövő kapcsolatra. Ha a megfelelő IP címmel és port számmal (a tesztelés ideje alatt<br />
bármilyen IP címmel és a 443-as portszámmal lehet kapcsolódni az SNC-42-höz) akkor a szerver<br />
taszk meghívja a read_request függvényt mely a TCP socket bejövő bufferéből kiolvassa a beérkező<br />
parancsot és fejléc és PDU részre szétválasztja az üzenetet. Ezután a create_response függvény<br />
létrehozza a válasz üzenetet melyet végül a szerver taszk elküld a masternek. Amennyiben hibás<br />
címről kér adatot a master vagy nem értelmezett parancsot kell végrehajtani, akkor a megfelelő<br />
hibaüzenet kerül továbbításra.<br />
Az eszközön értelmezett lehetséges modbus parancsok egy részét az alábbi táblázat foglalja össze.<br />
Transaktio<br />
n ID<br />
Protokol<br />
ID<br />
Length<br />
Slave<br />
ID<br />
Function<br />
Code<br />
Starting<br />
Address<br />
Register<br />
Quantity<br />
leírás<br />
- 0 6 0 3 0 2 idő<br />
- 0 6 0 3 4 1<br />
- 0 6 0 3 5 16<br />
- 0 6 0 3 55 16<br />
Saját adatgyűjtő<br />
csatornáinak száma (csak<br />
a felső bájt)<br />
Saját adatgyűjtő csatorna<br />
státuszok (8db)<br />
Saját adatgyűjtő<br />
pillanatértékei (8db)
- 0 6 0 3 55 2<br />
- 0 6 0 3 57 2<br />
Saját adatgyűjtő első<br />
csatornájának<br />
pillanatértéke<br />
Saját adatgyűjtő második<br />
csatornájának<br />
pillanatértéke<br />
- 0 6 1 3 51 N*2<br />
Az első álomás N<br />
csatornájának<br />
pillanatértékei (nincs<br />
tesztelve)<br />
A következő két képen a program megfelelő működését szeretném bemutatni. Az első<br />
program a Simply Modbus TCP kimenetét mutatja a pillanatértékek lekérdezése után. Ezzel a<br />
programmal lehet a modbus adatfolyamokat tesztelni. A második ábrán az SNC-42 internetes<br />
kezelőfelületének segítségével kiolvasott pillanatértékek láthatók.
Irodalomjegyzék<br />
1. Lami Péter: Modbus TCP protokoll implementálása SNC-42 adatgyűjtő készülékbe<br />
2. Modbus Application Protokolló Specification V1.1b<br />
3. <strong>MODBUS</strong> MESSAGING ON TCP/IP IMPLEMENTATION GUIDE V1.0b<br />
4. <strong>MODBUS</strong> over Serial Line Specification and <strong>Implementation</strong> <strong>Guide</strong> V1.02<br />
5. Dynamic C TCP/IP User's manual<br />
6. Dynamic C 10 Users Manual<br />
7. Users manual: RCM4200 RabbitCore C programmable Analog Core Module with Serial Flash<br />
and Ethernet