Documentazione

Leggere i dati tramite Modbus/TCP

Connettiti all'endpoint TCP condiviso, decodifica i registri e verifica le letture di energia in tempo reale.

Documentazione ufficiale IAMMETER

I dispositivi IAMMETER supportano Modbus/TCP. Questo simulatore fornisce i registri legacy condivisi e la mappa SunSpec 203 di sola lettura descritta di seguito. Consulta le guide ufficiali per la compatibilità dei modelli del dispositivo reale.

Obiettivo e strumenti

Leggi la fase A con un client Modbus o l'esempio della libreria standard Python di seguito. Non sono richiesti pacchetti Python.

Utilizza un nome host e una porta TCP, non un URL HTTPS o un percorso del modello. L'endpoint configurato è mostrato di seguito.

Punto finale Modbus

simulator.iammeter.com:502

Impostazioni di connessione

  1. Connettiti all'endpoint sopra. Legge 10 registri a partire dall'indirizzo 0.
  2. Decodifica tensione, corrente, potenza attiva con segno ed energia utilizzando la tabella seguente.
  3. Ripetere dopo alcuni secondi: l'energia aumenta mentre la direzione di potenza corrispondente è attiva. Le letture non guidano l'orologio della simulazione.
CollocamentoValore
Ospitesimulator.iammeter.com
porta TCP502
Codice funzione03 o 04
Identificativo dell'unitàQualsiasi valore, ripetuto invariato
Indirizzo iniziale0
Conteggio dei registri10

Decodificare la fase A

IndirizzoTipoConversione
0uint16÷100 V
1uint16÷100 A
2–3int32W
4–5uint32÷800 kWh (importazione)
6–7uint32÷800 kWh (esportazione)
8int16÷1000PF

Esempio Python3

import socket, struct

HOST, PORT = "simulator.iammeter.com", 502

def receive_exact(sock, size):
    data = bytearray()
    while len(data) < size:
        chunk = sock.recv(size - len(data))
        if not chunk:
            raise ConnectionError("Connection closed")
        data.extend(chunk)
    return bytes(data)

# Transaction=1, protocol=0, length=6, Unit ID=1; FC03, address=0, count=10.
request = struct.pack(">HHHBBHH", 1, 0, 6, 1, 3, 0, 10)
with socket.create_connection((HOST, PORT), timeout=5) as sock:
    sock.sendall(request)
    transaction, protocol, length, unit = struct.unpack(">HHHB", receive_exact(sock, 7))
    if transaction != 1 or protocol != 0 or unit != 1 or not 2 <= length <= 254:
        raise ValueError("Invalid Modbus header")
    pdu = receive_exact(sock, length - 1)
    if pdu[:2] != bytes([3, 20]) or len(pdu) != 22:
        raise ValueError("Unexpected response: " + pdu.hex())
    raw = pdu[2:]
    print("Voltage V:", struct.unpack_from(">H", raw, 0)[0] / 100)
    print("Current A:", struct.unpack_from(">H", raw, 2)[0] / 100)
    print("Active W:", struct.unpack_from(">i", raw, 4)[0])
    print("Import kWh:", struct.unpack_from(">I", raw, 8)[0] / 800)
    print("Export kWh:", struct.unpack_from(">I", raw, 12)[0] / 800)
    print("PF:", struct.unpack_from(">H", raw, 16)[0] / 1000)

Risultati attesi

La sorgente Inverter and grid predefinita restituisce la generazione A, la potenza di rete con segno B e C con valore zero. B e C iniziano agli indirizzi 10 e 20. Tutti i valori a 32 bit utilizzano prima la parola alta, con byte big-endian.

Tutti i modelli utilizzano la mappa di registro trifase condivisa: energia attiva ÷800 kWh ed energia reattiva ÷1000 kvarh. Non applicare la scala fisica monofase ÷3200.

La selezione della sorgente del browser e le impostazioni Reactive/NEM non modificano questo servizio condiviso. Supporta solo la lettura.

SunSpec 203: contatore trifase di sola lettura

SunSpec utilizza lo stesso endpoint TCP dei registri legacy. Utilizzare la funzione 03 e gli indirizzi di protocollo in base zero. Il simulatore si identifica sempre come WEM3050T, modello 203, indipendentemente dal modello web selezionato o dall'ID unità.

Leggi il blocco contatori da 107 registri su 40070 ad ogni sondaggio. Decodifica i valori come numero intero × 10^SF, leggendo ciascun valore e il relativo fattore di scala con segno nella stessa risposta. L'energia è in Wh; il fattore di potenza è una percentuale. Le scale possono cambiare man mano che i valori crescono.

L'endpoint condiviso espone solo il modello 203. Le mappature firmware 201 (WEM3080) e 202 (WEM2067) non vengono selezionate tramite le pagine del browser o gli ID unità. I modelli float 211–214 non sono forniti. Questa implementazione non è certificata SunSpec.

Indirizzo inizialeConteggio dei registriContenuto
400002SoleS: 0x5375, 0x6E53
4000268Modello comune 1, lunghezza 66: IAMMETER / WEM3050T / simulator-1.0 / 1AD9B537
40070107Misuratore intero modello 203, lunghezza 105
401772Modello finale 0xFFFF, lunghezza 0

Risoluzione dei problemi

Timeout connessione: controlla la porta visualizzata, il firewall e la raggiungibilità TCP. Una pagina HTTPS funzionante non dimostra che la porta Modbus sia raggiungibile.

Valori imprevisti: controllare l'indirizzamento in base zero, la potenza con segno, l'ordine delle parole e il ridimensionamento. Non inviare frame Modbus RTU a questo endpoint TCP.

← Torniamo al simulatore