Modbus a TapHome rendszerben RTU/ASCII/TCP
A TapHome Modbus slave-ként BMS, SCADA vagy PLC számára TCP-n, RTU-n vagy ASCII-n: válaszd ki az eszközök értékeit és műveleteit, a regisztertérképet add át a masternek.
Utoljára frissítve:
A TapHome Modbus slave-ként (szerverként) is működhet, így egy épületfelügyeleti rendszer (BMS), SCADA vagy PLC Modbus TCP-n, illetve RS485-ön Modbus RTU-n vagy ASCII-n olvassa és vezérli a TapHome eszközeit. Az Eszközök megosztása részben kiválasztod az egyes eszközök értékeit és műveleteit, a TapHome mindegyiknek saját regisztert ad, az eredmény pedig egy regisztertérkép, amelyet átadsz annak, aki a mastert beállítja. Egy második Core is így olvashatja az eszközöket (több Core összekapcsolása).
Hogyan működik
- A Core-on adj hozzá egy Modbus interfészt, és válaszd ki, mit láthat és mit tehet a master: értékeket (hőmérséklet, árnyékolók szintje, kapcsoló állapota …) és műveleteket (árnyékolóparancsok, átkapcsolás …).
- A regisztertérkép a kiválasztással együtt épül fel: minden érték a következő szabad címen kap egy regisztertartományt, közvetlenül utána pedig egy érvényességi regisztert.
- A masteren az integrátor ugyanezeket a regisztereket adja meg adatpontként (tag-ként). Az olvasás az aktuális értéket adja vissza; az írás kézi változtatásként módosítja az eszközt, ahogy az alkalmazásban.
A Core továbbra is a saját moduljait és smart rule-jait működteti; a Modbus csak a kiválasztott értékeket és műveleteket osztja meg.
Példa: árnyékoló és termosztát egy BMS számára
Egy épület BMS-e olvassa a helyiség hőmérsékletét, beállítja a termosztát alapjelét, és meg tudja állítani az árnyékolót. A Core-on az Eszközök megosztása részben válaszd az Új felület hozzáadása → Modbus TCP lehetőséget, majd add hozzá az árnyékolót és a termosztátot. Ez a teljes konfiguráció a TapHome oldalán — kattints egy regiszterre vagy az Eszköz hozzáadása gombra a következő lépés megtekintéséhez:
- A Core IP-címe — a BMS ehhez csatlakozik. Adj a Core-nak fix címet, például DHCP-foglalással a routerben.
- Slave ID — a BMS-nek ugyanazt a Unit ID-t kell küldenie; a más Unit ID-val érkező kérés 0x0A kivételt kap.
- Egy érték két regisztert foglal el: magát az értéket és utána az érvényességi regisztert. A ×100 a szorzó (Multiplier): a 0,55-ös árnyékolószint 55-ként olvasható.
- Egy műveletnek egy regisztere van, amelybe a BMS ír. A Stop egy coil: ON írása megállítja az árnyékolót.
- Regiszterbeállítások — regisztertípus, index, adattípus, szorzó, bájtsorrend és az érvényességi regiszter. Az alapértékek általában megfelelnek; az indexet akkor módosítsd, ha a BMS rögzített elrendezést vár.
- Eszköz hozzáadása — jelöld be az eszköz értékeit és műveleteit; az OK a következő szabad címekre adja hozzá őket. Az írható értékek holding regisztert (H) vagy coilt (C), a csak olvasható értékek input regisztert (A) vagy discrete inputot (D) kapnak.
A BMS vagy SCADA oldalán
A masternek szüksége van a Core IP-címére és portjára (vagy az RS485 vonal beállításaira), a Slave ID-ra és az adatpontlistára. A fenti példához:
| Adatpont | TapHome regiszter | 1-től számozott jelölés | Funkciókód | Érték |
|---|---|---|---|---|
| Árnyékolók szintje | H 0 | 40001 | 03 olvasás, 06 írás | 0–100 |
| Árnyékolók szintje – érvényesség | H 1 | 40002 | 03 | 0 = érvényes |
| Árnyékoló dőlése | H 2 | 40003 | 03 olvasás, 06 írás | 0–100 |
| Árnyékoló dőlése – érvényesség | H 3 | 40004 | 03 | 0 = érvényes |
| Árnyékoló megállítása | C 4 | 00005 | 05 írás | ON = megállítás |
| Hőmérséklet | A 5 | 30006 | 04 | ÷ 10 = °C |
| Hőmérséklet – érvényesség | A 6 | 30007 | 04 | 0 = érvényes |
| Beállított érték | H 7 | 40008 | 03 olvasás, 06 írás | ÷ 10 = °C |
| Beállított érték – érvényesség | H 8 | 40009 | 03 | 0 = érvényes |
Minden regiszter Int16 (a coil egy bit). H = holding regiszter, A = input regiszter, C = coil.
A TapHome 0-tól számozza a regisztereket, ahogyan a kérésben szerepelnek. Az 1-től számozó jelölést használó mastereknél (40001 a 0-s holding regiszterhez) a szám eggyel nagyobb — az eggyel való eltolódás a leggyakoribb oka annak, hogy a master rossz értéket olvas.
A példa olvasása és írása a pymodbus 3.16 segítségével:
| |
Könyvtárak más nyelvekhez: NModbus4 (C#), libmodbus (C), digitalpetri/modbus (Java), goburrow/modbus (Go). A protokollt a Simply Modbus magyarázza el.
A masternek az érvényességi regisztert az értékkel együtt kell olvasnia (egy kérésben mindkettőt), és minden 0-tól eltérő kódot hibaként kell kezelnie — így egy elveszett eszköz a BMS-ben hibaként jelenik meg, nem befagyott értékként.
Interfészek és kommunikációs tulajdonságok
| Interfész | Tulajdonságok | Alapérték |
|---|---|---|
| Modbus TCP | TCP port, Slave ID | 502-es port, a porton következő szabad Slave ID |
| Modbus RTU, Modbus ASCII | BUS 1, BUS 2 vagy BUS 3 terminál, átviteli sebesség, adatbitek, paritás, stopbitek, Slave ID | nincs terminál, 9600 baud, 8 adatbit (ASCII 7), paritás None, 1 stopbit, Slave ID 1 |
- Több master TCP-n: több Modbus TCP interfész is használhatja ugyanazt a portot, ha eltérő a Slave ID-juk — például egy a BMS-hez és egy egy második Core-hoz, mindegyik saját regiszterekkel. Egyszerre legfeljebb 10 kapcsolat lehet.
- RS485: az RTU vagy ASCII interfész csak akkor indul el, ha kiválasztasz egy terminált, és egy terminálon csak egy interfész lehet.
- A Slave ID 1 és 247 között lehet. Az interfész csak a sajátjára válaszol: a Modbus TCP más Unit ID-ra (0-ra vagy 255-re is) 0x0A kivételt ad vissza, az RTU és az ASCII nem válaszol a más címre szóló keretekre.
Az interfészek listája jelzi az ütközéseket, például ha ugyanaz a port és Slave ID kétszer szerepel, vagy ha egy interfésznek nincs terminálja.
Regiszterbeállítások
| Beállítás | Értékek |
|---|---|
| Regiszter típusa | H holding regiszter, A input regiszter, C coil, D discrete input. A master csak H-t és C-t írhat. |
| Regiszterindex | 0 és 65535 között, a cím a Modbus kérésben. |
| Adattípus | A Bool, az Int16 és az UInt16 egy regisztert foglal el, az Int32, az UInt32 és a Float kettőt. A C és a D csak Boolt hordoz. |
| Multiplier | Olvasás: regiszter = érték × szorzó. Írás: érték = regiszter ÷ szorzó. A hőmérséklet alapértelmezése ×10, a szinteké és a százalékoké ×100 (0,55 → 55). |
| Threshold | Bool esetén numerikus értéken a szorzó helyett: true, ha az érték eléri a küszöbértéket (legalább akkora); true írása egy coilba az értéket a küszöbértékre, false írása 0-ra állítja. |
| Endianness | BigEndian vagy LittleEndian; a Byte swap az Int32, UInt32 és Float minden regiszterén belül a bájtokat is felcseréli. |
Az interfész részletei megjelölik azokat a regisztereket, amelyek tartományai átfedik egymást. Az átfedő értéket a rendszer nem szolgálja ki — adj minden értéknek saját tartományt, az érvényességi regiszterével együtt.
Érvényességi regiszter és tartalékérték
Az Include validity register (C és D esetén Include validity bit) alapértelmezés szerint be van kapcsolva. Az értéket közvetlenül követő, csak olvasható regiszter jelzi a masternek, hogy az érték érvényes-e; ha nem, az érték regiszterei helyette a Fallback value értéket adják vissza (Float esetén NaN-t a Use NaN as fallback beállítással).
| Kód | Jelentés |
|---|---|
| 0 | érvényes |
| 1 | az érték nem fér el az adattípusban (például NaN egész típusban) |
| 2 | az eszköz nem érhető el, vagy hibás |
| 3 | a regiszterbeállítások érvénytelenek |
| 5 | még nincs érték, például közvetlenül a Core indulása után |
C és D esetén az érvényességi bit 1, ha az érték nem érvényes.
Műveletek
- A paraméter nélküli műveletnek (Stop, Átkapcsolás …) egy regisztere van H-n vagy C-n. 1 vagy nagyobb érték, illetve coil esetén ON írása elindítja; 0 írása 0x03 kivételt ad vissza.
- A paraméteres műveletnek (hozzáadás az árnyékolók szintjéhez, tartomány beállítása …) paraméterenként egy holding regisztere van, egymás után. Egyetlen írásnak mindegyiket le kell fednie; ha csak néhányat írsz, 0x03 kivételt ad vissza.
- A műveletregiszterek csak írhatók — olvasásuk 0x02 kivételt ad vissza.
Mit kap a master
A TapHome a 01, 02, 03, 04, 05, 06, 15 és 16 funkciókódot szolgálja ki. Egy kérés több egymást követő értéket is olvashat; egyébként a master kivételt kap:
| Kivétel | Mikor |
|---|---|
| 0x01 | nem támogatott funkciókód |
| 0x02 | egyetlen értékhez sem rendelt cím, hézagos tartomány, írás A-ra vagy D-re, műveletregiszter olvasása, írás érvényességi regiszterbe |
| 0x03 | olyan érték, amelyet az eszköz nem tud fogadni, vagy érvénytelen műveletírás; a több értéket tartalmazó írás vagy teljesen végrehajtódik, vagy egyáltalán nem |
| 0x04 | az eszköz elutasította az írást |
| 0x0A | Modbus TCP: az interfészétől eltérő Slave ID (Unit ID) |
A Modbus TCP lezárja a 15 percig tétlen kapcsolatokat.
Frissítés 2026.1-re
A vezérlőegység 2026.1-re frissítésekor a meglévő Modbus slave interfészek automatikusan átalakulnak, a regisztercímek és a Slave ID megtartásával. A KNX-árnyékoló, a Packet parser árnyékolója és Napellenző eszköze, valamint a virtuális Napellenző eszköz Stop regisztere nem alakul át; az ezt használó master a regiszter címén 0x02-es kivételt kap (2026.1 kiadási megjegyzések).
A 2026.1 óta a Modbus TCP csak a saját Slave ID-jára válaszol — ha a mastered 0-s vagy 255-ös Unit ID-t küld, állítsd át az interfész Slave ID-jára.
Modbus RTU-kapcsolatok hibakeresése
Az RS485 közös busz, így az integráció során egy USB–RS485 átalakítóval (például FTDI USB-RS485-WE-1800-BT) és terminálszoftverrel, például a Windowsra készült Terminal programmal ellátott számítógép lehallgathatja a kommunikációt.