Miksi Modbus-arvoni on väärä?
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:
| Datatyyppi | Koko | Rekisterien määrä |
|---|---|---|
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ä |
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
| Datatyyppi | Tulos |
|---|---|
UINT16 | 65436 |
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:
| Tulkinta | Tulos |
|---|---|
UINT32 | 1123418112 |
INT32 | 1123418112 |
FLOAT32 | 123.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ärjestys | Merkitys | Tavujärjestys |
|---|---|---|
ABCD | normaali big-endian-järjestys | A B C D |
CDAB | sanat vaihdettu | C D A B |
BADC | tavut vaihdettu sanojen sisällä | B A D C |
DCBA | tavut ja 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 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:
| Rekisterityyppi | Tyypillinen funktiokoodi | Käyttöoikeus | 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.
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:
- Onko rekisteriosoite oikea?
- Käyttääkö dokumentaatio 0-pohjaista vai 1-pohjaista osoitteistusta?
- Luetaanko oikeaa rekisterityyppiä?
- Käytetäänkö oikeaa funktiokoodia?
- Onko arvo etumerkillinen vai etumerkitön?
- Onko arvo 16-, 32- vai 64-bittinen?
- Luetaanko tarpeeksi monta rekisteriä?
- Ovatko kaksi 16-bittistä sanaa oikeassa järjestyksessä?
- Ovatko tavut sanojen sisällä oikeassa järjestyksessä?
- Tarvitaanko skaalauskerrointa?
- Tarvitaanko offset-arvoa?
- Onko näytetty yksikkö oikea?
Hyvä vianselvitystapa
Aloita raakarekisteriarvoista ennen kuin muutat ne mittausarvoiksi.
Yhden rekisterin arvoissa vertaa ainakin:
| Raakarekisteri | UINT16 | INT16 |
|---|---|---|
0xFF9C | 65436 | -100 |
Kahden rekisterin arvoissa vertaa ainakin:
| Tulkinta | Mitä se tarkistaa |
|---|---|
UINT32 ABCD | normaali etumerkitön 32-bittinen arvo |
INT32 ABCD | normaali etumerkillinen 32-bittinen arvo |
FLOAT32 ABCD | normaali liukuluku |
FLOAT32 CDAB | sanajärjestys vaihdettu |
FLOAT32 BADC | tavut vaihdettu sanojen sisällä |
FLOAT32 DCBA | tavut 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.