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