Modbus opas: RTU, TCP, rekisterit ja vianhaku
Tämä käytännön Modbus opas käsittelee Modbus RTU ja Modbus TCP tiedonsiirtoa automaatiojärjestelmissä. Oppaassa käydään läpi RS-485 väylä, Modbus rekisterit, funktiokoodit, osoitteistus, CRC tarkistus, tavu- ja sanajärjestys, rekisteriarvojen muuntaminen, esimerkkiviestit sekä vianhaku.
Jos sinulla on jo Modbus viesti, jonka haluat purkaa, käytä Modbus dekooderia.
Mikä on Modbus?
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.
Modbus on sovellustason tiedonsiirtoprotokolla, jota käytetään laajasti PLC ohjainten, automaatiolaitteiden, mittareiden, antureiden, taajuusmuuttajien ja rakennusautomaatiojärjestelmien välisessä tiedonsiirrossa.
Asiakas lähettää pyynnön palvelinlaitteelle. Palvelin käsittelee pyynnön ja palauttaa vastauksen.
Modbus RTU ja Modbus TCP
| Modbus RTU | Modbus TCP | |
|---|---|---|
| Verkko | Sarjaliikenne, yleensä RS-485 | Ethernet |
| Laitteen tunnistus | Modbus osoite | IP osoite ja Unit ID |
| Virheentarkistus | CRC | TCP/IP verkkokerrokset |
| Tyypillinen käyttö | Kenttälaitteet ja sarjaväylät | Ethernet ohjaimet ja yhdyskäytävät |
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.

RS-485 siirtää dataa kahden väyläjohtimen välisen differentiaalijännitteen avulla. Monissa käytännön RS-485-asennuksissa differentiaalinen waveform näkyy oskilloskoopilla muutaman voltin suuruisena molempiin suuntiin, ja noin -5 V … +5 V on hyödyllinen yksinkertaistettu esimerkki siitä, miltä signaali voi näyttää.
Jännitetaso ei kuitenkaan ole kiinteästi ±5 V. Todellinen amplitudi riippuu transceivereistä, käyttöjännitteestä, väylän kuormituksesta, terminoinnista ja biasoinnista. Receiver tulkitsee logic staten johtimien välisen differentiaalijännitteen napaisuuden ja suuruuden perusteella eikä sen perusteella, että jommallakummalla johtimella olisi aina tietty jännite suhteessa maahan.
Alla oleva kuva esittää siis yksinkertaistetun esimerkin RS-485 differentiaalisesta waveformista. Todellisessa asennuksessa amplitudi voi olla erilainen.

Myöskään A- ja B-merkintöjä ei käytetä täysin yhdenmukaisesti eri valmistajien välillä. Kun yhdistät eri valmistajien laitteita, tarkista liitinmäärittelyt laitedokumentaatiosta äläkä oleta yhden A/B-napaisuusmerkinnän olevan yleispätevä.
1.3 Modbus RTU väylän kaapeli
RS-485-segmentin pituuteen vaikuttavat baud rate, kaapelin ominaisuudet, topologia, transceiverit, terminointi ja EMC-ympäristö. Tämän vuoksi ei ole olemassa yhtä Modbus RTU -pituustaulukkoa, joka olisi voimassa kaikissa asennuksissa.
Karkeana käytännön esimerkkinä pienempi baud rate mahdollistaa yleensä pidemmän kaapeloinnin kuin suuri baud rate:
| Baud rate | Karkea käytännön suuruusluokka |
|---|---|
| 9600 bit/s | jopa noin 1000 m |
| 19200 bit/s | useita satoja metrejä |
| 38400 bit/s | muutamia satoja metrejä |
| 115200 bit/s | tyypillisesti selvästi lyhyempiä matkoja |
Nämä arvot eivät ole Modbus-protokollan rajoja. Ne ovat käytännön esimerkkejä baud raten ja kaapelipituuden välisestä suhteesta. Todellinen sallittu pituus tulee aina tarkistaa käytettävän kaapelin, transceivereiden ja laitteiden spekseistä.
Sähköisesti häiriöisessä ympäristössä baud raten pienentäminen voi kasvattaa tiedonsiirron marginaalia, mutta sillä ei pidä peittää johdotus-, topologia-, terminointi- tai maadoitus-ongelmia.
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 1000 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 vähentämiseksi terminointivastuksen tulisi vastata kohtuullisen hyvin kaapelin ominaisimpedanssia.
120 Ω on yleinen RS-485-asennuksissa, koska monien nimenomaan RS-485-käyttöön tarkoitettujen kaapeleiden ominaisimpedanssi on lähellä tätä arvoa. Rakennusautomaatioasennuksissa käytettävä kaapeli ei kuitenkaan aina ole 120 Ω kaapeli.
Esimerkiksi Suomessa rakennusautomaatiossa yleisesti käytetyistä Nomak-kaapeleista joidenkin ominaisimpedanssi on noin 75 Ω. Jos 75 Ω transmission line terminoidaan 120 Ω vastuksella, terminointi ei vastaa kaapelin ominaisimpedanssia tarkasti.
Heijastuksia kaapelissa voidaan arvioida kaavalla:
[ \Gamma = \frac{Z_L - Z_0}{Z_L + Z_0} ]
missä:
- (Z_L) on terminointivastus
- (Z_0) on kaapelin ominaisimpedanssi
Yksinkertaistetussa esimerkissä 75 Ω kaapelilla ja 120 Ω terminoinnilla:
[ \Gamma = \frac{120 - 75}{120 + 75} ]
[ \Gamma \approx 0.23 ]
Impedanssiepäsuhta voi siis synnyttää heijastuneen komponentin, jonka amplitudi on noin 23 % tulevan signaalin amplitudista.
Tämä ei automaattisesti tarkoita, että RS-485-verkko lakkaisi toimimasta. Todelliseen käyttäytymiseen vaikuttavat myös kaapelipituus, baud rate, ajurin impedanssi, vastaanottava laite, topologia ja muut sähköiset tekijät. Käytännössä moni tällainen väylä toimii edelleen luotettavasti.
Esimerkin tarkoitus on havainnollistaa tärkeää periaatetta: terminointivastus ja kaapelin ominaisimpedanssi kuuluvat samaan sähköiseen mitoituskysymykseen.
120 Ω vastusta ei siis pidä ajatella Modbus-väylän yleispätevänä korjauskomponenttina. Se on yleinen arvo, koska se sopii hyvin monien RS-485-kaapeleiden ominaisimpedanssiin.
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.
Minkä kokoinen terminointivastus RS-485-väylään?
Terminointivastuksen tulee vastata mahdollisimman hyvin kaapelin ominaisimpedanssia, ja vastus asennetaan väylän molempiin fyysisiin päihin. 120 Ω on yleinen arvo RS-485-kaapeleissa, mutta jos käytetyn kaapelin ilmoitettu ominaisimpedanssi on toinen, terminointi kannattaa mitoittaa sen mukaan.
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ä 247. Jokainen Serverille asetetaan yksilöllinen Modbus-osoite väliltä 1-247. 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.
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.
Modbus TCP viesti ja MBAP otsake
Modbus TCP viesti sisältää MBAP otsakkeen ja sen jälkeen varsinaisen Modbus protokolladatan.
MBAP otsake sisältää seuraavat kentät:
- Transaction ID
- Protocol ID
- Length
- Unit ID
Modbus TCP käyttää tavallisesti TCP porttia 502.
Modbus TCP viestin rakenne
| Kenttä | Tarkoitus |
|---|---|
| Transaction ID | Yhdistää pyynnön ja vastauksen |
| Protocol ID | Modbus liikenteessä normaalisti 0 |
| Length | Seuraavien tavujen määrä |
| Unit ID | Tunnistaa kohdelaitteen, erityisesti yhdyskäytävien kautta |
| Function code | Määrittää suoritettavan Modbus toiminnon |
| Data | Osoitteet, arvot ja muu funktiokohtainen data |
Modbus TCP viestissä ei käytetä Modbus RTU:n CRC kenttää.
Modbus RTU ja Modbus TCP viestien ero
Modbus funktiokoodit ja rekisterit toimivat samalla periaatteella molemmissa protokollissa. Ero on viestin kuljetustavassa ja kehyksessä. Modbus RTU käyttää laiteosoitetta ja CRC tarkistusta, kun taas Modbus TCP käyttää MBAP otsaketta ja TCP/IP verkkoa.
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ä.