Dokumentation

Daten über Modbus/TCP lesen

Stellen Sie eine Verbindung zum gemeinsam genutzten TCP-Endpunkt her, dekodieren Sie Register und überprüfen Sie Live-Energiewerte.

Offizielle IAMMETER-Dokumentation

IAMMETER-Geräte unterstützen Modbus/TCP. Dieser Simulator stellt die gemeinsam genutzten Legacy-Register und die unten beschriebene schreibgeschützte SunSpec 203-Karte bereit. Informationen zur Kompatibilität realer Gerätemodelle finden Sie in den offiziellen Handbüchern.

Ziel und Werkzeuge

Lesen Sie Phase A mit einem Modbus-Client oder dem Beispiel der Python-Standardbibliothek unten. Es sind keine Python-Pakete erforderlich.

Verwenden Sie einen Hostnamen und einen TCP-Port, keine HTTPS-URL oder einen Modellpfad. Der konfigurierte Endpunkt wird unten angezeigt.

Modbus-Endpunkt

simulator.iammeter.com:502

Verbindungseinstellungen

  1. Stellen Sie eine Verbindung zum oben genannten Endpunkt her. Lesen Sie 10 Register ab Adresse 0.
  2. Dekodieren Sie Spannung, Strom, vorzeichenbehaftete Wirkleistung und Energie anhand der folgenden Tabelle.
  3. Nach einigen Sekunden wiederholen: Die Energie wächst, während die entsprechende Leistungsrichtung aktiv ist. Lesevorgänge treiben den Simulationstakt nicht an.
EinstellungWert
Gastgebersimulator.iammeter.com
TCP-Port502
Funktionscode03 oder 04
Einheiten-IDJeder Wert wird unverändert wiedergegeben
Startadresse0
Anzahl registrieren10

Phase A dekodieren

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

Python 3-Beispiel

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)

Erwartete Ergebnisse

Die Standardquelle Inverter and grid gibt A-Generation, B-Netzstrom mit Vorzeichen und Nullwert C zurück. B und C beginnen bei den Adressen 10 und 20. Alle 32-Bit-Werte verwenden zuerst das High-Wort, mit Big-Endian-Bytes.

Alle Modelle nutzen die gemeinsame dreiphasige Registerkarte: Wirkenergie ÷800 kWh und Blindenergie ÷1000 kvarh. Wenden Sie nicht die physikalische einphasige Skalierung ÷3200 an.

Die Auswahl der Browserquelle und die Einstellungen Reactive/NEM ändern diesen gemeinsamen Dienst nicht. Es unterstützt nur Lesevorgänge.

SunSpec 203: schreibgeschützter Drehstromzähler

SunSpec verwendet denselben TCP-Endpunkt wie die Legacy-Register. Verwenden Sie Funktion 03 und nullbasierte Protokolladressen. Der Simulator identifiziert sich immer als WEM3050T, Modell 203, unabhängig vom ausgewählten Webmodell oder der Einheiten-ID.

Lesen Sie bei jeder Abfrage den Zählerblock mit 107 Registern bei 40070 ab. Dekodieren Sie Werte als Ganzzahl × 10^SF und lesen Sie jeden Wert und seinen vorzeichenbehafteten Skalierungsfaktor in derselben Antwort. Energie wird in Wh angegeben; Der Leistungsfaktor ist ein Prozentsatz. Die Skalen können sich mit steigenden Werten ändern.

Der gemeinsam genutzte Endpunkt macht nur Modell 203 verfügbar. Die Firmware-Zuordnungen 201 (WEM3080) und 202 (WEM2067) werden nicht über Browserseiten oder Geräte-IDs ausgewählt. Die Schwimmermodelle 211–214 sind nicht im Lieferumfang enthalten. Diese Implementierung ist nicht SunSpec-zertifiziert.

StartadresseAnzahl registrierenInhalt
400002SunS: 0x5375, 0x6E53
4000268Gängiges Modell 1, Länge 66: IAMMETER / WEM3050T / simulator-1.0 / 1AD9B537
40070107Ganzzahlzähler Modell 203, Länge 105
401772Endmodell 0xFFFF, Länge 0

Fehlerbehebung

Verbindungszeitüberschreitung: Überprüfen Sie den angezeigten Port, die Firewall und die TCP-Erreichbarkeit. Eine funktionierende HTTPS-Seite beweist nicht, dass der Modbus-Port erreichbar ist.

Unerwartete Werte: Überprüfen Sie die nullbasierte Adressierung, die vorzeichenbehaftete Potenz, die Wortreihenfolge und die Skalierung. Senden Sie keine Modbus-RTU-Frames an diesen TCP-Endpunkt.

← Zurück zum Simulator