Modbus
Alcuni dispositivi, come i contatori (meters) o i caricabatterie (chargers), sono collegati e indirizzati tramite il protocollo Modbus.
La configurazione meter comprende il tipo di collegamento fisico (interfaccia), parametri tecnici opzionali dell’interfaccia, il protocollo Modbus usato, l’ID Modbus univoco del dispositivo sul bus e il numero e il tipo del registro da leggere o scrivere.
È importante sapere che esistono tre diversi protocolli Modbus: Modbus RTU, Modbus ASCII e Modbus TCP. Tecnicamente possono essere trasmessi su diversi tipi di interfaccia. La variante classica è Modbus RTU su un’interfaccia bus seriale RS485, usata dalla maggior parte dei contatori e da alcuni caricabatterie. I dispositivi con un’interfaccia di rete nativa (Ethernet/Wi-Fi), invece, comunicano di solito tramite il protocollo Modbus TCP.
Se un dispositivo Modbus seriale deve essere collegato in rete (Ethernet/Wi-Fi/PowerLAN) tramite un convertitore di interfaccia, si stabilisce una connessione con protocollo Modbus RTU su TCP. Il protocollo Modbus RTU viene trasmesso direttamente sulla rete (cioè “incapsulato”). Anche se il metodo di trasporto (TCP/IP) è lo stesso, il protocollo NON è lo stesso di Modbus TCP. È fondamentale distinguere tra protocollo e metodo di trasporto. “Modbus RTU su TCP” è diverso da Modbus TCP!
Se usi un convertitore di interfaccia, i parametri del bus seriale si impostano solo sul convertitore. In evcc si configura quindi solo il tratto fino al convertitore.
Collegamento fisico
Sezione intitolata “Collegamento fisico”Collegamento seriale (RS485)
Sezione intitolata “Collegamento seriale (RS485)”Se il dispositivo è collegato direttamente tramite un adattatore RS485 (Modbus RTU), occorre indicare device e i parametri di comunicazione seriale baudrate e comset in base alla configurazione del dispositivo. Consulta il relativo manuale d’uso, le schede tecniche o le impostazioni del sistema.
Ad esempio:
source: modbusid: 1device: /dev/ttyUSB0baudrate: 38400comset: "8E1"Collegamento di rete diretto
Sezione intitolata “Collegamento di rete diretto”Se il dispositivo è collegato direttamente tramite una connessione di rete nativa (Modbus TCP), occorre indicare un uri composto da HOSTNAME:PORTA o IP:PORTA:
Ad esempio:
source: modbusid: 1uri: 192.168.0.11:502Dispositivo seriale tramite connessione di rete (con convertitore di interfaccia)
Sezione intitolata “Dispositivo seriale tramite connessione di rete (con convertitore di interfaccia)”Se un dispositivo seriale è collegato tramite un convertitore di interfaccia RS485-IP trasparente interposto (senza traduzione del protocollo), occorre indicare rtu: true, così il protocollo Modbus RTU viene usato anche sulla connessione TCP/IP.
Ad esempio:
source: modbusid: 1uri: 192.168.0.10:502rtu: true # Modbus RTU su TCPDispositivi predefiniti
Sezione intitolata “Dispositivi predefiniti”I modelli di dispositivo predefiniti integrati (model) sono identici a quelli di MBMD:
ABB ABB A/B-Series meters DDM DDM18SD DZG DZG Metering GmbH DVH4013 meters IEM3000 Schneider Electric iEM3000 series INEPRO Inepro Metering Pro 380 JANITZA Janitza meters MPM Bernecker Engineering MPM3PM meters ORNO1P ORNO WE-514 & WE-515 ORNO1P504 ORNO WE-504 ORNO3P ORNO WE-516 & WE-517 SBC Saia Burgess Controls ALE3 meters SDM Eastron SDM630/120/72DMv2 SDM220 Eastron SDM220 SDM230 Eastron SDM230 SDM72 Eastron SDM72 SEMTR SolarEdge SE-MTR-3YQualsiasi model diverso da questi viene trattato come tipo di dispositivo SunSpec.
Con value si definisce il valore da leggere dal dispositivo. Tutti i valori supportati sono predefiniti in MBMD.
Nel caso di un inverter o contatore compatibile SunSpec, i valori da leggere si indicano nel formato model:[block:]point secondo la definizione SunSpec. Ad esempio, la potenza DC sulla seconda stringa di un inverter fotovoltaico trifase (corrispondente a SunSpec Model 103) si legge così: value: 103:2:W.
Il modello di dispositivo (model) e l’ID Modbus (id) sono sempre obbligatori:
Ad esempio:
source: modbus---model: sdmvalue: Powerscale: -1 # fattore in virgola mobile applicato al risultato, ad es. per convertire kW in WInversione dei valori
Sezione intitolata “Inversione dei valori”Per i contatori MBMD, i valori di misura possono essere invertiti anteponendo al nome dell’alias un - (segno meno).
È utile quando i contatori vengono usati in configurazioni o orientamenti di montaggio diversi e il segno dei valori di misura va adattato.
Misure supportate
Sezione intitolata “Misure supportate”L’inversione funziona per le seguenti misure MBMD:
power: potenza totalecurrents: correnti per fase (array)powers: potenze per fase (array)
Sintassi
Sezione intitolata “Sintassi”meters: - name: my-meter type: modbus model: sdm power: -Power # inverte il valore della potenzaPotenza totale invertita
Sezione intitolata “Potenza totale invertita”meters: - name: pv-meter type: modbus model: sdm power: -Power # la potenza viene invertita (ad es. +1000 W diventa -1000 W)Potenze di fase invertite
Sezione intitolata “Potenze di fase invertite”meters: - name: grid-meter type: modbus model: sdm power: Power powers: - -PowerL1 # fase 1 invertita - -PowerL2 # fase 2 invertita - -PowerL3 # fase 3 invertitaCorrenti invertite (singole fasi)
Sezione intitolata “Correnti invertite (singole fasi)”meters: - name: grid-meter type: modbus model: sdm power: Power currents: - -CurrentL1 # corrente fase 1 invertita - CurrentL2 # corrente fase 2 normale - -CurrentL3 # corrente fase 3 invertitaCasi d’uso
Sezione intitolata “Casi d’uso”Contatori montati in modo errato: Se un sensore di corrente o un contatore è installato fisicamente nella direzione sbagliata, puoi correggere i valori via software.
Immissione in rete o consumo: Per i contatori dell’impianto fotovoltaico in cui la convenzione dei segni va invertita.
Orientamenti diversi dei trasformatori di corrente: Per installazioni multifase con trasformatori di corrente (TA) orientati in modo diverso.
Configurazione manuale
Sezione intitolata “Configurazione manuale”Se il dispositivo Modbus non è supportato direttamente o se si vogliono leggere o scrivere valori diversi da quelli dei modelli predefiniti, i registri Modbus possono essere configurati anche manualmente.
A questo scopo, oltre alle impostazioni Modbus generali (vedi sopra), occorre definire un register al posto del value usato per i dispositivi predefiniti. Non è consentito indicare sia value sia register.
La definizione di un registro richiede i seguenti parametri:
address: l’indirizzo del registrotype: il tipo di registro. I tipi di lettura consentiti sonocoil,inputeholding, quelli di scrittura sonowriteholding,writeholdingsewritecoildecode: il tipo di codifica dei dati. Sono consentiti:int16|32|64, uint16|32|64, float32|64 and u|int32s + float32s. Per il tipocoilla codifica viene ignorata, ma deve comunque essere indicata. Per il tipowritecoiloccorre indicarebool8.bitmask: opzionale. Il valore viene combinato in AND con il valore letto per estrarre singoli bit.
Altri parametri consentiti in una configurazione manuale sono:
scale: numero in virgola mobile che può servire a convertire i valori letti (ad es. da W a kW o viceversa). Questo valore viene moltiplicato per il valore grezzo letto e decodificato.timeout: timeout Modbus. Senza unità il valore è in nanosecondi, altrimenti va indicata l’unità, ad es. 10s per 10 secondi.
Ad esempio:
source: modbus---register: address: 40070 type: holding # coil, holding o input decode: int32 # int16|32|64, uint16|32|64, float32|64 e u|int32s + float32s bitmask: 2 # opzionale: maschera di bit applicata al valore letto. Qui la maschera è 0000000000000010b, ignorata se il valore è 0scale: -1.0 # fattore in virgola mobile applicato al risultato, ad es. per convertire kW in Wtimeout: 2s # timeout, senza unità in nsPer le codifiche int32s/uint32s l’ordine delle word viene invertito (prima la word meno significativa), il che è utile per i dispositivi E3/DC.
Scrittura dei registri
Sezione intitolata “Scrittura dei registri”Si possono scrivere sia gli holding register sia i coil. A questo scopo occorre indicare type: writeholding per gli holding register oppure type: writecoil per i coil. Per scrivere più registri (codice funzione 16) è disponibile il tipo writeholdings.
type: writeholding scrive sempre un registro a 16 bit (int o bool16). Per questo decode deve essere sempre uint16.
type: writecoil scrive un coil. Per decode occorre indicare bool8.
Ad esempio:
source: modbus---register: address: 40070 type: writeholding # writeholding, writeholdings o writecoilEsempio completo
Sezione intitolata “Esempio completo”Ecco un esempio completo di caricabatterie definito dall’utente con interfaccia Modbus (qui un Phoenix EM-CP-PP-ETH con indirizzo IP 192.168.1.10):
Ad esempio:
chargers: - type: custom name: CustomCharger status: # legge lo stato del caricabatterie # A, B, C oppure F source: modbus id: 180 uri: 192.168.1.10:502 timeout: 3s register: address: 100 type: input # legge un input register decode: int16 enabled: # il caricabatterie è abilitato (1) o no (0) source: modbus id: 180 uri: 192.168.1.10:502 register: address: 400 type: coil # legge un coil decode: bool16 # irrilevante ma obbligatorio enable: # abilita il caricabatterie source: modbus id: 180 uri: 192.168.1.10:502 register: address: 400 type: writecoil # scrive un coil decode: bool8 maxcurrent: # imposta la corrente massima source: modbus id: 180 uri: 192.168.1.10:502 register: address: 300 type: writeholding # scrive un holding register decode: uint16