TapHome

TapHome zu Modbus RTU / ASCII / TCP

TapHome als Modbus-Slave für BMS, SCADA oder SPS über Modbus TCP, RTU oder ASCII: Werte und Aktionen jedes Geräts wählen, die Registertabelle dem Master übergeben und dort auslesen.

Zuletzt aktualisiert:

TapHome kann als Modbus-Slave (Server) arbeiten, sodass ein Gebäudemanagementsystem (BMS), ein SCADA-System oder eine SPS TapHome-Geräte über Modbus TCP oder über Modbus RTU bzw. ASCII per RS485 liest und steuert. Unter Geräte freigeben wählen Sie die Werte und Aktionen jedes Geräts aus, TapHome gibt jedem davon ein eigenes Register, und das Ergebnis ist eine Registertabelle, die Sie demjenigen übergeben, der den Master einrichtet. Auf diese Weise kann auch ein zweiter Core die Geräte lesen (Mehrere Cores verbinden).

So funktioniert es

  1. Auf dem Core fügen Sie eine Modbus-Schnittstelle hinzu und wählen aus, was der Master sehen und tun darf: Werte (Temperatur, Jalousien-Position, Schaltzustand …) und Aktionen (Jalousiebefehle, Umschalten …).
  2. Die Registertabelle entsteht bei der Auswahl: Jeder Wert erhält einen Registerbereich an der nächsten freien Adresse, direkt dahinter ein Gültigkeitsregister.
  3. Auf dem Master trägt der Integrator dieselben Register als Datenpunkte oder Tags ein. Lesen liefert den aktuellen Wert; Schreiben ändert das Gerät als manuelle Änderung, wie in der App.

Der Core betreibt weiterhin seine eigenen Module und smart rules; Modbus teilt nur die Werte und Aktionen, die Sie ausgewählt haben.

Beispiel: Jalousie und Thermostat für ein BMS

Das BMS eines Gebäudes liest die Raumtemperatur, stellt den Sollwert des Thermostats ein und kann die Jalousie stoppen. Wählen Sie auf dem Core unter Geräte freigeben Neue Schnittstelle hinzufügen → Modbus TCP und fügen Sie dann die Jalousie und das Thermostat hinzu. Das ist die vollständige Konfiguration auf der TapHome-Seite — klicken Sie auf ein Register oder auf Gerät hinzufügen, um den nächsten Schritt zu sehen:

Modbus TCP
Informationen
1
IP-Adresse
Parameter
2
Geräte
Jalousien
3
Jalousien-Position
Lamellenwinkel
4
Stopp
Thermostat
Temperatur
5
Sollwert
6
Gerät hinzufügen
Sollwert
Art des Registers
Index des Registers
Datentyp
Datentyp
Zurück
Jalousien
Werte
Befehle
OK
  1. IP-Adresse des Core — mit ihr verbindet sich das BMS. Geben Sie dem Core eine feste Adresse, zum Beispiel per DHCP-Reservierung im Router.
  2. Slave ID — das BMS muss dieselbe Unit ID senden; eine Anfrage mit einer anderen erhält die Ausnahme 0x0A.
  3. Ein Wert belegt zwei Register: den Wert selbst und dahinter das Gültigkeitsregister. ×100 ist der Multiplier: Die Jalousien-Position 0,55 wird als 55 gelesen.
  4. Eine Aktion hat ein Register, in das das BMS schreibt. Stop ist eine Coil: Das Schreiben von ON stoppt die Jalousie.
  5. Registereinstellungen — Registertyp, Index, Datentyp, Multiplier, Bytereihenfolge und das Gültigkeitsregister. Die Standardwerte passen meist; ändern Sie den Index, wenn das BMS ein festes Layout erwartet.
  6. Gerät hinzufügen — markieren Sie die Werte und Aktionen des Geräts; OK fügt sie an den nächsten freien Adressen hinzu. Beschreibbare Werte erhalten ein Holding-Register (H) oder eine Coil (C), schreibgeschützte Werte ein Input-Register (A) oder einen Discrete Input (D).

Auf der Seite des BMS oder SCADA

Der Master braucht die IP-Adresse und den Port des Core (oder die Einstellungen der RS485-Leitung), die Slave ID und die Datenpunktliste. Für das Beispiel oben:

DatenpunktTapHome-Register1-basierte SchreibweiseFunktionscodeWert
Jalousien-PositionH 04000103 lesen, 06 schreiben0–100
Gültigkeit Jalousien-PositionH 140002030 = gültig
LamellenwinkelH 24000303 lesen, 06 schreiben0–100
Gültigkeit LamellenwinkelH 340004030 = gültig
Jalousie stoppenC 40000505 schreibenON = Stopp
TemperaturA 53000604÷ 10 = °C
Gültigkeit TemperaturA 630007040 = gültig
SollwertH 74000803 lesen, 06 schreiben÷ 10 = °C
Gültigkeit SollwertH 840009030 = gültig

Alle Register sind Int16 (eine Coil ist ein Bit). H = Holding-Register, A = Input-Register, C = Coil.

TapHome nummeriert die Register ab 0, so wie sie in der Anfrage gesendet werden. Bei Mastern mit 1-basierter Schreibweise (40001 für Holding-Register 0) ist die Nummer um eins höher — ein Versatz um eins ist die häufigste Ursache dafür, dass ein falscher Wert gelesen wird.

Lesen und Schreiben des Beispiels mit 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()

# Temperatur: Input-Register 5 (Wert × 10) und 6 (Gültigkeit, 0 = gültig)
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")

# Sollwert 22,5 °C: Holding-Register 7, geschrieben × 10
client.write_register(7, 225, device_id=1)

# Jalousie stoppen: ON in Coil 4 schreiben
client.write_coil(4, True, device_id=1)
client.close()

Bibliotheken für andere Sprachen: NModbus4 (C#), libmodbus (C), digitalpetri/modbus (Java), goburrow/modbus (Go). Simply Modbus erklärt das Protokoll.

Der Master sollte das Gültigkeitsregister zusammen mit dem Wert lesen (eine Anfrage für beide) und jeden Code außer 0 als Störung behandeln — ein ausgefallenes Gerät erscheint im BMS dann als Störung und nicht als eingefrorener Wert.

Schnittstellen und Kommunikationseigenschaften

SchnittstelleEigenschaftenStandard
Modbus TCPTCP port, Slave IDPort 502, die nächste freie Slave ID auf dem Port
Modbus RTU, Modbus ASCIIKlemme BUS 1, BUS 2 oder BUS 3, Baudrate, Datenbits, Parität, Stoppbits, Slave IDkeine Klemme, 9600 Baud, 8 Datenbits (ASCII 7), Parität None, 1 Stoppbit, Slave ID 1
  • Mehrere Master über TCP: Mehrere Modbus-TCP-Schnittstellen können sich einen Port teilen, wenn sie unterschiedliche Slave IDs haben — zum Beispiel eine für das BMS und eine für einen zweiten Core, jede mit eigenen Registern. Bis zu 10 Verbindungen gleichzeitig.
  • RS485: Eine RTU- oder ASCII-Schnittstelle startet erst, wenn Sie eine Klemme wählen, und an einer Klemme läuft nur eine Schnittstelle.
  • Slave ID liegt zwischen 1 und 247. Die Schnittstelle antwortet nur auf ihre eigene: Modbus TCP gibt bei einer anderen Unit ID (auch 0 oder 255) die Ausnahme 0x0A zurück, RTU und ASCII beantworten Frames für eine andere Adresse nicht.

Die Liste der Schnittstellen zeigt Konflikte an, zum Beispiel denselben Port mit derselben Slave ID zweimal oder eine Schnittstelle ohne Klemme.

Registereinstellungen

EinstellungWerte
Art des RegistersH Holding-Register, A Input-Register, C Coil, D Discrete Input. Der Master kann nur H und C schreiben.
Index des Registers0 bis 65535, die Adresse in der Modbus-Anfrage.
DatentypBool, Int16 und UInt16 belegen ein Register, Int32, UInt32 und Float zwei. C und D unterstützen nur Bool.
MultiplierLesen: Register = Wert × Multiplier. Schreiben: Wert = Register ÷ Multiplier. Temperaturen haben standardmäßig ×10, Positionen und Prozentwerte ×100 (0,55 → 55).
ThresholdStatt des Multipliers für Bool auf einem numerischen Wert: true, wenn der Wert mindestens dem Threshold entspricht; das Schreiben von true in eine Coil setzt den Wert auf den Threshold, false auf 0.
EndiannessBigEndian oder LittleEndian; Byte swap vertauscht bei Int32, UInt32 und Float zusätzlich die Bytes innerhalb jedes Registers.

Die Detailansicht der Schnittstelle markiert Register, deren Bereiche sich überschneiden. Ein überlappender Wert wird nicht bereitgestellt — geben Sie jedem Wert einen eigenen Bereich, einschließlich seines Gültigkeitsregisters.

Gültigkeitsregister und Ersatzwert

Include validity register (bei C und D Include validity bit) ist standardmäßig eingeschaltet. Das schreibgeschützte Register direkt nach dem Wert teilt dem Master mit, ob der Wert gültig ist; ist er es nicht, liefern die Register des Werts stattdessen den Fallback value (bei Float NaN mit Use NaN as fallback).

CodeBedeutung
0gültig
1der Wert passt nicht in den Datentyp (zum Beispiel NaN in einem Ganzzahltyp)
2das Gerät ist nicht erreichbar oder im Fehlerzustand
3die Registereinstellungen sind ungültig
5noch kein Wert, zum Beispiel direkt nach dem Start des Core

Bei C und D ist das Gültigkeitsbit 1, wenn der Wert nicht gültig ist.

Aktionen

  • Aktion ohne Parameter (Stop, Umschalten …) hat ein Register auf H oder C. Schreiben Sie 1 oder mehr (bei einer Coil ON), wird sie ausgelöst; das Schreiben von 0 gibt die Ausnahme 0x03 zurück.
  • Aktion mit Parametern (Erhöhen der Jalousien-Position, Einstellen eines Bereichs …) hat pro Parameter ein Holding-Register, eines nach dem anderen. Ein Schreibvorgang muss alle abdecken; ein Schreiben nur einiger davon gibt die Ausnahme 0x03 zurück.
  • Aktionsregister sind nur zum Schreiben da — ihr Lesen gibt die Ausnahme 0x02 zurück.

Was der Master erhält

TapHome bedient die Funktionscodes 01, 02, 03, 04, 05, 06, 15 und 16. Eine Anfrage darf mehrere aufeinanderfolgende Werte lesen; andernfalls erhält der Master eine Ausnahme:

AusnahmeWann
0x01ein nicht unterstützter Funktionscode
0x02eine Adresse, die keinem Wert zugeordnet ist, ein Bereich mit einer Lücke, ein Schreibzugriff auf A oder D, ein Lesezugriff auf ein Aktionsregister, ein Schreibzugriff auf ein Gültigkeitsregister
0x03ein Wert, den das Gerät nicht annehmen kann, oder ein ungültiges Schreiben einer Aktion; ein Schreibvorgang mit mehreren Werten wird ganz oder gar nicht ausgeführt
0x04das Gerät hat das Schreiben abgelehnt
0x0AModbus TCP: eine andere Slave ID (Unit ID) als die der Schnittstelle

Modbus TCP schließt eine Verbindung nach 15 Minuten Inaktivität.

Update auf 2026.1

Beim Update der Steuereinheit auf 2026.1 werden bestehende Modbus-Slave-Schnittstellen automatisch umgewandelt; Registeradressen und Slave ID bleiben erhalten. Das Stop-Register einer KNX-Jalousie, einer Packet-Parser-Jalousie und eines Packet-Parser-Geräts Markise sowie eines virtuellen Geräts Markise wird nicht übernommen; ein Master, der es verwendet hat, erhält an seiner Adresse die Ausnahme 0x02 (Release Notes 2026.1).

Seit 2026.1 antwortet Modbus TCP nur auf seine eigene Slave ID — wenn Ihr Master Unit ID 0 oder 255 sendet, stellen Sie ihn auf die Slave ID der Schnittstelle ein.

Fehlersuche bei Modbus-RTU-Verbindungen

RS485 ist ein gemeinsamer Bus, daher kann ein PC mit einem USB-zu-RS485-Konverter (zum Beispiel FTDI USB-RS485-WE-1800-BT) und einer Terminal-Software wie Terminal für Windows die Kommunikation während der Integration mithören.