Miksi Modbus-arvoni on väärä?

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

Miksi Modbus-arvoni on väärä?

Yleinen Modbus-vianselvitystilanne on tämä:

Laite vastaa oikein, mutta PLC:ssä, SCADA:ssa, BMS-järjestelmässä tai käyttöönotto-ohjelmassa näkyvä arvo on väärä.

Tämä tarkoittaa yleensä sitä, että itse tiedonsiirto toimii, mutta raakarekisteridata tulkitaan väärin.

Toisin sanoen:

Kelvollinen Modbus-vastaus ei automaattisesti tarkoita, että näytetty arvo on oikea.

Kysely voi olla oikea, vastaus voi olla oikea ja CRC voi olla oikein. Lopullinen arvo voi silti olla väärä, jos client käyttää väärää datatyyppiä, tavujärjestystä, sanajärjestystä, skaalausta, offset-arvoa, yksikköä tai rekisteriosoitetta.

Modbus siirtää raakadataa

Modbus ei tiedä, sisältääkö rekisteri lämpötilan, paineen, tehon, energian, kosteuden, tilatiedon vai hälytyskoodin.

Se siirtää vain bittejä ja 16-bittisiä rekistereitä.

Modbus-rekisteri on:

1 rekisteri = 16 bittiä = 2 tavua = 4 heksamerkkiä

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

1 rekisteri   = 16 bittiä
2 rekisteriä  = 32 bittiä
4 rekisteriä  = 64 bittiä

Yleisiä datatyyppejä ovat:

DatatyyppiKokoRekisterien määrä
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ä

Jos dokumentaatiossa sanotaan, että arvo on FLOAT32, client-laitteen täytyy lukea kaksi peräkkäistä 16-bittistä rekisteriä ja yhdistää ne oikein.

Jos luetaan vain yksi rekisteri, arvo on väärä.

Etumerkilliset ja etumerkittömät arvot

Sama raakamuotoinen 16-bittinen rekisteri voi tuottaa hyvin erilaisen arvon riippuen siitä, tulkitaanko se etumerkillisenä vai etumerkittömänä.

Esimerkki:

Raakarekisteri = 0xFF9C
DatatyyppiTulos
UINT1665436
INT16-100

Etumerkittömänä arvona 0xFF9C tarkoittaa 65436.

Etumerkillisenä 16-bittisenä arvona, two’s complement -esitystavalla, se tarkoittaa -100.

Tämä on tärkeää arvoissa, jotka voivat mennä nollan alapuolelle, kuten:

  • ulkolämpötila
  • paine-ero
  • kalibrointipoikkeama
  • ohjauskorjaus
  • tehon tuonti/vienti

Jos skaalauskerroin on 0.1, lopullinen arvo on:

-100 x 0.1 = -10.0 °C

Eli arvo, joka näyttää ensin luvulta 65436, voikin todellisuudessa tarkoittaa arvoa -10.0 °C.

32-bittiset arvot käyttävät kahta rekisteriä

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 usealla tavalla:

TulkintaTulos
UINT321123418112
INT321123418112
FLOAT32123.0

Raakadata on sama. Vain tulkinta muuttuu.

Jos arvon pitäisi olla normaali mittausarvo, FLOAT32 = 123.0 voi olla järkevä. Kokonaislukutulkinnat eivät todennäköisesti ole tässä yhteydessä merkityksellisiä.

Tavujärjestys ja sanajärjestys

32-bittinen arvo koostuu neljästä tavusta. Niitä kuvataan usein näin:

A B C D

Koska Modbus-rekisterit ovat 16-bittisiä, arvo jaetaan kahteen rekisteriin:

Rekisteri 1 = A B
Rekisteri 2 = C D

Yleisiä 32-bittisten arvojen tavu- ja sanajärjestyksiä ovat:

JärjestysMerkitysTavujärjestys
ABCDnormaali big-endian-järjestysA B C D
CDABsanat vaihdettuC D A B
BADCtavut vaihdettu sanojen sisälläB A D C
DCBAtavut ja 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 yleisimmistä syistä siihen, miksi Modbus-arvo näyttää väärältä, vaikka kysely ja vastaus ovat kelvollisia.

Skaalaus ja offset

Monet laitteet eivät lähetä lopullista mittausarvoa suoraan. Sen sijaan laite lähettää raaka-arvon, joka täytyy skaalata.

Mittausarvo = raaka-arvo x skaalauskerroin

Esimerkki:

Raaka-arvo = 234
Skaalauskerroin = 0.1
Mittausarvo = 234 x 0.1 = 23.4 °C

Joissain laitteissa käytetään myös offset-arvoa:

Mittausarvo = raaka-arvo x skaalauskerroin + offset

Esimerkki:

Raaka-arvo = 234
Skaalauskerroin = 0.1
Offset = -50
Mittausarvo = 234 x 0.1 - 50 = -26.6

Skaalauskerroin, offset ja yksikkö täytyy tarkistaa laitekohtaisesta rekisterikartasta.

Rekisteriosoitteen ongelmat

Väärä arvo voi johtua myös siitä, että luetaan väärää rekisteriä.

Joissain manuaaleissa holding register -rekisterit esitetään esimerkiksi näin:

40001
40002
40003

Varsinainen Modbus-kysely voi kuitenkin käyttää nollapohjaisia osoitteita:

0
1
2

Tämä tarkoittaa, että rekisteri 40001 saatetaan joutua lukemaan osoitteesta 0.

Rekisteri 40008 saatetaan joutua lukemaan osoitteesta 7.

Jos client lukee yhden rekisterin liian aikaisin tai liian myöhään, laite voi silti vastata, mutta palautettu arvo kuuluu eri rekisterille.

Väärä rekisterityyppi tai funktiokoodi

Modbusissa on eri rekisterialueita:

RekisterityyppiTyypillinen funktiokoodiKäyttöoikeusKoko
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.

Toinen lukee Holding Register -alueelta. Toinen lukee Input Register -alueelta.

Vianetsinnän tarkistuslista

Kun Modbus-arvo näyttää väärältä, tarkista ainakin nämä asiat:

  1. Onko rekisteriosoite oikea?
  2. Käyttääkö dokumentaatio 0-pohjaista vai 1-pohjaista osoitteistusta?
  3. Luetaanko oikeaa rekisterityyppiä?
  4. Käytetäänkö oikeaa funktiokoodia?
  5. Onko arvo etumerkillinen vai etumerkitön?
  6. Onko arvo 16-, 32- vai 64-bittinen?
  7. Luetaanko tarpeeksi monta rekisteriä?
  8. Ovatko kaksi 16-bittistä sanaa oikeassa järjestyksessä?
  9. Ovatko tavut sanojen sisällä oikeassa järjestyksessä?
  10. Tarvitaanko skaalauskerrointa?
  11. Tarvitaanko offset-arvoa?
  12. Onko näytetty yksikkö oikea?

Hyvä vianselvitystapa

Aloita raakarekisteriarvoista ennen kuin muutat ne mittausarvoiksi.

Yhden rekisterin arvoissa vertaa ainakin:

RaakarekisteriUINT16INT16
0xFF9C65436-100

Kahden rekisterin arvoissa vertaa ainakin:

TulkintaMitä se tarkistaa
UINT32 ABCDnormaali etumerkitön 32-bittinen arvo
INT32 ABCDnormaali etumerkillinen 32-bittinen arvo
FLOAT32 ABCDnormaali liukuluku
FLOAT32 CDABsanajärjestys vaihdettu
FLOAT32 BADCtavut vaihdettu sanojen sisällä
FLOAT32 DCBAtavut ja sanat vaihdettu

Jos yksi tulkinta antaa realistisen arvon ja muut tuottavat mahdottomia arvoja, realistinen tulkinta on usein tarkoitettu formaatti. Varmista se kuitenkin laitteen rekisterikartasta ennen lopullista käyttöönottoa.

Yhteenveto

Jos Modbus-laite vastaa, mutta arvo on väärä, älä oleta heti, että tiedonsiirto on rikki.

Tarkista ensin, miten raakarekisteridata tulkitaan.

Useimmat väärän arvon ongelmat johtuvat jostain näistä:

  • väärä rekisteriosoite
  • 0-pohjaisen ja 1-pohjaisen osoitteistuksen sekoittuminen
  • väärä rekisterityyppi
  • väärä datatyyppi
  • etumerkillisen ja etumerkittömän arvon sekoittuminen
  • väärä tavujärjestys
  • väärä sanajärjestys
  • puuttuva skaalauskerroin
  • puuttuva offset
  • väärä yksikkö

Hyvä tapa on tulkita samat raakarekisterit useana eri datatyyppinä ja tavujärjestyksenä. Tämä näyttää nopeasti, onko ongelma tiedonsiirrossa vai arvon muunnoksessa.