05.11.2014 Views

MODBUS Messaging Implementation Guide 1 0 b

MODBUS Messaging Implementation Guide 1 0 b

MODBUS Messaging Implementation Guide 1 0 b

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!