Modbus-opas
Tämä opas selittää, miten Modbus RTU ja Modbus TCP toimivat, miten Modbus-viestejä ja rekistereitä luetaan, miten raakarekisteriarvoja muunnetaan ja miten tavallisimmat tiedonsiirto-ongelmat ratkaistaan.
Yleiskatsaus
Modbus on yksinkertainen ja lisenssimaksuton sovelluskerroksen protokolla. Client (asiakas) lähettää pyynnön ja server (palvelin) vastaa – palvelin ei lähetä viestejä oma-aloitteisesti. Terminologia on päivitetty master/slave → client/server.
1.1 Heksadesimaali
Modbus-viestit kulkevat bitteinä (0/1). Neljä bittiä muodostaa helposti luettavan heksadesimaalimerkin (0–F), joten binäärinen data esitetään usein heksamuodossa. Heksadesimaalijärjestelmän kantaluku on 16. Modbus-viestit muunnetaan käytännössä usein binäärisestä muodosta heksadesimaalimuotoon, jotta niitä on helpompi lukea. Heksadesimaalien tulkitsemista tarvitaan käyttöönotossa ja vianselvityksessä.
Bitti on pienin tietoyksikkö (0 tai 1).
- Yksi heksadesimaalimerkki vastaa neljää bittiä.
- Tavu = 8 bittiä = kaksi heksadesimaalimerkkiä.
- 16-bittinen rekisteri = 2 tavua = neljä heksadesimaalimerkkiä.
Bittijono 0001 0010 1011 1100 on heksadesimaalimuodossa 0x12BC.
| N1 | N2 | N3 | N4 | |
|---|---|---|---|---|
| BIN | 0001 | 0010 | 1011 | 1100 |
| HEX | 1 | 2 | B | C |
Alla oleva taulukko näyttää, miten jokainen 4-bittinen binääriarvo vastaa yhtä heksadesimaalimerkkiä.
| 0000 = 0 | 0100 = 4 | 1000 = 8 | 1100 = C |
| 0001 = 1 | 0101 = 5 | 1001 = 9 | 1101 = D |
| 0010 = 2 | 0110 = 6 | 1010 = A | 1110 = E |
| 0011 = 3 | 0111 = 7 | 1011 = B | 1111 = F |
1.2 Modbus RTU väylän kytkentä ja jännitetasot
Modbus RTU viesti kulkee sarjaväylää pitkin. Sarjaväylässä tulisi välttää haaroja, sillä haarat aiheuttavat ongelmia. Väylä terminoidaan molemmista päistä yleensä 120Ω vastuksella. Tämän vastuksen tarkoitus on estää heijastumia ja siten häiriöitä väylän tiedonsiirrossa.

Modbus RTU viesteissä (RS-485) väylän jännite taso vaihtelee +5 ja -5 voltin välillä. Jännite -5V tarkoittaa bitti arvoa 1 ja jännite +5V tarkoittaa bitti arvoa 0. Jännite 0V tarkoittaa, että viestinnässä on tauko.

1.3 Modbus RTU väylän kaapeli
Kaapelina RS-485 -väylissä tulisi käyttää parikierrettyä mahdollisimman suojattua kaapelia. Mitä parempi häiriösuojaus, sitä vähemmän häiriöitä väylässä.
RS-485-väylä perustuu differentiaaliseen signaalinsiirtoon, jossa kaapelin johtimet muodostavat kierretyn parin. Tällainen rakenne vähentää tehokkaasti ulkopuolisista lähteistä tulevia sähkömagneettisia häiriöitä, kuten taajuusmuuttajien, releiden ja muiden suurta virtaa käyttävien laitteiden aiheuttamia pulsseja. Lisäksi suojavaippa auttaa estämään häiriöiden kytkeytymistä väylään ja vähentää vuorostaan väylästä ympäristöön säteileviä häiriöitä.
Väylän maadoitukseen ja suojavaipan liittämiseen tulee kiinnittää huomiota. Yleisesti suositellaan, että kaapelin suojavaippa maadoitetaan vain toisesta päästä välttämään potentiaalieroista johtuvia maasilmukoita.
1.4 Modbus RTU väylän nopeus ja maksimipituus
Modbus RTU -väylän toimivuuteen vaikuttavat merkittävästi tiedonsiirtonopeus (baud rate) ja käytetty kaapelipituus. Mitä korkeampi nopeus, sitä lyhyempi väylän maksimipituus:
- 9600 bps → jopa noin 1200 m
- 19200 bps → noin 600 m
- 38400 bps → noin 300 m
- 115200 bps → noin 100 m
Yllä olevat arvot ovat ohjearvoja, ja todelliset maksimipituudet riippuvat kaapelityypistä, asennusolosuhteista ja häiriöympäristöstä. Häiriöalttiissa ympäristöissä kannattaa käyttää alhaisempaa nopeutta ja huolehtia kaapeloinnin sekä maadoituksen laadusta.
1.5 Heijastukset kaapelissa
Heijastuksen tapahtuessa sähkö ikään kuin kimpoaa takaisinpäin ja sotkee väylän jännitetasoja. Jännitetasojen sotkeentuminen johtaa viestien virheellisyyteen.
Heijastusten estämiseksi mahdollisimman tehokkaasti, tulee terminointivastus mitoittaa siten, että se vastaa käytettävän kaapelin ominaisimpedanssia. Esimerkiksi Suomessa tyypillisesti käytetyn Nomak-kaapelin ominaisimpedanssi on 75Ω, jolloin päätevastusten koko tulisi olla 75Ω. Mikäli käytetään johdinta ominaisimpedanssilla 75Ω ja tämän päissä on 120Ω vastukset, muodostuu heijastumia kertoimella |Γ| ≈ 0,23. Tämänkaltainen väylä on yleensä toimiva impedanssiepäsuhdasta huolimatta.
1.6 Terminoinnin periaate
Terminointivastuksen tehtävänä on sitoa kaapelin loppupää niin, ettei signaali pääse heijastumaan takaisin linjaan. Jos väylä on pitkä ja nopeus korkea, ilman terminointia signaalit vääristyvät helposti ja viestien luettavuus heikkenee. Terminointivastus sijoitetaan aina väylän molempiin päihin.
1.7 Biasointi ja lepotila
Pelkkä terminointi ei riitä, jos väylä jää lepotilassa kellumaan. Tällöin vastaanottimien tulot voivat jäädä epäselvään tilaan ja synnyttää virheellisiä bittitulkintoja. Tätä varten käytetään biasointivastuksia, joilla väylän A- ja B-johtimille asetetaan pieni tasajännite-ero. Tyypillisesti biasointi toteutetaan yhdellä vastusparilla yhdessä pisteessä väylää, useimmiten pääväylän master-laitteen yhteydessä.
1.8 Käytännön huomioita
- Vain yksi pari terminointivastuksia: Terminointi tehdään vain väylän kahteen päähän. Jos terminointeja on useampia, signaali vaimenee liikaa ja kommunikointi voi häiriintyä.
- Kaapelin pituus ja nopeus: Mitä pidempi väylä ja suurempi baudinopeus, sitä kriittisempää terminoinnin oikea mitoitus on. Lyhyillä kaapeleilla ja matalilla nopeuksilla väylä voi usein toimia ilman terminointia.
- Impedanssiepäsuhta: Käytännössä väylät toimivat usein melko luotettavasti myös pienellä impedanssiepäsuhdalla, mutta mitä tarkemmin terminointi vastaa kaapelin ominaisimpedanssia, sitä vähemmän virheitä esiintyy.
1.9 Client ja server
Modbuslaitteita on 2 eri tyyppiä. Client(Master) ja Server(Slave). Modbus RTU verkossa, voi clienttejä olla 1 ja servereitä 255. Jokainen Serverille asetetaan yksilöllinen Modbus-osoite väliltä 1-255. Vältä osoitteen 1 käyttämistä, sillä se on oletusosoite ja aiheuttaa helposti päällekkäisyyksiä käytännön toteutuksissa.
- Client lukee tai kirjoittaa rekistereitä. Yleensä PLC.
- Server palauttaa arvot tai tallentaa ne pyydettäessä. Yleensä kenttälaite.
- Server ei lähetä viestejä ilman pyyntöä.
1.10 Rekisterit
Modbus rekistereitä on neljää tyyppiä (Coil, Discrete Input, Input Register, Holding Register). Ne eroavat koon (1 bitti / 16 bittiä) ja käyttöoikeuden (R/W) mukaan. Valmistajien dokumenteissa esiintyy sekä rekisteriavaruus 1…49999” että ”0…65535”. Rekistereillä voi olla standardista poiketen myös valmistajan määrittämiä rajoituksia, kuten kirjoitus rajoitus Coil-rekistereissä tai rajoitus, kuinka monta rekisteriä kerralla voi lukea.
| Register type | Access | Size | Address |
|---|---|---|---|
| Coil | Read/write | 1-bit | 1–9999 (0–65535) |
| Discrete input | Read only | 1-bit | 10001–19999 (0–65535) |
| Input register | Read only | 16-bit | 30001–39999 (0–65535) |
| Holding register | Read/write | 16-bit | 40001–49999 (0–65535) |
Huomaa myös 0- vs 1-pohjainen laskenta aloitusrekisterissä; tarkista aina laitteen datasheet.
Rekisteriosoitteen virhe on yksi tavallisimmista syistä vääriin arvoihin. Katso vianselvitysesimerkkejä kohdasta 1.16 Raakarekisteriarvojen muuntaminen.
1.11 Funktiokoodit
Funktiokoodit ovat yhden tavun komentoja, joilla luetaan/kirjoitetaan tiettyä rekisterityyppiä yhdelle tai usealle osoitteelle. Standardikoodien lisäksi joissain laitteissa voi olla valmistajakohtaisia koodeja, eikä kaikkia koodeja välttämättä tueta jokaisella laitteella. Alla listaus virallisista funktiokoodeista modbus.org sivulta.

1.12 CRC (Cyclic Redundancy Check)
Jokaisen RTU kehyksen lopussa on 16 bittinen CRC. Lähettäjä ja vastaanottaja laskevat CRC:n viestin tavuista ja vertaavat tuloksia; yhdenkin bitin muutos johtaa virheeseen.
1.13 Pariteetti
Pariteetti voi olla N (ei pariteettia), E (parillinen) tai O (pariton). Pariteettibitin täytyy täsmätä molemmissa päissä, muuten syntyy virheitä. Pariteetti bitti huolehtii, että viestissä on määritelty parillisuus arvon 1 saaneita bittejä. Mikäli bittejä olisi pariton määrä ja pariteetiksi valittu E, vaihtaisi pariteetti bitti tilakseen yksi (1).
1.14 Tavu- ja sanajärjestys (endianness)
Modbus-rekisteriarvot siirretään tavuina. Yksittäisissä 16-bittisissä rekistereissä tämä on yleensä suoraviivaista, mutta 32- ja 64-bittiset arvot muodostetaan useista rekistereistä, ja laitteet voivat käyttää eri tavu- tai sanajärjestystä.
Oletuksena Modbus-rekisteridata esitetään usein big-endian-järjestyksessä, jossa merkitsevin tavu on ensin. Osa laitteista kuitenkin vaihtaa 32-bittisen arvon kaksi 16-bittistä sanaa keskenään, vaihtaa tavut kunkin sanan sisällä tai tekee molemmat.
Tästä syystä tavu- ja sanajärjestys on aina tarkistettava laitekohtaisesta rekisterikartasta.
Yleisiä 32-bittisiä järjestyksiä ovat:
| Järjestys | Merkitys |
|---|---|
ABCD | normaali big-endian-järjestys |
CDAB | sanat vaihdettu keskenään |
BADC | tavut vaihdettu kunkin sanan sisällä |
DCBA | sekä tavut että sanat vaihdettu |
Käytännön esimerkki on kohdassa 1.16 Raakarekisteriarvojen muuntaminen.
1.15 Datatyypit
Modbusissa laitteiden sisäiset muuttujat, kuten lämpötilat, tilat, hälytykset, laskurit ja asetusarvot, siirretään rekistereinä ja bittiarvoina. Modbus-protokolla ei itsessään määritä, sisältääkö rekisteri etumerkillisen kokonaisluvun, etumerkittömän kokonaisluvun, liukuluvun, tilasanan vai skaalatun mittausarvon.
Modbus-rekisteri on 16-bittinen. Tämä tarkoittaa, että yksi rekisteri voi sisältää suoraan 16-bittisen arvon, kun taas suuremmat arvot muodostetaan yhdistämällä useita peräkkäisiä 16-bittisiä rekistereitä.
1 rekisteri = 16 bittiä
2 rekisteriä = 32 bittiä
4 rekisteriä = 64 bittiä
Yleisiä Modbus-datatyyppejä ovat:
| Datatyyppi | Koko | Rekisterien määrä |
|---|---|---|
BOOL / bitti | 1 bitti | coil tai discrete input |
UINT16 | 16 bittiä | 1 rekisteri |
INT16 | 16 bittiä | 1 rekisteri |
UINT32 | 32 bittiä | 2 rekisteriä |
INT32 | 32 bittiä | 2 rekisteriä |
FLOAT32 | 32 bittiä | 2 rekisteriä |
UINT64 | 64 bittiä | 4 rekisteriä |
INT64 | 64 bittiä | 4 rekisteriä |
FLOAT64 / DOUBLE | 64 bittiä | 4 rekisteriä |
Client-laitteen täytyy tietää oikea datatyyppi, joka löytyy usein laitteen dokumentaatiosta. Jos valitaan väärä datatyyppi, laite voi vastata oikein, mutta näytetty arvo on väärä.
Esimerkiksi sama raakamuotoinen 16-bittinen rekisteri voidaan tulkita arvoksi UINT16 tai INT16. Samat kaksi peräkkäistä rekisteriä voidaan tulkita arvoksi UINT32, INT32 tai FLOAT32. 32- ja 64-bittisissä arvoissa myös tavujärjestys ja sanajärjestys vaikuttavat tulkintaan.
Käytännön esimerkkejä etumerkillisistä ja etumerkittömistä arvoista, tavujärjestyksestä, sanajärjestyksestä, skaalauksesta, offset-arvoista ja väärien arvojen vianselvityksestä on kohdassa 1.16 Raakarekisteriarvojen muuntaminen.
1.16 Raakarekisteriarvojen muuntaminen
Kun Modbus-rekistereitä luetaan, tiedonsiirto voi toimia oikein, vaikka näytetty arvo olisi väärä. Tämä tarkoittaa yleensä, että laite vastaa kyselyyn, mutta client tulkitsee palautetun rekisteridatan väärällä datatyypillä, tavujärjestyksellä, sanajärjestyksellä, skaalauskertoimella, offsetilla tai rekisteriosoitteella.
Kelvollinen Modbus-vastaus ei automaattisesti tarkoita, että prosessiarvo on oikein.
Yksi rekisteri on 16 bittiä
Modbus-rekisteri sisältää 16 bittiä:
1 rekisteri = 16 bittiä = 2 tavua = 4 heksamerkkiä
Yksi rekisteri voi sisältää suoraan 16-bittisiä arvoja:
| Datatyyppi | Koko | Rekisterimäärä |
|---|---|---|
UINT16 | 16 bittiä | 1 rekisteri |
INT16 | 16 bittiä | 1 rekisteri |
Suuremmat arvot muodostetaan useista peräkkäisistä rekistereistä:
| Datatyyppi | Koko | Rekisterimäärä |
|---|---|---|
UINT32 | 32 bittiä | 2 rekisteriä |
INT32 | 32 bittiä | 2 rekisteriä |
FLOAT32 | 32 bittiä | 2 rekisteriä |
UINT64 | 64 bittiä | 4 rekisteriä |
INT64 | 64 bittiä | 4 rekisteriä |
FLOAT64 / DOUBLE | 64 bittiä | 4 rekisteriä |
Jos laitteen dokumentaatiossa sanotaan, että arvo on FLOAT32, clientin täytyy lukea kaksi peräkkäistä rekisteriä ja yhdistää ne oikein.
Etumerkilliset ja etumerkittömät arvot
Sama 16-bittinen raakarekisteri voi tuottaa eri arvon sen mukaan, tulkitaanko se etumerkillisenä vai etumerkittömänä.
Esimerkki:
Raakarekisteri = 0xFF9C
| Datatyyppi | Arvo |
|---|---|
UINT16 | 65436 |
INT16 | -100 |
Etumerkittömänä arvona 0xFF9C tarkoittaa 65436. Etumerkillisenä 16-bittisenä arvona, kahden komplementin esityksellä, se tarkoittaa -100.
Tällä on merkitystä arvoissa, jotka voivat mennä nollan alapuolelle, kuten ulkolämpötila, paine-ero, offsetit, säätökorjaukset ja tehon tuonti-/vientiarvot.
Jos skaalauskerroin on 0.1, lopullinen arvo on:
-100 x 0.1 = -10.0 °C
32-bittiset arvot kahdesta rekisteristä
32-bittinen arvo muodostetaan kahdesta 16-bittisestä rekisteristä.
Esimerkki:
Rekisteri 1 = 0x42F6
Rekisteri 2 = 0x0000
Raakatavut ovat:
42 F6 00 00
Samat tavut voidaan tulkita eri tavoin:
| Datatyyppi | Esimerkkitulos |
|---|---|
UINT32 | 1123418112 |
INT32 | 1123418112 |
FLOAT32 | 123.0 |
Raakadata on sama. Vain tulkinta muuttuu.
Tavu- ja sanajärjestys
32-bittinen arvo koostuu neljästä tavusta, joita kuvataan usein muodossa:
A B C D
Koska Modbus-rekisterit ovat 16-bittisiä, arvo jaetaan kahteen rekisteriin:
Rekisteri 1 = A B
Rekisteri 2 = C D
Yleisiä 32-bittisiä tavu- ja sanajärjestyksiä ovat:
| Järjestys | Kuvaus | Tavujärjestys |
|---|---|---|
ABCD | Normaali big-endian-järjestys | A B C D |
CDAB | Sanat vaihdettu keskenään | C D A B |
BADC | Tavut vaihdettu kunkin sanan sisällä | B A D C |
DCBA | Sekä tavut että sanat vaihdettu | D C B A |
Käytetään esimerkkirekistereitä:
Rekisteri 1 = 0x42F6
Rekisteri 2 = 0x0000
Mahdolliset tavujärjestykset ovat:
| Järjestys | Tavujärjestys | FLOAT32-tulos |
|---|---|---|
ABCD | 42 F6 00 00 | 123.0 |
CDAB | 00 00 42 F6 | hyvin pieni arvo |
BADC | F6 42 00 00 | epärealistinen arvo |
DCBA | 00 00 F6 42 | hyvin pieni arvo |
Tämä on yksi tavallisimmista syistä siihen, että Modbus-arvo näyttää väärältä, vaikka kysely ja vastaus ovat oikein.
Skaalaus ja offset
Monet laitteet lähettävät kokonaisluvun, joka täytyy muuntaa prosessiarvoksi.
Prosessiarvo = raaka-arvo x skaalauskerroin
Esimerkki:
Raaka-arvo = 234
Skaalauskerroin = 0.1
Prosessiarvo = 234 x 0.1 = 23.4 °C
Jotkin laitteet käyttävät myös offsetia:
Prosessiarvo = raaka-arvo x skaalauskerroin + offset
Esimerkki:
Raaka-arvo = 234
Skaalauskerroin = 0.1
Offset = -50
Prosessiarvo = 234 x 0.1 - 50 = -26.6
Skaalauskerroin, offset ja yksikkö on tarkistettava laitekohtaisesta rekisterikartasta.
Osoite, rekisterityyppi ja funktiokoodi
Väärä arvo voi johtua myös siitä, että luetaan väärästä paikasta.
Jotkin manuaalit dokumentoivat holding register -rekisterit muodossa 40001, 40002, 40003, kun taas varsinainen Modbus-kysely käyttää nollapohjaisia osoitteita 0, 1, 2. Tämä tarkoittaa, että rekisteri, joka on dokumentoitu muodossa 40001, voidaan joutua kysymään osoitteesta 0.
Tarkista myös, että käytössä on oikea rekisterialue ja funktiokoodi:
| Rekisterityyppi | Tyypillinen funktiokoodi | Käyttö | Koko |
|---|---|---|---|
| Coil | 01 / 05 / 15 | luku/kirjoitus | 1 bitti |
| Discrete Input | 02 | vain luku | 1 bitti |
| Input Register | 04 | vain luku | 16 bittiä |
| Holding Register | 03 / 06 / 16 | luku/kirjoitus | 16 bittiä |
Osoitteen 10 lukeminen funktiokoodilla 03 ei ole sama asia kuin osoitteen 10 lukeminen funktiokoodilla 04.
Vianselvitysmenetelmä
Aloita raakarekisteriarvoista ennen kuin muunnat ne prosessiarvoiksi.
Yhden rekisterin arvoissa vertaa vähintään:
| Raakarekisteri | UINT16 | INT16 |
|---|---|---|
0xFF9C | 65436 | -100 |
Kahden rekisterin arvoissa vertaa vähintään:
| Tulkinta | Mitä se tarkistaa |
|---|---|
UINT32 ABCD | normaali etumerkitön 32-bittinen arvo |
INT32 ABCD | normaali etumerkillinen 32-bittinen arvo |
FLOAT32 ABCD | normaali liukulukuarvo |
FLOAT32 CDAB | sanavaihdettu liukulukuarvo |
FLOAT32 BADC | tavuvaihdettu liukulukuarvo |
FLOAT32 DCBA | sekä tavu- että sanavaihdettu liukulukuarvo |
Jos yksi tulkinta tuottaa realistisen arvon ja muut tuottavat epärealistisia arvoja, realistinen tulkinta on usein tarkoitettu formaatti. Varmista se kuitenkin laitekohtaisesta rekisterikartasta ennen käyttöönottoa.
Tavallisia syitä vääriin Modbus-arvoihin
- väärä rekisteriosoite
- 0- ja 1-pohjaisen osoitteistuksen sekoittaminen
- väärä rekisterityyppi tai funktiokoodi
- etumerkillinen arvo tulkitaan etumerkittömänä tai päinvastoin
- 32-bittinen arvo luetaan 16-bittisenä
- väärä tavu- tai sanajärjestys
- puuttuva skaalauskerroin tai offset
- väärä yksikkö
- toisesta rekisteristä kopioidut muunnosasetukset
Tarkista aina laitekohtainen rekisterikartta ja kirjaa raakarekisteriarvot ylös vianselvityksen aikana.
1.17 Esimerkkiviestit
Read Coils: Function Code 01
Kysely: 01 01 00 05 00 03 6C 0A
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 01 | Function code | 0x01 (1) - Read Coils |
| 00 05 | Aloitusrekisterin osoite | Base-0: 0x0005 (5) Base-1: 0x0006 (6) |
| 00 03 | Rekisterien määrä | 0x0003 (3) |
| 6C 0A | CRC | 0x6C0A (27658) |
Vastaus: 01 01 01 02 D0 49
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 01 | Function code | 0x01 (1) - Read Coils |
| 01 | Datan tavu määrä | 0x01 (1) |
| 02 | Rekisterien 5,6 ja 7 data | 0x02 |
| Bits (bN=Arvo, LSB→MSB per tavu) | b0=0, b1=1, b2=0, b3=0, b4=0, b5=0, b6=0, b7=0 | |
| D0 49 | CRC | 0xD049 (53321) |
Read Discrete inputs: Function Code 02
Kysely: 01 02 00 02 00 02 58 0B
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 02 | Function code | 0x02 (2) - Read Discrete Inputs |
| 00 02 | Aloitusrekisterin osoite | Base-0: 0x0002 (2) Base-1: 0x0003 (3) |
| 00 02 | Rekisterien määrä | 0x0002 (2) |
| 58 0B | CRC | 0x580B (22539) |
Vastaus: 01 02 01 00 A1 88
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 02 | Function code | 0x02 (2) - Read Discrete Inputs |
| 01 | Datan tavu määrä | 0x01 (1) |
| 00 | Rekisterien 2 ja 3 data | 0x00 |
| Bits (bN=Arvo, LSB→MSB per byte) | b0=0, b1=0, b2=0, b3=0, b4=0, b5=0, b6=0, b7=0 | |
| A1 88 | CRC | 0xA188 (41352) |
Read Holding Registers: Function Code 03
Kysely: 01 03 00 07 00 02 75 CA
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 03 | Function code | 0x03 (3) - Read Holding Registers |
| 00 07 | Aloitusrekisterin osoite | Base-0: 0x0007 (7) Base-1: 0x0008 (8) |
| 00 02 | Rekisterien määrä | 0x0002 (2) |
| 75 CA | CRC | 0x75CA (30154) |
Vastaus: 01 03 04 00 01 00 06 2B F1
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 03 | Function code | 0x03 (3) - Read Holding Registers |
| 04 | Datan tavu määrä | 0x04 (4) |
| 00 01 00 06 | Rekisterien 7 ja 8 data | 0x0001 (1), 0x0006 (6) |
| 2B F1 | CRC | 0x2BF1 (11249) |
Read Input Register: Function Code 04
Kysely: 01 04 00 00 00 02 71 CB
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 04 | Function code | 0x04 (4) - Read Input Registers |
| 00 00 | Aloitusrekisterin osoite | Base-0: 0x0000 (0) Base-1: 0x0001 (1) |
| 00 02 | Rekisterien määrä | 0x0002 (2) |
| 71 CB | CRC | 0x71CB (29131) |
Vastaus: 01 04 04 00 01 00 0B EB 83
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 04 | Function code | 0x04 (4) - Read Input Registers |
| 04 | Tavu määrä | 0x04 (4) |
| 00 01 00 0B | Rekisterien 0 ja 1 data | 0x0001 (1), 0x000B (11) |
| EB 83 | CRC | 0xEB83 (60291) |
Write Single Coil: Function Code 05
Kysely: 16 05 00 09 00 00 1E EF
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 05 | Function code | 0x05 (5) - Write Single Coil |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 00 | Rekisterin 9 data | B1:1 |
| 1E EF | CRC | 0x1EEF (7919) |
Vastaus: 16 05 00 09 FF 00 5F 1F
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 05 | Function code | 0x05 (5) - Write Single Coil |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| FF 00 | Rekisterin 9 data | B0:1 |
| 5F 1F | CRC | 0x5F1F (24351) |
Write Single Register: Function code 06
Kysely: 16 06 00 09 00 01 9B 2F
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 06 | Function code | 0x06 (6) - Write Single Register |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 01 | Rekisterin 9 data | 0x0001 (1) |
| 9B 2F | CRC | 0x9B2F (39727) |
Vastaus: 16 06 00 09 00 01 9B 2F
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 06 | Function code | 0x06 (6) - Write Single Register |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 01 | Rekisterin 9 data | 0x0001 (1) |
| 9B 2F | CRC | 0x9B2F (39727) |
Write Multiple Coils: Function code 15
Kysely: 16 0F 00 09 00 05 01 0D 32 78
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 0F | Function code | 0x0F (15) - Write Multiple Coils |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 05 | Rekisterien määrä | 0x0005 (5) |
| 01 | Tavu määrä | 0x01 (1) |
| 0D | Rekisterien 9-13 data | 0x0D |
| Bits (bN=Arvo, LSB→MSB per byte) | b0=1, b1=0, b2=1, b3=1, b4=0, b5=0 | |
| 32 78 | CRC | 0x3278 (12920) |
Vastaus: 16 0F 00 09 00 05 46 ED
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 0F | Function code | 0x0F (15) - Write Multiple Coils |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 05 | Rekisterien määrä | 0x0005 (5) |
| 46 ED | CRC | 0x46ED (18157) |
Write Multiple Registers: Function code 16
Kysely: 16 10 00 09 00 05 0A 00 09 00 02 00 4D 00 00 00 01 13 5B
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 10 | Function code | 0x10 (16) - Write Multiple Registers |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 05 | Rekisterien määrä | 0x0005 (5) |
| 0A | Tavu määrä | 0x0A (10) |
| 00 09 00 02 00 4D 00 00 00 01 | Rekisterien 9-13 data | 0x0009 (9), 0x0002 (2), 0x004D (77), 0x0000 (0), 0x0001 (1) |
| 13 5B | CRC | 0x135B (4955) |
Vastaus: 16 10 00 09 00 05 D3 2F
| Tavut | Tietue | Arvo |
|---|---|---|
| 16 | Modbus-osoite | 0x16 (22) |
| 10 | Function code | 0x10 (16) - Write Multiple Registers |
| 00 09 | Aloitusrekisterin osoite | Base-0: 0x0009 (9) Base-1: 0x000A (10) |
| 00 05 | Rekisterien määrä | 0x0005 (5) |
| D3 2F | CRC | 0xD32F (54063) |
1.18 Virhekoodit
Modbus kyselyä voi seurata.
- Server laite käsittelee kyselyn ja lähettää vastauksen.
- Server laite saa kyselyn, mutta siinä on CRC/pariteetti virhe, milloin kysely jätetään huomiotta.
- Server ei saa kyselyä perille, jolloin siihen ei voida vastata.
- Server ei pysty syystä tai toisesta käsittelemään kyselyä ja vastaa virheellä.
Huomioi laitekohtaiset rajoitukset, esim. Rekisterikartassa olevat tyhjät kohdat tulisi jättää kyselemättä.
Virhekoodeissa palautetaan funktiokoodin sijaan virhekoodi, jonka arvo on funktio koodi + 0x80. Eli esim:
| Request — Function code | Response — Exception code |
|---|---|
| 01 (0x01) | 129 (0x81) |
| 02 (0x02) | 130 (0x82) |
| 03 (0x03) | 131 (0x83) |
| 04 (0x04) | 132 (0x84) |
| 05 (0x05) | 133 (0x85) |
| 06 (0x06) | 134 (0x86) |
| 15 (0x0F) | 143 (0x8F) |
| 16 (0x10) | 144 (0x90) |
Exception esimerkki viestintä:
Kysely: 01 01 00 42 00 03 DC 1F
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 01 | Function code | 0x01 (1) - Read Coils |
| 00 42 | Aloitusrekisterin osoite | Base-0: 0x0042 (66) Base-1: 0x0043 (67) |
| 00 03 | Määrä | 0x0003 (3) |
| DC 1F | CRC | 0xDC1F (56351) |
Vastaus: 01 81 01 81 90
| Tavut | Tietue | Arvo |
|---|---|---|
| 01 | Modbus-osoite | 0x01 (1) |
| 81 | Error code | 0x80 + 0x01 (1) - Read Coils |
| 01 | Exception code | Illegal Function — Function code not supported or not allowed for this state. |
| 81 90 | CRC | 0x8190 (33168) |
Modbus virhekoodeja ovat
| Code | Name | Meaning |
|---|---|---|
| 1 (0x01) | ILLEGAL FUNCTION | The function code received in the query is not an allowable action for the server. This may be because the function code is only applicable to newer devices and was not implemented in the unit selected. It could also indicate that the server is in the wrong state to process a request of this type, for example because it is unconfigured and is being asked to return register values. |
| 2 (0x02) | ILLEGAL DATA ADDRESS | The data address received in the query is not an allowable address for the server. More specifically, the combination of reference number and transfer length is invalid. For a controller with 100 registers, the PDU addresses the first register as 0, and the last one as 99. If a request is submitted with a starting register address of 96 and a quantity of registers of 4, then this request will successfully operate (address-wise at least) on registers 96, 97, 98, 99. If a request is submitted with a starting register address of 96 and a quantity of registers of 5, then this request will fail with Exception Code 0x02 “Illegal Data Address” since it attempts to operate on registers 96, 97, 98, 99 and 100, and there is no register with address 100. |
| 3 (0x03) | ILLEGAL DATA VALUE | A value contained in the query data field is not an allowable value for the server. This indicates a fault in the structure of the remainder of a complex request, such as that the implied length is incorrect. It specifically does not mean that a data item submitted for storage in a register has a value outside the expectation of the application program, since the Modbus protocol is unaware of the significance of any particular value of any particular register. |
| 4 (0x04) | SERVER DEVICE FAILURE | An unrecoverable error occurred while the server was attempting to perform the requested action. |
| 5 (0x05) | ACKNOWLEDGE | Specialized use in conjunction with programming commands. The server has accepted the request and is processing it, but a long duration of time will be required to do so. This response is returned to prevent a timeout error from occurring in the client. The client can next issue a Poll Program Complete message to determine if processing is completed. |
| 6 (0x06) | SERVER DEVICE BUSY | Specialized use in conjunction with programming commands. The server is engaged in processing a long-duration program command. The client should retransmit the message later when the server is free. |
| 8 (0x08) | MEMORY PARITY ERROR | Specialized use in conjunction with function codes 20 and 21 and reference type 6, to indicate that the extended file area failed to pass a consistency check. The server attempted to read record file, but detected a parity error in the memory. The client can retry the request, but service may be required on the server device. |
| 10 (0x0A) | GATEWAY PATH UNAVAILABLE | Specialized use in conjunction with gateways, indicates that the gateway was unable to allocate an internal communication path from the input port to the output port for processing the request. Usually means that the gateway is misconfigured or overloaded. |
| 11 (0x0B) | GATEWAY TARGET DEVICE FAILED TO RESPOND | Specialized use in conjunction with gateways, indicates that no response was obtained from the target device. Usually means that the device is not present on the network. |
1.19 RX ja TX ledit
Kenttälaitteiden muuntimissa/antureissa TX vilkkuu lähetyksessä ja RX vastaanotossa – hyvä perusdiagnostiikka asennuksen aikana. Client-laitteessa lähetystä tulisi seurata vastaus ja Server-laitteessa vastaanottoa tulisi seurata lähetys.
Käytännön vinkkejä
- Älä käytä oletusosoitetta 1, ja dokumentoi osoitteet I/O-listaan.
- Tarkista 0/1-pohjainen osoitteistus, rekisterityyppi, funktiokoodi, datatyyppi, tavujärjestys, sanajärjestys, skaalaus, offset ja yksikkö ennen kuin oletat tiedonsiirron olevan viallinen.
- RTU-väylällä varmista terminointi ja yksinkertainen sarjarakenne; väärä topologia lisää virheitä.