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:502Ustawienia połączenia
- Połącz się z punktem końcowym powyżej. Odczytaj 10 rejestrów zaczynając od adresu 0.
- Zdekoduj napięcie, prąd, moc czynną ze znakiem i energię, korzystając z poniższej tabeli.
- Powtórz po kilku sekundach: energia rośnie, gdy odpowiedni kierunek mocy jest aktywny. Odczyty nie sterują zegarem symulacyjnym.
| Ustawienie | Wartość |
|---|---|
| Gospodarz | simulator.iammeter.com |
| portu TCP | 502 |
| Kod funkcji | 03 lub 04 |
| Identyfikator jednostki | Dowolna wartość, powtarzana bez zmian |
| Adres początkowy | 0 |
| Liczba zarejestrowanych | 10 |
Faza dekodowania A
| Adres | Typ | Konwersja |
|---|---|---|
| 0 | uint16 | ÷100 V |
| 1 | uint16 | ÷100 A |
| 2–3 | int32 | W |
| 4–5 | uint32 | ÷800 kWh (import) |
| 6–7 | uint32 | ÷800 kWh (eksport) |
| 8 | int16 | ÷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ątkowy | Liczba zarejestrowanych | Zawartość |
|---|---|---|
| 40000 | 2 | Słońce: 0x5375, 0x6E53 |
| 40002 | 68 | Typowy model 1, długość 66: IAMMETER / WEM3050T / symulator-1.0 / 1AD9B537 |
| 40070 | 107 | Licznik całkowity model 203, długość 105 |
| 40177 | 2 | Model 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.