Miksi Modbus-arvoni on väärä?
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:
| Tietotyyppi | Koko | Rekistereitä |
|---|---|---|
UINT16 | 16 bittiä | 1 |
INT16 | 16 bittiä | 1 |
UINT32 | 32 bittiä | 2 |
INT32 | 32 bittiä | 2 |
FLOAT32 | 32 bittiä | 2 |
UINT64 / INT64 | 64 bittiä | 4 |
FLOAT64 | 64 bittiä | 4 |
Rekisterikartan pitää määrittää esitystapa. Pelkkä “temperature” tai “32-bit value” ei riitä.
Etumerkillinen ja etumerkitön tulkinta
Tarkastellaan samaa 16-bittistä raaka-arvoa:
0xFF9C
| Tulkinta | Arvo |
|---|---|
UINT16 | 65436 |
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:
| Tulkinta | Tulos |
|---|---|
UINT32 | 1123418112 |
INT32 | 1123418112 |
FLOAT32 | 123.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ärjestys | Tavujono |
|---|---|
ABCD | A B C D |
CDAB | C D A B |
BADC | B A D C |
DCBA | D 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.
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.
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ä:
- Kaappaa tai pura raaka Modbus-vastaus.
- Varmista Function Code ja rekisteriosoite.
- Varmista dokumentin osoitenumerointi.
- Varmista tietotyyppi ja rekisterien määrä.
- Tarkista etumerkillinen tai etumerkitön tulkinta.
- Usean rekisterin arvossa tarkista sana- ja tavujärjestys.
- Käytä dokumentoitua skaalaa ja offsetia.
- Varmista yksikkö.
- Tarkista muuttaako jokin toinen rekisteri tulkintaa.
- 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.