TapHome

TapHome verso Modbus RTU / ASCII / TCP

TapHome come slave Modbus per BMS, SCADA o PLC via Modbus TCP, RTU o ASCII: scegli valori e azioni di ogni dispositivo e consegna al master la mappa dei registri.

Ultimo aggiornamento:

TapHome può funzionare come slave Modbus (server), così un sistema di gestione dell’edificio (BMS), uno SCADA o un PLC legge e controlla i dispositivi TapHome tramite Modbus TCP oppure tramite Modbus RTU o ASCII su RS485. Nella sezione Dispositivi condivisi scegli i valori e le azioni di ogni dispositivo, TapHome assegna a ciascuno un proprio registro e il risultato è una mappa dei registri da consegnare a chi configura il master. Anche un secondo Core può leggere i dispositivi in questo modo (collegare più Core).

Come funziona

  1. Sul Core aggiungi un’interfaccia Modbus e scegli che cosa il master può vedere e fare: valori (temperatura, livello delle tapparelle, stato dell’interruttore …) e azioni (comandi delle tapparelle, commutazione …).
  2. La mappa dei registri si crea man mano che scegli: ogni valore riceve un intervallo di registri al primo indirizzo libero, seguito subito dal suo registro di validità.
  3. Sul master l’integratore inserisce gli stessi registri come punti o tag. La lettura restituisce il valore attuale; la scrittura modifica il dispositivo come un intervento manuale, come nell’app.

Il Core continua a gestire i propri moduli e le proprie smart rule; Modbus condivide solo i valori e le azioni che hai scelto.

Esempio: tapparelle e termostato per un BMS

Il BMS di un edificio legge la temperatura ambiente, imposta il setpoint del termostato e può fermare le tapparelle. Sul Core, nella sezione Dispositivi condivisi, seleziona Aggiungi una nuova interfaccia → Modbus TCP, poi aggiungi le tapparelle e il termostato. Questa è la configurazione completa lato TapHome — fai clic su un registro o su Aggiungi dispositivo per vedere il passo successivo:

Modbus TCP
Informazioni
1
Indirizzo IP
Parametri
2
Dispositivi
Tapparelle
3
Livello delle tapparelle
Angolo delle lamelle
4
Stop
Termostato
Temperatura
5
Temp. impostata
6
Aggiungi dispositivo
Temp. impostata
Tipo di registro
Indice di registro
Tipo di dati
Tipo di dati
Indietro
Tapparelle
Valori
Comandi
OK
  1. Indirizzo IP del Core — il BMS si collega a questo indirizzo. Assegna al Core un indirizzo fisso, ad esempio con una prenotazione DHCP nel router.
  2. Slave ID — il BMS deve inviare lo stesso Unit ID; una richiesta con un altro riceve l’eccezione 0x0A.
  3. Un valore occupa due registri: il valore stesso e, subito dopo, il registro di validità. ×100 è il moltiplicatore: il livello delle tapparelle 0,55 viene letto come 55.
  4. Un’azione ha un solo registro, in cui il BMS scrive. Stop è un coil: scrivendo ON le tapparelle si fermano.
  5. Impostazioni del registro — tipo di registro, indice, tipo di dati, moltiplicatore, ordine dei byte e registro di validità. Di solito i valori predefiniti vanno bene; cambia l’indice quando il BMS si aspetta una disposizione fissa.
  6. Aggiungi dispositivo — seleziona i valori e le azioni del dispositivo; OK li aggiunge ai primi indirizzi liberi. I valori scrivibili ricevono un holding register (H) o un coil (C), quelli di sola lettura un input register (A) o un discrete input (D).

Lato BMS o SCADA

Il master ha bisogno dell’indirizzo IP e della porta del Core (oppure dei parametri della linea RS485), dello Slave ID e dell’elenco dei punti. Per l’esempio sopra:

PuntoRegistro TapHomeNotazione a base 1Codice funzioneValore
Livello delle tapparelleH 04000103 lettura, 06 scrittura0–100
Validità del livello delle tapparelleH 140002030 = valido
Angolo delle lamelleH 24000303 lettura, 06 scrittura0–100
Validità dell’angolo delle lamelleH 340004030 = valido
Stop tapparelleC 40000505 scritturaON = stop
TemperaturaA 53000604÷ 10 = °C
Validità della temperaturaA 630007040 = valido
Temperatura impostataH 74000803 lettura, 06 scrittura÷ 10 = °C
Validità della temperatura impostataH 840009030 = valido

Tutti i registri sono Int16 (un coil è un bit). H = holding register, A = input register, C = coil.

TapHome numera i registri da 0, così come vengono inviati nella richiesta. I master che usano la notazione a base 1 (40001 per l’holding register 0) indicano un numero più alto di uno — lo scostamento di uno è la causa più frequente della lettura di un valore sbagliato.

Lettura e scrittura dell’esempio con 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()

# Temperatura: input register 5 (valore × 10) e 6 (validità, 0 = valido)
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")

# Temperatura impostata 22.5 °C: holding register 7, scritto × 10
client.write_register(7, 225, device_id=1)

# Fermare le tapparelle: scrivere ON nel coil 4
client.write_coil(4, True, device_id=1)
client.close()

Librerie per altri linguaggi: NModbus4 (C#), libmodbus (C), digitalpetri/modbus (Java), goburrow/modbus (Go). Simply Modbus spiega il protocollo.

Il master dovrebbe leggere il registro di validità insieme al valore (una sola richiesta per entrambi) e trattare qualsiasi codice diverso da 0 come guasto — un dispositivo perso appare così nel BMS come guasto, non come valore congelato.

Interfacce e proprietà di comunicazione

InterfacciaProprietàPredefinito
Modbus TCPTCP port, Slave IDporta 502, il primo Slave ID libero sulla porta
Modbus RTU, Modbus ASCIIterminale BUS 1, BUS 2 o BUS 3, velocità in baud, bit di dati, parità, bit di stop, Slave IDnessun terminale, 9600 baud, 8 bit di dati (ASCII 7), nessuna parità, 1 bit di stop, Slave ID 1
  • Più master su TCP: più interfacce Modbus TCP possono condividere una porta se hanno Slave ID diversi — ad esempio una per il BMS e una per un secondo Core, ciascuna con i propri registri. Fino a 10 connessioni contemporaneamente.
  • RS485: un’interfaccia RTU o ASCII si avvia solo dopo che hai scelto un terminale, e un terminale gestisce una sola interfaccia.
  • Slave ID va da 1 a 247. L’interfaccia risponde solo al proprio: Modbus TCP restituisce l’eccezione 0x0A a un altro Unit ID (anche 0 o 255), RTU e ASCII non rispondono ai frame destinati a un altro indirizzo.

L’elenco delle interfacce mostra i conflitti, ad esempio la stessa porta e lo stesso Slave ID due volte o un’interfaccia senza terminale.

Impostazioni del registro

ImpostazioneValori
Tipo di registroH holding register, A input register, C coil, D discrete input. Il master può scrivere solo H e C.
Indice di registroDa 0 a 65535, l’indirizzo nella richiesta Modbus.
Tipo di datiBool, Int16 e UInt16 occupano un registro, Int32, UInt32 e Float due. C e D trasportano solo Bool.
MultiplierLettura: registro = valore × moltiplicatore. Scrittura: valore = registro ÷ moltiplicatore. Per impostazione predefinita le temperature usano ×10, i livelli e le percentuali ×100 (0,55 → 55).
ThresholdAl posto del moltiplicatore, per Bool su un valore numerico: true quando il valore è almeno pari alla soglia; scrivere true in un coil imposta il valore alla soglia, false a 0.
EndiannessBigEndian o LittleEndian; Byte swap scambia inoltre i byte all’interno di ogni registro di Int32, UInt32 e Float.

Il dettaglio dell’interfaccia segnala i registri i cui intervalli si sovrappongono. Un valore sovrapposto non è accessibile al master — assegna a ogni valore un proprio intervallo, compreso il suo registro di validità.

Registro di validità e valore di fallback

Include validity register (su C e D Include validity bit) è attivo per impostazione predefinita. Il registro di sola lettura subito dopo il valore indica al master se il valore è valido; quando non lo è, i registri del valore restituiscono invece il Fallback value (per Float, NaN con Use NaN as fallback).

CodiceSignificato
0valido
1il valore non rientra nel tipo di dati (ad esempio NaN in un tipo intero)
2il dispositivo non è disponibile o è in errore
3le impostazioni del registro non sono valide
5ancora nessun valore, ad esempio subito dopo l’avvio del Core

Su C e D il bit di validità è 1 quando il valore non è valido.

Azioni

  • Un’azione senza parametri (Stop, Toggle …) ha un registro su H o C. Scrivendo 1 o più, oppure coil ON, la si attiva; scrivendo 0 si ottiene l’eccezione 0x03.
  • Un’azione con parametri (aumento del livello delle tapparelle, impostazione di un intervallo …) ha un holding register per parametro, uno dopo l’altro. Una sola scrittura deve coprirli tutti; una scrittura solo di alcuni restituisce l’eccezione 0x03.
  • I registri delle azioni sono di sola scrittura — leggerli restituisce l’eccezione 0x02.

Che cosa riceve il master

TapHome gestisce i codici funzione 01, 02, 03, 04, 05, 06, 15 e 16. Una richiesta può leggere più valori consecutivi; altrimenti il master riceve un’eccezione:

EccezioneQuando
0x01un codice funzione non supportato
0x02un indirizzo non assegnato ad alcun valore, un intervallo con un buco, una scrittura su A o D, la lettura di un registro di azione, una scrittura in un registro di validità
0x03un valore che il dispositivo non può accettare, oppure una scrittura di azione non valida; una scrittura con più valori va a buon fine per intero o per niente
0x04il dispositivo ha rifiutato la scrittura
0x0AModbus TCP: uno Slave ID (Unit ID) diverso da quello dell’interfaccia

Modbus TCP chiude una connessione inattiva da 15 minuti.

Aggiornamento alla 2026.1

Con l’aggiornamento dell’unità di controllo alla 2026.1, le interfacce slave Modbus esistenti vengono convertite automaticamente, mantenendo gli indirizzi dei registri e lo Slave ID. Il registro Stop di una tapparella KNX, di una tapparella e di un dispositivo Tenda da sole Packet parser e di un dispositivo Tenda da sole virtuale non viene convertito; un master che lo usava riceve al suo indirizzo l’eccezione 0x02 (note di rilascio 2026.1).

Dalla 2026.1 Modbus TCP risponde solo al proprio Slave ID — se il tuo master invia Unit ID 0 o 255, impostalo sullo Slave ID dell’interfaccia.

Debug delle connessioni Modbus RTU

RS485 è un bus condiviso, quindi un PC con un convertitore USB–RS485 (ad esempio FTDI USB-RS485-WE-1800-BT) e un software di terminale, come Terminal per Windows, può ascoltare la comunicazione durante l’integrazione.