Modbus-opas

Julkaistu 2026-05-17 · kirjoittanut HF · Päivitetty 2026-05-17

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.

N1N2N3N4
BIN0001001010111100
HEX12BC

Alla oleva taulukko näyttää, miten jokainen 4-bittinen binääriarvo vastaa yhtä heksadesimaalimerkkiä.

0000 = 00100 = 41000 = 81100 = C
0001 = 10101 = 51001 = 91101 = D
0010 = 20110 = 61010 = A1110 = E
0011 = 30111 = 71011 = B1111 = 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.

Connection diagram

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.

Modbus RTU voltage levels


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 typeAccessSizeAddress
CoilRead/write1-bit1–9999 (0–65535)
Discrete inputRead only1-bit10001–19999 (0–65535)
Input registerRead only16-bit30001–39999 (0–65535)
Holding registerRead/write16-bit40001–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.

Funktiokoodit pikakatsaus

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ärjestysMerkitys
ABCDnormaali big-endian-järjestys
CDABsanat vaihdettu keskenään
BADCtavut vaihdettu kunkin sanan sisällä
DCBAsekä 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:

DatatyyppiKokoRekisterien määrä
BOOL / bitti1 bitticoil tai discrete input
UINT1616 bittiä1 rekisteri
INT1616 bittiä1 rekisteri
UINT3232 bittiä2 rekisteriä
INT3232 bittiä2 rekisteriä
FLOAT3232 bittiä2 rekisteriä
UINT6464 bittiä4 rekisteriä
INT6464 bittiä4 rekisteriä
FLOAT64 / DOUBLE64 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:

DatatyyppiKokoRekisterimäärä
UINT1616 bittiä1 rekisteri
INT1616 bittiä1 rekisteri

Suuremmat arvot muodostetaan useista peräkkäisistä rekistereistä:

DatatyyppiKokoRekisterimäärä
UINT3232 bittiä2 rekisteriä
INT3232 bittiä2 rekisteriä
FLOAT3232 bittiä2 rekisteriä
UINT6464 bittiä4 rekisteriä
INT6464 bittiä4 rekisteriä
FLOAT64 / DOUBLE64 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
DatatyyppiArvo
UINT1665436
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:

DatatyyppiEsimerkkitulos
UINT321123418112
INT321123418112
FLOAT32123.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ärjestysKuvausTavujärjestys
ABCDNormaali big-endian-järjestysA B C D
CDABSanat vaihdettu keskenäänC D A B
BADCTavut vaihdettu kunkin sanan sisälläB A D C
DCBASekä tavut että sanat vaihdettuD C B A

Käytetään esimerkkirekistereitä:

Rekisteri 1 = 0x42F6
Rekisteri 2 = 0x0000

Mahdolliset tavujärjestykset ovat:

JärjestysTavujärjestysFLOAT32-tulos
ABCD42 F6 00 00123.0
CDAB00 00 42 F6hyvin pieni arvo
BADCF6 42 00 00epärealistinen arvo
DCBA00 00 F6 42hyvin 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:

RekisterityyppiTyypillinen funktiokoodiKäyttöKoko
Coil01 / 05 / 15luku/kirjoitus1 bitti
Discrete Input02vain luku1 bitti
Input Register04vain luku16 bittiä
Holding Register03 / 06 / 16luku/kirjoitus16 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:

RaakarekisteriUINT16INT16
0xFF9C65436-100

Kahden rekisterin arvoissa vertaa vähintään:

TulkintaMitä se tarkistaa
UINT32 ABCDnormaali etumerkitön 32-bittinen arvo
INT32 ABCDnormaali etumerkillinen 32-bittinen arvo
FLOAT32 ABCDnormaali liukulukuarvo
FLOAT32 CDABsanavaihdettu liukulukuarvo
FLOAT32 BADCtavuvaihdettu liukulukuarvo
FLOAT32 DCBAsekä 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

TavutTietueArvo
01Modbus-osoite0x01 (1)
01Function code0x01 (1) - Read Coils
00 05Aloitusrekisterin osoiteBase-0: 0x0005 (5) Base-1: 0x0006 (6)
00 03Rekisterien määrä0x0003 (3)
6C 0ACRC0x6C0A (27658)

Vastaus: 01 01 01 02 D0 49

TavutTietueArvo
01Modbus-osoite0x01 (1)
01Function code0x01 (1) - Read Coils
01Datan tavu määrä0x01 (1)
02Rekisterien 5,6 ja 7 data0x02
Bits (bN=Arvo, LSB→MSB per tavu)b0=0, b1=1, b2=0, b3=0, b4=0, b5=0, b6=0, b7=0
D0 49CRC0xD049 (53321)

Read Discrete inputs: Function Code 02

Kysely: 01 02 00 02 00 02 58 0B

TavutTietueArvo
01Modbus-osoite0x01 (1)
02Function code0x02 (2) - Read Discrete Inputs
00 02Aloitusrekisterin osoiteBase-0: 0x0002 (2) Base-1: 0x0003 (3)
00 02Rekisterien määrä0x0002 (2)
58 0BCRC0x580B (22539)

Vastaus: 01 02 01 00 A1 88

TavutTietueArvo
01Modbus-osoite0x01 (1)
02Function code0x02 (2) - Read Discrete Inputs
01Datan tavu määrä0x01 (1)
00Rekisterien 2 ja 3 data0x00
Bits (bN=Arvo, LSB→MSB per byte)b0=0, b1=0, b2=0, b3=0, b4=0, b5=0, b6=0, b7=0
A1 88CRC0xA188 (41352)

Read Holding Registers: Function Code 03

Kysely: 01 03 00 07 00 02 75 CA

TavutTietueArvo
01Modbus-osoite0x01 (1)
03Function code0x03 (3) - Read Holding Registers
00 07Aloitusrekisterin osoiteBase-0: 0x0007 (7) Base-1: 0x0008 (8)
00 02Rekisterien määrä0x0002 (2)
75 CACRC0x75CA (30154)

Vastaus: 01 03 04 00 01 00 06 2B F1

TavutTietueArvo
01Modbus-osoite0x01 (1)
03Function code0x03 (3) - Read Holding Registers
04Datan tavu määrä0x04 (4)
00 01 00 06Rekisterien 7 ja 8 data0x0001 (1), 0x0006 (6)
2B F1CRC0x2BF1 (11249)

Read Input Register: Function Code 04

Kysely: 01 04 00 00 00 02 71 CB

TavutTietueArvo
01Modbus-osoite0x01 (1)
04Function code0x04 (4) - Read Input Registers
00 00Aloitusrekisterin osoiteBase-0: 0x0000 (0) Base-1: 0x0001 (1)
00 02Rekisterien määrä0x0002 (2)
71 CBCRC0x71CB (29131)

Vastaus: 01 04 04 00 01 00 0B EB 83

TavutTietueArvo
01Modbus-osoite0x01 (1)
04Function code0x04 (4) - Read Input Registers
04Tavu määrä0x04 (4)
00 01 00 0BRekisterien 0 ja 1 data0x0001 (1), 0x000B (11)
EB 83CRC0xEB83 (60291)

Write Single Coil: Function Code 05

Kysely: 16 05 00 09 00 00 1E EF

TavutTietueArvo
16Modbus-osoite0x16 (22)
05Function code0x05 (5) - Write Single Coil
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 00Rekisterin 9 dataB1:1
1E EFCRC0x1EEF (7919)

Vastaus: 16 05 00 09 FF 00 5F 1F

TavutTietueArvo
16Modbus-osoite0x16 (22)
05Function code0x05 (5) - Write Single Coil
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
FF 00Rekisterin 9 dataB0:1
5F 1FCRC0x5F1F (24351)

Write Single Register: Function code 06

Kysely: 16 06 00 09 00 01 9B 2F

TavutTietueArvo
16Modbus-osoite0x16 (22)
06Function code0x06 (6) - Write Single Register
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 01Rekisterin 9 data0x0001 (1)
9B 2FCRC0x9B2F (39727)

Vastaus: 16 06 00 09 00 01 9B 2F

TavutTietueArvo
16Modbus-osoite0x16 (22)
06Function code0x06 (6) - Write Single Register
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 01Rekisterin 9 data0x0001 (1)
9B 2FCRC0x9B2F (39727)

Write Multiple Coils: Function code 15

Kysely: 16 0F 00 09 00 05 01 0D 32 78

TavutTietueArvo
16Modbus-osoite0x16 (22)
0FFunction code0x0F (15) - Write Multiple Coils
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 05Rekisterien määrä0x0005 (5)
01Tavu määrä0x01 (1)
0DRekisterien 9-13 data0x0D
Bits (bN=Arvo, LSB→MSB per byte)b0=1, b1=0, b2=1, b3=1, b4=0, b5=0
32 78CRC0x3278 (12920)

Vastaus: 16 0F 00 09 00 05 46 ED

TavutTietueArvo
16Modbus-osoite0x16 (22)
0FFunction code0x0F (15) - Write Multiple Coils
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 05Rekisterien määrä0x0005 (5)
46 EDCRC0x46ED (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

TavutTietueArvo
16Modbus-osoite0x16 (22)
10Function code0x10 (16) - Write Multiple Registers
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 05Rekisterien määrä0x0005 (5)
0ATavu määrä0x0A (10)
00 09 00 02 00 4D 00 00 00 01Rekisterien 9-13 data0x0009 (9), 0x0002 (2), 0x004D (77), 0x0000 (0), 0x0001 (1)
13 5BCRC0x135B (4955)

Vastaus: 16 10 00 09 00 05 D3 2F

TavutTietueArvo
16Modbus-osoite0x16 (22)
10Function code0x10 (16) - Write Multiple Registers
00 09Aloitusrekisterin osoiteBase-0: 0x0009 (9) Base-1: 0x000A (10)
00 05Rekisterien määrä0x0005 (5)
D3 2FCRC0xD32F (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 codeResponse — 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

TavutTietueArvo
01Modbus-osoite0x01 (1)
01Function code0x01 (1) - Read Coils
00 42Aloitusrekisterin osoiteBase-0: 0x0042 (66) Base-1: 0x0043 (67)
00 03Määrä0x0003 (3)
DC 1FCRC0xDC1F (56351)

Vastaus: 01 81 01 81 90

TavutTietueArvo
01Modbus-osoite0x01 (1)
81Error code0x80 + 0x01 (1) - Read Coils
01Exception codeIllegal Function — Function code not supported or not allowed for this state.
81 90CRC0x8190 (33168)

Modbus virhekoodeja ovat

CodeNameMeaning
1 (0x01)ILLEGAL FUNCTIONThe 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 ADDRESSThe 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 VALUEA 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 FAILUREAn unrecoverable error occurred while the server was attempting to perform the requested action.
5 (0x05)ACKNOWLEDGESpecialized 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 BUSYSpecialized 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 ERRORSpecialized 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 UNAVAILABLESpecialized 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 RESPONDSpecialized 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ä.