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:502Verbindungseinstellungen
- Stellen Sie eine Verbindung zum oben genannten Endpunkt her. Lesen Sie 10 Register ab Adresse 0.
- Dekodieren Sie Spannung, Strom, vorzeichenbehaftete Wirkleistung und Energie anhand der folgenden Tabelle.
- Nach einigen Sekunden wiederholen: Die Energie wächst, während die entsprechende Leistungsrichtung aktiv ist. Lesevorgänge treiben den Simulationstakt nicht an.
| Einstellung | Wert |
|---|---|
| Gastgeber | simulator.iammeter.com |
| TCP-Port | 502 |
| Funktionscode | 03 oder 04 |
| Einheiten-ID | Jeder Wert wird unverändert wiedergegeben |
| Startadresse | 0 |
| Anzahl registrieren | 10 |
Phase A dekodieren
| Adresse | Typ | Konvertierung |
|---|---|---|
| 0 | uint16 | ÷100 V |
| 1 | uint16 | ÷100 A |
| 2–3 | int32 | W |
| 4–5 | uint32 | ÷800 kWh (Import) |
| 6–7 | uint32 | ÷800 kWh (Export) |
| 8 | int16 | ÷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.
| Startadresse | Anzahl registrieren | Inhalt |
|---|---|---|
| 40000 | 2 | SunS: 0x5375, 0x6E53 |
| 40002 | 68 | Gängiges Modell 1, Länge 66: IAMMETER / WEM3050T / simulator-1.0 / 1AD9B537 |
| 40070 | 107 | Ganzzahlzähler Modell 203, Länge 105 |
| 40177 | 2 | Endmodell 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.