Miksi Modbus-arvoni on väärä?

Julkaistu 2026-05-17 · kirjoittanut Henry Forsström · Päivitetty 2026-09-05

Yksi tavallisimmista Modbus-vioista näyttää ensi silmäyksellä terveeltä. Pyyntö on kelvollinen, laite vastaa ja CRC täsmää, mutta PLC:n, BMS:n tai käyttöönottotyökalun näyttämä arvo on väärä.

Tämä tarkoittaa yleensä sitä, että tiedonsiirto toimii mutta vastaanotetut rekisterit tulkitaan väärin. Samat 16 tai 32 bittiä voivat tarkoittaa täysin eri arvoa riippuen rekisteriosoitteesta, tietotyypistä, etumerkillisyydestä, sanajärjestyksestä, skaalauksesta ja yksiköstä.

Hyvä perussääntö on:

Kelvollinen Modbus-kehys != oikea prosessiarvo

Aloita raakavastauksesta

Ennen kuin muutat BMS:n skaalausta, kirjoita ylös mitä laite todella palautti. Jos mahdollista, pura kehys ja tallenna 16-bittiset raakarekisterit.

Esimerkiksi:

Rekisteriarvo = 0xFF9C

Älä aloita kysymällä näyttääkö 65436 järkevältä. Kysy ensin, mitä rekisterikartan mukaan tämän 16-bittisen arvon pitäisi tarkoittaa.

Voit tarkistaa kaapatun pyynnön tai vastauksen Modbus-dekooderilla.

Tarkista ensin osoite ja rekisterityyppi

Täydellinen datamuunnos väärälle rekisterille antaa edelleen väärän arvon.

Varmista:

  • pyydetty protokollaosoite
  • käyttääkö dokumentaatio 0-pohjaista, 1-pohjaista vai 4xxxx-tyyppistä numerointia
  • oikea datamalli: Coil, Discrete Input, Input Register tai Holding Register
  • Function Code
  • kuinka monta peräkkäistä rekisteriä arvo käyttää

Osoitteen 10 lukeminen Function Codella 03 ei ole sama pyyntö kuin osoitteen 10 lukeminen Function Codella 04. Samoin dokumentin 40001 voi tarkoittaa protokollaosoitetta 0, ei pyyntöosoitetta neljäkymmentätuhatta ja yksi.

Osoitenumeroinnista tarkemmin: Modbus-osoitteet: 40001, 0-pohjainen ja 1-pohjainen.

Yksi rekisteri ei kerro omaa tietotyyppiään

Modbus-rekisteri kuljettaa 16 bittiä. Protokolla ei kerro clientille, ovatko bitit etumerkitön kokonaisluku, etumerkillinen kokonaisluku, bittikenttä vai osa suurempaa arvoa.

Tyypillisiä esityksiä ovat:

TietotyyppiKokoRekistereitä
UINT1616 bittiä1
INT1616 bittiä1
UINT3232 bittiä2
INT3232 bittiä2
FLOAT3232 bittiä2
UINT64 / INT6464 bittiä4
FLOAT6464 bittiä4

Rekisterikartan pitää määrittää esitystapa. Pelkkä “temperature” tai “32-bit value” ei riitä.

Modbus register widths 16-bit, 32-bit ja 64-bit arvoille

Etumerkillinen ja etumerkitön tulkinta

Tarkastellaan samaa 16-bittistä raaka-arvoa:

0xFF9C
TulkintaArvo
UINT1665436
INT16-100

Jos rekisteri on INT16-lämpötila skaalalla x0.1 °C, prosessiarvo on:

-100 x 0.1 = -10.0 °C

Tiedonsiirto ei ole rikki. Samat bitit tulkittiin vain väärällä numeerisella tyypillä.

Etumerkillisyys on tärkeä aina, kun fyysinen suure voi olla negatiivinen, esimerkiksi ulkolämpötila, paine-ero, kalibrointikorjaus tai säätimen korjausarvo.

32-bittinen arvo vaatii sekä tietotyypin että rekisterijärjestyksen

32-bittinen arvo käyttää kahta 16-bittistä rekisteriä. Oletetaan, että laite palauttaa:

Rekisteri 1 = 0x42F6
Rekisteri 2 = 0x0000

Tavut ovat:

42 F6 00 00

Normaalilla sanajärjestyksellä samat tavut voidaan tulkita esimerkiksi näin:

TulkintaTulos
UINT321123418112
INT321123418112
FLOAT32123.0

Jos rekisterikartta sanoo tietotyypiksi FLOAT32, arvo 123.0 on oikea tulkinta. Uskottava arvo on kuitenkin vain vihje, ei todiste. Varmista tietotyyppi dokumentaatiosta tai tunnetulla testitilanteella.

Tavu- ja sanajärjestys

32-bittisen arvon neljä tavua voidaan merkitä A B C D. Kaksi Modbus-rekisteriä sisältää silloin kaksi 16-bittistä sanaa.

Laitteet ja clientit voivat yhdistää sanat eri tavoin:

JärjestysTavujono
ABCDA B C D
CDABC D A B
BADCB A D C
DCBAD C B A

Modbus määrittelee protokollakenttien tavujärjestyksen, mutta usean rekisterin sovellusarvon esitystapa pitää silti dokumentoida valmistajan rekisterikartassa. Sanajärjestystä ei pidä päätellä toisen saman valmistajan tuotteen perusteella.

Byte order ja word order multi-register Modbus arvoissa

Jos useampi järjestys antaa uskottavan luvun, muuta fyysistä testitilannetta tai vertaa tunnettuun referenssiin. Yhdessä toimintapisteessä uskottavalta näyttävä luku voi silti olla väärin.

Skaalaus, offset ja yksikkö

Moni laite palauttaa kokonaislukuesityksen valmiin prosessiarvon sijaan.

Esimerkki:

Raaka-arvo = 234
Skaala = x0.1
Arvo = 23.4 °C

Joissakin rajapinnoissa käytetään myös offsetia:

Prosessiarvo = raaka-arvo x skaala + offset

Skaala, offset ja yksikkö ovat erillisiä ominaisuuksia. Yksikköä ei voi päätellä turvallisesti pelkästä numerosta.

Raw Modbus values muunnettuna eri scaling factoreilla

Skaalaus ja todellinen resoluutio eivät ole sama asia

Kirjoitettavissa arvoissa tulee vastaan hienovarainen ero. Rekisteri voi esittää lämpötilan 0.1 °C askelin, vaikka laitteen todellinen säätölogiikka hyväksyy vain 0.5 °C askeleet.

Client voi esimerkiksi kirjoittaa raaka-arvon 198, joka tarkoittaa 19.8 °C. Laite voi normalisoida sen arvoon 20.0 °C ja palauttaa takaisinluettaessa arvon 200. Molemmat puolet voivat toimia omien oletustensa mukaan oikein, mutta rajapinta on epäselvä, jos todellista resoluutiota ja normalisointikäytäntöä ei dokumentoida.

Lukuarvolle ero voi jäädä huomaamatta. Kirjoitettavassa arvossa se voi aiheuttaa jatkuvan uudelleenkirjoituksen, jos PLC vaatii, että takaisinluettu arvo vastaa täsmälleen alkuperäistä raakakomentoa.

Piilotettu riippuvuus voi muuttaa muuten oikean arvon merkityksen

Joskus rekisteri on tulkittu oikein, mutta toinen asetus muuttaa sen merkityksen. Globaali lämpötilayksikkö on hyvä esimerkki. Jos yksi asetus vaihtaa sadat Modbus-arvot Celsius-asteista Fahrenheit-asteiksi, BMS:n on tunnettava valitsimen tila ennen kuin lämpötiloja voidaan tulkita turvallisesti.

Koneiden välisessä rajapinnassa kiinteät yksiköt ovat usein helpompia integroida. Jos riippuvuus on välttämätön, se pitää dokumentoida jokaisen rekisterin yhteydessä ja tehdasasetuksen pitää olla määritelty.

Myös dokumentoimaton oletusarvo on ongelma. Jos enum määrittelee vain arvot 1, 2 ja 3, mutta laite käynnistyy arvolla 0, nollan merkitys pitää kuvata.

Luotettava vianhakumenetelmä

Kun näytetty arvo on väärä:

  1. Kaappaa tai pura raaka Modbus-vastaus.
  2. Varmista Function Code ja rekisteriosoite.
  3. Varmista dokumentin osoitenumerointi.
  4. Varmista tietotyyppi ja rekisterien määrä.
  5. Tarkista etumerkillinen tai etumerkitön tulkinta.
  6. Usean rekisterin arvossa tarkista sana- ja tavujärjestys.
  7. Käytä dokumentoitua skaalaa ja offsetia.
  8. Varmista yksikkö.
  9. Tarkista muuttaako jokin toinen rekisteri tulkintaa.
  10. Kirjoitettavissa arvoissa varmista resoluutio, validointi ja takaisinluvun käyttäytyminen.

Älä säädä muunnosta ennen kuin raakadatapolku on ymmärretty. Muuten vaarana on, että konfiguraatio vain peittää väärän rekisterin tai väärän tietotyypin.

Laajempi tausta löytyy Modbus RTU ja TCP -oppaasta.