TapHome

TapHome pro Modbus RTU / ASCII / TCP

TapHome jako Modbus slave pro BMS, SCADA či PLC přes Modbus TCP, RTU nebo ASCII: vyberte hodnoty a akce zařízení, předejte mapu registrů masteru a tam ji čtěte.

Poslední aktualizace:

TapHome může pracovat jako Modbus slave (server), takže systém řízení budovy (BMS), SCADA nebo PLC čte a ovládá zařízení TapHome přes Modbus TCP nebo přes Modbus RTU či ASCII na RS485. V části Vystavit zařízení vyberete hodnoty a akce každého zařízení, TapHome každé přidělí vlastní registr a výsledkem je mapa registrů, kterou předáte tomu, kdo nastavuje master. Takto může zařízení číst i druhý Core (propojení více Core).

Jak to funguje

  1. Na Core přidejte rozhraní Modbus a vyberte, co smí master vidět a dělat: hodnoty (teplota, úroveň žaluzií, stav spínače …) a akce (příkazy žaluzií, přepnutí …).
  2. Mapa registrů vzniká průběžně s výběrem: každá hodnota dostane rozsah registrů na nejbližší volné adrese a hned za ním registr platnosti.
  3. Na masteru zadá integrátor stejné registry jako body nebo tagy. Čtení vrátí aktuální hodnotu; zápis změní zařízení jako manuální změna, stejně jako v aplikaci.

Core dál řídí své moduly a smart rules; Modbus jen sdílí hodnoty a akce, které jste vybrali.

Příklad: žaluzie a termostat pro BMS

BMS budovy čte teplotu v místnosti, nastavuje požadovanou teplotu termostatu a může zastavit žaluzie. Na Core v části Vystavit zařízení vyberte Přidat nové rozhraní → Modbus TCP a potom přidejte žaluzie a termostat. Toto je úplná konfigurace na straně TapHome — klikněte na registr nebo na Přidat zařízení a uvidíte další krok:

Modbus TCP
Informace
1
IP adresa
Parametry
2
Zařízení
Žaluzie
3
Úroveň žaluzií
Úhel lamel
4
Zastavit
Termostat
Teplota
5
Požadovaná teplota
6
Přidat zařízení
Požadovaná teplota
Typ registru
Index registru
Datový typ
Datový typ
Zpět
Žaluzie
Hodnoty
Příkazy
OK
  1. IP adresa Core — BMS se připojuje na tuto adresu. Dejte Core pevnou adresu, například rezervací DHCP v routeru.
  2. Slave ID — BMS musí posílat stejné Unit ID; požadavek s jiným dostane výjimku 0x0A.
  3. Hodnota zabírá dva registry: samotnou hodnotu a za ní registr platnosti. ×100 je násobitel: úroveň žaluzií 0,55 se čte jako 55.
  4. Akce má jeden registr, do kterého BMS zapisuje. Stop je coil: zápis ON zastaví žaluzie.
  5. Nastavení registru — typ registru, index, datový typ, násobitel, pořadí bajtů a registr platnosti. Výchozí hodnoty obvykle vyhovují; index změňte, když BMS očekává pevné rozložení.
  6. Přidat zařízení — zaškrtněte hodnoty a akce zařízení; OK je přidá na nejbližší volné adresy. Zapisovatelné hodnoty dostanou holding register (H) nebo coil (C), hodnoty jen pro čtení input register (A) nebo discrete input (D).

Na straně BMS nebo SCADA

Master potřebuje IP adresu a port Core (nebo nastavení linky RS485), Slave ID a seznam bodů. Pro příklad výše:

BodRegistr TapHomeČíslování od 1Funkční kódHodnota
Úroveň žaluziíH 04000103 čtení, 06 zápis0–100
Platnost úrovně žaluziíH 140002030 = platná
Úhel lamelH 24000303 čtení, 06 zápis0–100
Platnost úhlu lamelH 340004030 = platná
Zastavení žaluziíC 40000505 zápisON = zastavit
TeplotaA 53000604÷ 10 = °C
Platnost teplotyA 630007040 = platná
Požadovaná teplotaH 74000803 čtení, 06 zápis÷ 10 = °C
Platnost požadované teplotyH 840009030 = platná

Všechny registry jsou Int16 (coil je jeden bit). H = holding register, A = input register, C = coil.

TapHome čísluje registry od 0, tak jak se posílají v požadavku. Mastery, které používají číslování od 1 (40001 pro holding register 0), mají číslo o jedna vyšší — posun o jedna je nejčastější příčina čtení nesprávné hodnoty.

Čtení a zápis z příkladu přes pymodbus 3.16:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from pymodbus.client import ModbusTcpClient

client = ModbusTcpClient("192.168.1.50", port=502)
client.connect()

# Teplota: input register 5 (hodnota × 10) a 6 (platnost, 0 = platná)
rr = client.read_input_registers(5, count=2, device_id=1)
value, validity = client.convert_from_registers(rr.registers, client.DATATYPE.INT16)
if validity == 0:
    print(f"Temperature: {value / 10} °C")

# Požadovaná teplota 22,5 °C: holding register 7, zapisuje se × 10
client.write_register(7, 225, device_id=1)

# Zastavení žaluzií: zápis ON do coilu 4
client.write_coil(4, True, device_id=1)
client.close()

Knihovny pro jiné jazyky: NModbus4 (C#), libmodbus (C), digitalpetri/modbus (Java), goburrow/modbus (Go). Protokol vysvětluje Simply Modbus.

Master by měl číst registr platnosti spolu s hodnotou (obojí jedním požadavkem) a každý kód jiný než 0 brát jako poruchu — ztracené zařízení se pak v BMS ukáže jako porucha, ne jako zamrzlá hodnota.

Rozhraní a komunikační vlastnosti

RozhraníVlastnostiVýchozí
Modbus TCPTCP port, Slave IDport 502, nejbližší volné Slave ID na portu
Modbus RTU, Modbus ASCIIsvorka BUS 1, BUS 2 nebo BUS 3, přenosová rychlost, datové bity, parita, stop bity, Slave IDbez svorky, 9600 Bd, 8 datových bitů (ASCII 7), parita None, 1 stop bit, Slave ID 1
  • Více masterů přes TCP: více rozhraní Modbus TCP může sdílet jeden port, pokud mají různá Slave ID — například jedno pro BMS a jedno pro druhý Core, každé s vlastními registry. Najednou nejvýše 10 spojení.
  • RS485: rozhraní RTU nebo ASCII se spustí až po výběru svorky a jedna svorka nese jedno rozhraní.
  • Slave ID je 1 až 247. Rozhraní odpovídá jen na vlastní: Modbus TCP vrátí na jiné Unit ID (i 0 nebo 255) výjimku 0x0A, RTU a ASCII na rámce pro jinou adresu neodpovídají.

Seznam rozhraní ukazuje konflikty, například stejný port a Slave ID dvakrát nebo rozhraní bez svorky.

Nastavení registru

NastaveníHodnoty
Typ registruH holding register, A input register, C coil, D discrete input. Master může zapisovat jen do H a C.
Index registru0 až 65535, adresa v požadavku Modbus.
Datový typBool, Int16 a UInt16 zabírají jeden registr, Int32, UInt32 a Float dva. C a D nesou jen Bool.
MultiplierČtení: registr = hodnota × násobitel. Zápis: hodnota = registr ÷ násobitel. Teploty mají výchozí ×10, úrovně a procenta ×100 (0,55 → 55).
ThresholdMísto násobitele pro Bool na číselné hodnotě: true, když hodnota dosáhne alespoň prahu; zápis true do coilu nastaví hodnotu na práh, false na 0.
EndiannessBigEndian nebo LittleEndian; Byte swap navíc prohodí bajty uvnitř každého registru u Int32, UInt32 a Float.

Detail rozhraní označí registry, jejichž rozsahy se překrývají. Překrývající se hodnota se neobsluhuje — dejte každé hodnotě vlastní rozsah včetně jejího registru platnosti.

Registr platnosti a náhradní hodnota

Include validity register (u C a D Include validity bit) je ve výchozím stavu zapnutý. Registr jen pro čtení hned za hodnotou oznamuje masteru, zda je hodnota platná; když není, registry hodnoty místo ní vrátí Fallback value (u Float NaN s volbou Use NaN as fallback).

KódVýznam
0platná
1hodnota se nevejde do datového typu (například NaN v celočíselném typu)
2zařízení je nedostupné nebo v chybě
3nastavení registru je neplatné
5zatím žádná hodnota, například hned po startu Core

U C a D je bit platnosti 1, když hodnota není platná.

Akce

  • Akce bez parametrů (Stop, Toggle …) má jeden registr na H nebo C. Zápis 1 nebo více, případně coil ON, ji spustí; zápis 0 vrátí výjimku 0x03.
  • Akce s parametry (přičtení k úrovni žaluzií, nastavení rozsahu …) má jeden holding register na každý parametr, jeden za druhým. Jeden zápis musí pokrýt všechny; zápis jen některých vrátí výjimku 0x03.
  • Registry akcí jsou jen pro zápis — jejich čtení vrátí výjimku 0x02.

Co dostane master

TapHome obsluhuje funkční kódy 01, 02, 03, 04, 05, 06, 15 a 16. Jeden požadavek může číst více hodnot za sebou; jinak master dostane výjimku:

VýjimkaKdy
0x01nepodporovaný funkční kód
0x02adresa nepřiřazená žádné hodnotě, rozsah s mezerou, zápis do A nebo D, čtení registru akce, zápis do registru platnosti
0x03hodnota, kterou zařízení nemůže přijmout, nebo neplatný zápis akce; zápis více hodnot se provede celý, nebo vůbec
0x04zařízení zápis odmítlo
0x0AModbus TCP: jiné Slave ID (Unit ID), než má rozhraní

Modbus TCP zavře spojení, které je 15 minut nečinné.

Aktualizace na 2026.1

Při aktualizaci řídicí jednotky na 2026.1 se existující rozhraní Modbus slave převedou automaticky se zachováním adres registrů a Slave ID. Registr Stop žaluzie KNX, žaluzie a zařízení Roleta typu Packet parser a virtuálního zařízení Roleta se nepřevede; master, který ho používal, dostane na jeho adrese výjimku 0x02 (release notes 2026.1).

Od verze 2026.1 odpovídá Modbus TCP jen na vlastní Slave ID — pokud váš master posílá Unit ID 0 nebo 255, nastavte ho na Slave ID rozhraní.

Ladění spojení Modbus RTU

RS485 je sdílená sběrnice, takže počítač s převodníkem USB na RS485 (například FTDI USB-RS485-WE-1800-BT) a terminálovým softwarem, jako je Terminal pro Windows, může během integrace odposlouchávat komunikaci.