Dokumentacja

Odczyt danych poprzez Modbus/TCP

Połącz się ze współdzielonym punktem końcowym TCP, dekoduj rejestry i weryfikuj odczyty energii na żywo.

Oficjalna dokumentacja IAMMETER

Urządzenia IAMMETER obsługują Modbus/TCP. Ten symulator zapewnia współdzielone starsze rejestry i mapę SunSpec 203 tylko do odczytu, opisaną poniżej. Zapoznaj się z oficjalnymi przewodnikami, aby uzyskać informacje na temat zgodności modeli z rzeczywistymi urządzeniami.

Cel i narzędzia

Przeczytaj fazę A za pomocą klienta Modbus lub poniższego przykładu standardowej biblioteki Pythona. Nie są wymagane żadne pakiety Pythona.

Użyj nazwy hosta i portu TCP, a nie adresu URL HTTPS lub ścieżki modelu. Skonfigurowany punkt końcowy pokazano poniżej.

Punkt końcowy Modbus

simulator.iammeter.com:502

Ustawienia połączenia

  1. Połącz się z punktem końcowym powyżej. Odczytaj 10 rejestrów zaczynając od adresu 0.
  2. Zdekoduj napięcie, prąd, moc czynną ze znakiem i energię, korzystając z poniższej tabeli.
  3. Powtórz po kilku sekundach: energia rośnie, gdy odpowiedni kierunek mocy jest aktywny. Odczyty nie sterują zegarem symulacyjnym.
UstawienieWartość
Gospodarzsimulator.iammeter.com
portu TCP502
Kod funkcji03 lub 04
Identyfikator jednostkiDowolna wartość, powtarzana bez zmian
Adres początkowy0
Liczba zarejestrowanych10

Faza dekodowania A

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

Przykład Pythona 3

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)

Oczekiwane rezultaty

Domyślne źródło Inverter and grid zwraca generację A, moc sieci ze znakiem B i C o wartości zerowej. B i C zaczynają się od adresów 10 i 20. Wszystkie wartości 32-bitowe używają najpierw starszego słowa, z bajtami big-endian.

Wszystkie modele wykorzystują wspólną mapę rejestrów trójfazowych: energia czynna ÷800 kWh i energia bierna ÷1000 kvarh. Nie stosować skalowania fizycznego jednofazowego ÷3200.

Wybór źródła przeglądarki i ustawienia Reactive/NEM nie powodują zmiany tej usługi współdzielonej. Obsługuje tylko odczyt.

SunSpec 203: licznik trójfazowy tylko do odczytu

SunSpec wykorzystuje ten sam punkt końcowy TCP, co starsze rejestry. Użyj funkcji 03 i adresów protokołu liczonych od zera. Symulator zawsze identyfikuje się jako WEM3050T, model 203, niezależnie od wybranego modelu sieciowego lub identyfikatora jednostki.

Odczytaj blok licznika 107-rejestrowego przy 40070 przy każdym sondażu. Dekoduj wartości jako liczbę całkowitą × 10^SF, odczytując każdą wartość i jej współczynnik skali ze znakiem w tej samej odpowiedzi. Energia jest w Wh; współczynnik mocy jest procentem. Skale mogą się zmieniać wraz ze wzrostem wartości.

Udostępniony punkt końcowy udostępnia tylko model 203. Mapowania oprogramowania sprzętowego 201 (WEM3080) i 202 (WEM2067) nie są wybierane na stronach przeglądarki lub identyfikatorach jednostek. Modele pływakowe 211–214 nie są dostarczane. Ta implementacja nie posiada certyfikatu SunSpec.

Adres początkowyLiczba zarejestrowanychZawartość
400002Słońce: 0x5375, 0x6E53
4000268Typowy model 1, długość 66: IAMMETER / WEM3050T / symulator-1.0 / 1AD9B537
40070107Licznik całkowity model 203, długość 105
401772Model końcowy 0xFFFF, długość 0

Rozwiązywanie problemów

Limit czasu połączenia: sprawdź wyświetlany port, zaporę sieciową i osiągalność protokołu TCP. Działająca strona HTTPS nie potwierdza dostępności portu Modbus.

Nieoczekiwane wartości: sprawdź adresowanie od zera, moc znaku, kolejność słów i skalowanie. Nie wysyłaj ramek Modbus RTU do tego punktu końcowego TCP.

← Wracając do symulatora