Documentation officielle IAMMETER
Les appareils IAMMETER prennent en charge Modbus/TCP. Ce simulateur fournit les registres hérités partagés et la carte SunSpec 203 en lecture seule décrite ci-dessous. Consultez les guides officiels pour connaître la compatibilité des modèles d’appareils réels.
Objectif et outils
Lisez la phase A avec un client Modbus ou l'exemple de bibliothèque standard Python ci-dessous. Aucun package Python n'est requis.
Utilisez un nom d'hôte et un port TCP, et non une URL HTTPS ou un chemin de modèle. Le point de terminaison configuré est affiché ci-dessous.
Point de terminaison Modbus
simulator.iammeter.com:502Paramètres de connexion
- Connectez-vous au point de terminaison ci-dessus. Lire 10 registres en commençant à l'adresse 0.
- Décodez la tension, le courant, la puissance active signée et l'énergie à l'aide du tableau ci-dessous.
- Répétez après quelques secondes : l'énergie augmente tandis que la direction de puissance correspondante est active. Les lectures ne pilotent pas l’horloge de simulation.
| Paramètre | Valeur |
|---|---|
| Hôte | simulator.iammeter.com |
| Port TCP | 502 |
| Code de fonction | 03 ou 04 |
| ID de l'unité | N'importe quelle valeur, renvoyée inchangée |
| Adresse de départ | 0 |
| Nombre de registres | 10 |
Décoder la phase A
| Adresse | Type | Conversion |
|---|---|---|
| 0 | uint16 | ÷100 V |
| 1 | uint16 | ÷100A |
| 2–3 | int32 | W |
| 4–5 | uint32 | ÷800 kWh (importation) |
| 6–7 | uint32 | ÷800 kWh (exportation) |
| 8 | int16 | ÷1000 PF |
Exemple Python 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)Résultats attendus
La source Inverter and grid par défaut renvoie la génération A, la puissance du réseau signée B et la valeur C de zéro. B et C commencent aux adresses 10 et 20. Toutes les valeurs 32 bits utilisent d'abord le mot haut, avec des octets gros-boutiste.
Tous les modèles utilisent la carte de registre triphasée partagée : énergie active ÷800 kWh et énergie réactive ÷1000 kvarh. Ne pas appliquer la mise à l’échelle physique monophasée ÷3200.
La sélection de la source du navigateur et les paramètres Reactive/NEM ne modifient pas ce service partagé. Il prend en charge uniquement les lectures.
SunSpec 203 : compteur triphasé en lecture seule
SunSpec utilise le même point de terminaison TCP que les registres hérités. Utilisez la fonction 03 et les adresses de protocole de base zéro. Le simulateur s'identifie toujours comme WEM3050T, modèle 203, quel que soit le modèle Web sélectionné ou l'ID d'unité.
Lisez le bloc de compteurs de 107 registres à 40070 à chaque sondage. Décodez les valeurs sous forme d'entier × 10^SF, en lisant chaque valeur et son facteur d'échelle signé dans la même réponse. L'énergie est en Wh ; le facteur de puissance est un pourcentage. Les échelles peuvent changer à mesure que les valeurs augmentent.
Le point de terminaison partagé expose uniquement le modèle 203. Les mappages de micrologiciel 201 (WEM3080) et 202 (WEM2067) ne sont pas sélectionnés via les pages du navigateur ou les ID d'unité. Les modèles à flotteur 211 à 214 ne sont pas fournis. Cette implémentation n'est pas certifiée SunSpec.
| Adresse de départ | Nombre de registres | Contenu |
|---|---|---|
| 40000 | 2 | SoleilS : 0x5375, 0x6E53 |
| 40002 | 68 | Modèle commun 1, longueur 66 : IAMMETER / WEM3050T / simulateur-1.0 / 1AD9B537 |
| 40070 | 107 | Compteur entier modèle 203, longueur 105 |
| 40177 | 2 | Modèle final 0xFFFF, longueur 0 |
Dépannage
Délai de connexion : vérifiez le port affiché, le pare-feu et l'accessibilité TCP. Une page HTTPS fonctionnelle ne prouve pas que le port Modbus est accessible.
Valeurs inattendues : vérifiez l'adressage de base zéro, la puissance signée, l'ordre des mots et la mise à l'échelle. N'envoyez pas de trames Modbus RTU à ce point de terminaison TCP.