Documentatie

Gegevens uitlezen via Modbus/TCP

Maak verbinding met het gedeelde TCP-eindpunt, decodeer registers en verifieer live-energiemetingen.

Officiële IAMMETER-documentatie

IAMMETER-apparaten ondersteunen Modbus/TCP. Deze simulator biedt de gedeelde oudere registers en de alleen-lezen SunSpec 203-kaart die hieronder wordt beschreven. Raadpleeg de officiële handleidingen voor compatibiliteit met echte apparaatmodellen.

Doel en hulpmiddelen

Lees fase A met een Modbus-client of het onderstaande Python-standaardbibliotheekvoorbeeld. Er zijn geen Python-pakketten vereist.

Gebruik een hostnaam en TCP-poort, geen HTTPS-URL of modelpad. Het geconfigureerde eindpunt wordt hieronder weergegeven.

Modbus-eindpunt

simulator.iammeter.com:502

Verbindingsinstellingen

  1. Maak verbinding met het bovenstaande eindpunt. Lees 10 registers vanaf adres 0.
  2. Decodeer spanning, stroom, ondertekend actief vermogen en energie met behulp van de onderstaande tabel.
  3. Herhaal dit na enkele seconden: de energie groeit terwijl de overeenkomstige krachtrichting actief is. Metingen sturen de simulatieklok niet aan.
InstellingWaarde
Gastheersimulator.iammeter.com
TCP-poort502
Functiecode03 of 04
Eenheids-IDElke waarde, onveranderd herhaald
Startadres0
Aantal registers10

Decodeer fase A

AdresTypeConversie
0uint16÷100 V
1uint16÷100 A
2–3int32W
4–5uint32800 kWh (import)
6–7uint32800 kWh (export)
8int16÷1000 PF

Python 3 voorbeeld

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)

Verwachte resultaten

De standaard Inverter and grid-bron retourneert A-generatie, B-getekend netvermogen en nulwaarde C. B en C beginnen op adressen 10 en 20. Alle 32-bits waarden gebruiken eerst het hoge woord, met big-endian bytes.

Alle modellen gebruiken de gedeelde driefasige registerkaart: actieve energie 800 kWh en reactieve energie 1000 kvarh. Pas niet de fysieke enkelfasige schaling van 3200 toe.

Browserbronselectie en Reactive/NEM-instellingen veranderen deze gedeelde service niet. Het ondersteunt alleen-lezen.

SunSpec 203: alleen-lezen driefasige meter

SunSpec gebruikt hetzelfde TCP-eindpunt als de oudere registers. Gebruik functie 03 en op nul gebaseerde protocoladressen. De simulator identificeert zich altijd als WEM3050T, model 203, ongeacht het geselecteerde webmodel of Unit ID.

Lees bij elke peiling het meterblok met 107 registers op 40070. Decodeer waarden als geheel getal × 10^SF, waarbij elke waarde en de schaalfactor met teken in hetzelfde antwoord worden gelezen. Energie is in Wh; De arbeidsfactor is een percentage. Schalen kunnen veranderen naarmate waarden groeien.

Het gedeelde eindpunt stelt alleen model 203 bloot. Firmwaretoewijzingen 201 (WEM3080) en 202 (WEM2067) worden niet geselecteerd via browserpagina's of eenheids-ID's. Vlottermodellen 211–214 worden niet meegeleverd. Deze implementatie is niet SunSpec-gecertificeerd.

StartadresAantal registersInhoud
400002ZonS: 0x5375, 0x6E53
4000268Algemeen model 1, lengte 66: IAMMETER / WEM3050T / simulator-1.0 / 1AD9B537
40070107Geheel meter model 203, lengte 105
401772Eindmodel 0xFFFF, lengte 0

Problemen oplossen

Verbindingstime-out: controleer de weergegeven poort, firewall en TCP-bereikbaarheid. Een werkende HTTPS-pagina bewijst niet dat de Modbus-poort bereikbaar is.

Onverwachte waarden: controleer op nul gebaseerde adressering, tekenkracht, woordvolgorde en schaling. Stuur geen Modbus RTU-frames naar dit TCP-eindpunt.

← Terug naar simulator