Modbus logo

MODBUS

en: Modicon bus

A Modbus protokoll kialakulása szorosan összefonódott az első PLC születésével. Az első PLC, a "Modicon 084" 1969-ben kezdte meg első ciklusait, és rá egy évre, szükségszerűen létrehozták a Modbus-t. Az eredeti Modbus (eddigi ismereteim szerint) egy meglehetősen elbonyolított, de nyílt protokoll volt. Az eltelt több évtized azt bizonyítja, hogy a Modbus-t azért rendesen eltalálták a szerzői, bár, ez a protokoll már nem az, az 1970-es (más források szerint 1979-es) cucc.
Ezt jellemzően finoman úgy lehet megfogalmazni, hogy ez egy De-facto-standard, azaz, igen széles körben alkalmazott kommunikációs rendszer, amit ellenben mindenki úgy használ, ahogy akar. Vannak ugyan kötött szabályai, de a legtöbb gyártó ezeket meglehetősen tágan értelmezi.

Ezáltal, ha két Modbus-osnak definiált, de nem egy gyártótól származó eszközt kíván összekötni, a dolgot még véletlenül se bagatellizálja el, és a kommunikáció kipróbálása nélkül ne adjon rá árajánlatot (a fájdalmas tapasztalatok beszélnek belőlem).

A Modbus egy olyan protokoll, mint a világ háta mögötti, ember még soha nem járta madártelepek szigetei. A guano évről-évre rakódik le rajtuk, egyszerű rétegződéssel.

Próbáljuk meg első körben valahogy az OSI modellbe bepasszírozni ezt a protokollt. (A neten eddig ahány besorolás - annyiféle besorolás felállással találkoztam. Sebaj, ilyet én is tudok, így hadd mutassam be a Modbus n+1. modelljét, ta-ta-ta-taaa.).

Modbus OSI modell

OSI-szint Modbus TCP Modbus RTU / ASCII TCP/IP-szint
L
o
g
i
k
a
i

r
é
t
e
g
e
k
7 Alkalmazási
réteg
(Application)
Modbus Application Protokoll (MBAP) alkalmazási réteg
(application layer)
4
6 Megjelenítési
réteg
(Presentation)
5 Viszonylati réteg
(Session)
A
d
a
t
á
t
v
i
t
e
l
i

r
é
t
e
g
e
k
4 Forgalmazási
réteg
(Transport)
TCP   forgalmazási réteg
(transport layer)
3
3 Hálózati
Réteg
(Network)
IPv4
IPv6
  Internet réteg
(Internet layer)
2
2 Adatkapcsolati
réteg
(Data Link)
LLC


RTU (binary encoding) RTU (binary encoding)
ASCII (ASCII encoding)
adatkapcsolati réteg
(host to network layer)
1
MAC IEEE 802.3 Ethernet
1 Fizikai
réteg
(Physical)
10Base2
10Base-T
100Base-TX
1000Base-TX
száloptika
RS232 (V.24),
RS485

A klasszikus Modbus jellemzően a már jól megszokott RS-ek nyakába ül, sokat nem bajlódik a fizikai réteg definíciójával. A Modbus voltaképpen csak a legfelső - alkalmazási réteget definiálja, ez a MBAP (MODBUS Application Protocol). Ez - elvileg - minden esetben egységes, de persze tudjuk, hogy a gyakorlat szinte mindig mást mutat.

A TCP/IP világa sok változást nem hozott a protokollban, így a megszokott MBAP itt a TCP-re települt.

A fejezet további részében a három, "alap" Modbus protokoll és ezek háttere kerül ismertetésre:

  • Modbus ASCII
  • Modbus RTU
  • Modbus TCP

Modbus kommunikáció

Modbus communication

A Modbus egy monomaster hálózatot vagy pont-pont kapcsolatot feltételez. Mindkét esetben egy master és legalább egy slave szükséges a kommunikációhoz.

RTU/ASCII: A slave-ek száma nem haladhatja meg a 246-ot, címzésük az 1..247-es tartományban történhet. A gyakorlat szerint egy szegmensben 32 állomás lehet, és csak repeater-ekkel bővíthető a hálózat. A 0. címmel broadcast üzeneteket lehet küldeni, amennyiben ez a művelet logikai szinten nincs korlátozva. A master jellemzően az 1. címet szokta megkapni.

 

A TCP esetén az RTU-t telepítették a TCP-re, így az ethernetes hálózatok összes előnyét sikerült beágyazni a Modbusba. Mivel az etherneten az állomások címe nagyságrendekkel magasabb, mint az RTU/ASCII-nél, így ennek a korlátját a Modbus-ban definiált 1 bájtos címe jelenti (itt is marad az 1..247 korlát).

 

Modbus adatmodell

elsődleges táblák objekt típusa írás/olvasás leírás
Discretes Input
(egyedi input)
Single bit Read-Only ez a típus az I/O rendszer általi eléréshez használható
Coils
(talán tekercsek?)
Single bit Read-Write ennek a típusnak az adatai applikációs programmal kezelhetők - változtathatók
Input Registers
(input regiszterek)
16-bit word Read-Only ez a típus az I/O rendszer általi eléréshez használható
Holding Registers
(megfogott regiszterek)
16-bit word Read-Write ennek a típusnak az adatai applikációs programmal kezelhetők - változtathatók

A fenti táblázat egy - 1979-es, igazán útkereső kommunikációs koncepció világlátását tükrözi, az elnevezésekben. A lényeg az objektum típusa oszlopból és az írás / olvasás tulajdonságból jön le. Van bites és szavas elérés, és van csak olvasás és írás/olvasás lehetőség. Ennyi.

MBAP

en: Modbus Application Protokoll

Az MBAP voltaképpen maga a Modbus protokoll. Az OSI-Modell meghatározása szerint ez az Alkalmazási réteg szintjén található, csakhogy a Modbus voltaképpen nem is nagyon áll másból. A rend kedvéért az ASCII / RTU encoding-ot felpakolták az adatkapcsolati rétegbe, de a protokoll többi megvalósítását az RS-ek és a TCP vállalják át.

ADU / PDU

A telegramok a (klasszikus) ASCII / RTU esetében a lenti ábrán látható tagolásban kerülnek továbbításra. A TCP esetében a PDU-n kívül eső részek kezelését a TCP protokoll veszi át, így ott már csak a PDU marad meg.

 

Modbus ADU / PDU

 

A klasszikus Modbus a telegramokban két szerkezeti tagolást különböztet meg:

ADU : Applikációs adategység

en: Application Data Unit

Applikációs szempontból magába foglalja az összes adatrészt, így a címet és a CFC-t vagy LFC-t is.

PDU: Protokoll adategység

en: Protocol Data Unit

Csak a funkciókódot és az adatot foglalja magába. A PDU az átviteli protokolltól független rész, melyet az MBAP generál az alkalmazási réteg szintjén. Lásd OSI modell.

Abból a tényből következően, hogy a PDU-beli címzésre 2 bájt áll rendelkezésre, a tárterületek címzésének a felső határa 65536.

PDU-k felépítése

A Modbus kommunikáció kérdés - válasz típusú kommunikációra épül.  A telegramok tartalmuk szerint az alábbi három csoportba oszthatók:

PDU típusa leírása
kérdés
(request : kérés, kérelem)
Minden esetben tartalmazza a funkciókódot, majd jellemzően utalás található benne a kezdőcímre és a lekérdezés hosszára.
válasz
(response: felelet, válasz)
A funkciókód megegyezik a kérdés funkciókódjával, ha a művelet a megszólított fél oldalán probléma nélkül végrehajtható. Jellemzően megadja a válasz hosszát és tartalmát.
hiba
(error)
Ha a megszólított fél oldalán hiba merül fel, ezzel a tartalommal válaszol a kérdésre. A funkciókód mezőben a funkciókód + 0x80 választ ad, és az adatmezőben a probláma okát próbálja felfedni. Ez az un. exception code, ennek értéke 01, 02, 03 vagy 04 lehet.

A PDU-k kiértékelése a fogadó oldalon az alábbi folyamatábra szerint zajlik:

 

Modbus PDU check (flow chart)

 

Modbus exception kódok

kód megnevezés jelentése
01 ILLEGAL FUNCTION Az elküldött telegram funkciókódja szerinti művelet az adott állomáson nem hajtható végre. Legtöbb esetben például olyan kód megy el a célállomásra, ami csak az újabb (vagy csak a régebbi) egységeken hajtható végre. Eltérő konfigurálás miatt is előfordulhat az elutasítás.
02 ILLEGAL DATA ADDRESS Az adott egységen a megadott címtartományban a művelet nem hajtható végre. Jellemzően ebben az esetben címtartományból kicímzések esetén fordul elő ez a hiba. Ha a rendelkezésre álló regiszterek száma például 50, és a 46.-tól címzünk 5 regisztert, előcsalhatjuk a hibát.
03 ILLEGAL DATA VALUE A kérdés telegramban szerepelő adat pontatlan, a célállomás számára nem értelmezhető.
04 SLAVE DEVICE FAILURE A célállomás - visszaállíthatatlan hibára hivatkozva - elutasítja a művelet végrehajtását.
05 ACKNOWLEDGE Jellemően parancsvégrehajtás esetén szokott felbukkanni.
A célállomás fogadta a telegramot és a végrehajtását is megkezdte, de jellemzően időtúllépés miatt elküld egy ilyen tartalmú telegramot. A célállomás a művelet lezártával küld(het) egy "Poll Program Complete" üzenetet.
06 SLAVE DEVICE BUSY Jellemzően parancsvégrehajtás esetén szokott felbukkanni.
A célállomás jelzi a hívó félnek, hogy folyamatban levő végrehajtás miatt nem tud új telegramot fogadni. A telegram küldését a későbbiekben ismételni kell ennek a válasznak az esetén.
08 MEMORY PARITY ERROR A művelet végrehajtása közben a célállomás belefutott egy memória paritáshibába, és ezt muszáj közölnie a hívó féllel.
0A GATEWAY PATH UNAVAILABLE Jellemzően azokban az esetekben lép fel, ha az okos rendszergazda elkonfigurálja a gatway-t, vagy egyszerűen túlterhelt az.
0B GATEWAY TARGET DEVICE FAILED TO RESPOND Az adott állomás lehullott a hálózatról, ezért nem érhető el.

Modbus funkciós kódok

Modbus funkciós kódok cím szerinti felosztása

Modbus functionscodes sequences

Modbus funkciós kódok csoportosítása

kód csoportosítása kód leírása kód al-kód
data access

adatelérés
bit access

bites elérés
Physical Discrete Inputs

egyedi fizikai címek
read discrete inputs
egyedi inputok olvasása
02
 
Internal Bits Or Physical coils

belső bit vagy fizikai coil
read coils
coil-ek olvasása
01  
Write Single Coil
egyedi coil írása
05  
Write Multiple Coils
többszörös coil írás
15  
16 bits access

szavas elérés
Physical Input Registers

Internal Registers
Or
Physical Output Registers


fizikai input regiszter

belső regiszter
vagy
fizikai kimeneti regiszter
Read Input Register
input regiszter olvasása
04  
Read Holding Registers
megfogott regiszterek olvasása
03  
Write Single Register
egyedi regiszter írása
06  
Write Multiple Registers
többszörös regiszterek írása
16  
Read/Write Multiple Registers
többszörös regiszter írás / olvasás
23  
Mask Write Register
maszkolt regiszter írás
22  
Read FIFO queue
FIFO lekérdezés
24  
File record access

fájlrekord elérés
Read File record
fájlrekord olvasása
20  
Write File record
fájlrekord írása
21  
Diagnostics

diagnosztika
Read Exception status
hibakód olvasása
07  
Diagnostic
diagnosztika
08 00 - 18, 20
Get Com event counter 11  
Get Com Event Log 12  
Report Slave ID 17  
Read device Identification 43 14
Other

egyéb
Encapsulated Interface Transport 43 13, 14
CANopen General Reference 43 13

Modbus funkciós kódok leírása

Azért ezt a dokumentumot lusta vagyok lefordítani (meg minek is). Tehát ezek leírása itt található: Modbus_Application_Protocol_V1_1b (pdf)

Egy példa

A Read Coil (0x01) eljárással szeretnénk kiolvasni a 19 - 37 output mezők tartalmát.

Request (lekérés)

PDU PDU tartalma mező hossza értéke vagy
határértéke
példa
funkciókód funkciókód 1 bájt 0x01 0x01
adat kezdőcím 2 bájt 0x0000 - 0xFFFF 0x00 (HI) 0x12 (LO)
coil darabszáma 2 bájt 1 - 2000 (0x7D0) 0x00 (HI) 0x13 (LO)

Response (válasz)

PDU PDU tartalma mező hossza értéke vagy
határértéke
példa
funkciókód funkciókód 1 bájt 0x01 0x01
adat bájok száma 1 bájt n 0x03
coil-ok státusza
(bájtokban)
n bájt n = n vagy n+1 0xAB
0xCD
0xEF

Error (hiba)

PDU PDU tartalma mező hossza értéke vagy
határértéke
példa
funkciókód funkciókód 1 bájt funkciókód + 0x80 0x81
adat Exception code 1 bájt 01, 02, 03 vagy 04 0x01

Modbus RTU / ASCII

  Modbus / ASCII Modbus / RTU
KarakterekASCII 0...9 és A..F Bináris 0...255
HibaellenőrzésLRC (Longitudinal Redundancy Check) CRC (Cyclic Redundancy Check)
Keret kezdet kettőspont karakter ':' 3.5 karakternyi szünet
Keret vég sor vége / új sor karakterek CR/LF 3.5 karakternyi szünet
Gap-ok az üzenetben 1 sec 1.5 karakter
Start bit 1 1
Adat bitek 7 8
Paritás even / odd none even / odd none
Stop bitek1 2 1 2

A paritásról, start és stop bitekről bővebben az RS232 fejezetben olvashat.

Az átvitel sebessége (meg az összes egyéb jellemzője) az alkalmazott RS technikától függ, ezek összevetését itt találja meg.

telegramok felépítése

A telegramok felépítése az ASCII/RTU esetén - néhány kisebb eltéréstől eltekintve - alapvetően azonos.

Mező neve ADU / PDU Leírás
Start-of-frame (SOF) - Az adatátvitel megkezdését jelző bájt vagy bájtsorozat.
cím ADU 0: broadcast, 1..247: állomáscím
funkciókód ADU/PDU ezeknek leírását a funkciókód fejezetben találja meg. Eredetileg ezek egységes rendszert képeznek.
0: érvénytelen funkciókód
1..127: szabadon használható funkciókódok
128..255: fenntartott funkciókódok
adatok ADU/PDU a funkciókód által meghatározott adatok. Az adatmező hosszát is a funkciókód határozza meg.
LR/CR ellenőrzés ADU A telegram tartalmának ellenőrzőkódja.

Modbus ASCII telegram-formátum

en: American Standard Code for Information Interchange

A protokoll ASCII formában viszi át az információt, így előnye, hogy terminálon keresztül az átvitt adatsor egyszerűen olvasható, hátránya (az RTU-hoz képest) hogy kevésbé hatékony.

SOF cím funkciókód adatok LR-ellenőrzés stop
kettőspont karakter (:) 2 karakter 2 karakter n karakter 2 karakter 2 karakter (CRLF)

Modbus RTU telegram-formátum

en: Remote Terminal Unit, de: entfernte Terminaleinheit

A protokoll az információkat bineáris formában továbbítja, így hatékonyabb átviteli forma, mint az ASCII. A Modbus TCP ennek az átvitelnek a TCP-re adoptált változata.

SOF cím funkciókód adatok CR-ellenőrzés stop
Várakozási idő
(min. 3,5 karakter)
8 bit 8 bit n*8 bit 16 bit Várakozási idő
(min. 1,5 karakter)

 

Modbus TCP telegram-formátum

A Modbus TCP a fent már leírt Modbus RTU TCP-re ültetett változata, mely értelemszerűen ethernetet használ az átvitelhez és a TCP/IP keretezési követelményeinek felel meg. Az állomások száma nincs korlátozva, az átvitel sebességét a kiépített hálózat határozza meg.

tranzakció-szám protokoll-kód átvitelre kerülő bájtok száma cím funkciókód adatok
2 byte 2 byte
(mindig 0x0000)
2 byte (n+2) 1 byte 1 byte n byte


felhasznált források

jaec.info

Modbus interface tutorial

Modbus_Application_Protocol_V1_1b (pdf)

license

Creative Commons License
Erre a dokumentumra a Creative Commons-Lizenz 3.0 szabályai érvényesek.
A dokumentum továbbfelhasználása engedélyhez kötött. Részleteiben is csak forrásmegjelöléssel
(pl: forrás:wwww.ob121.com) használható.
Engedélykérés, további információ: mail kukac ob121.com