IAMMETER 官方文档
IAMMETER 设备支持 Modbus/TCP。该模拟器提供共享传统寄存器和如下所述的只读 SunSpec 203 映射。有关真实设备型号兼容性的信息,请参阅官方指南。
目标和工具
使用 Modbus 客户端或下面的 Python 标准库示例读取 A 相,不需要安装第三方 Python 包。
填写主机名和 TCP 端口,不要填写 HTTPS URL 或型号路径。当前服务地址如下。
Modbus 服务地址
simulator.iammeter.com:502连接设置
- 连接上述服务,从零起始地址 0 开始读取 10 个寄存器。
- 按下表解析电压、电流、有符号有功功率和电量。
- 间隔几秒再次读取,对应方向有功率流动时,其累计电量应增加。读取操作不会推进模拟时钟。
| 设置项 | 值 |
|---|---|
| 主机地址 | simulator.iammeter.com |
| TCP 端口 | 502 |
| 功能码 | 03 或 04 |
| Unit ID | 任意值,原样回传 |
| 起始地址 | 0 |
| 寄存器数量 | 10 |
解析 A 相数据
| 地址 | 类型 | 换算方式 |
|---|---|---|
| 0 | uint16 | ÷100V |
| 1 | uint16 | ÷100 A |
| 2–3 | int32 | W |
| 4–5 | uint32 | ÷800 kWh(输入) |
| 6–7 | uint32 | ÷800 kWh(输出) |
| 8 | int16 | ÷1000 PF |
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)预期结果
默认的“逆变器与电网”场景返回 A 发电、B 带正负方向的电网功率及全零的 C。B、C 的起始地址分别为 10、20。所有 32 位数值均为高字在前,字节采用大端序。
所有型号共用完整三相寄存器表:有功电量除以 800 得 kWh,无功电量除以 1000 得 kvarh。请勿使用真机单相电表的除以 3200 口径。
浏览器中的数据源选择和 Reactive/NEM 设置不影响这个共享服务。该服务仅支持读取。
SunSpec 203:只读三相电表
SunSpec 与原有寄存器共用一个 TCP 地址和端口。请使用功能码 03 和零起始协议地址。模拟器固定标识为 WEM3050T、模型 203,不随页面所选型号或 Unit ID 改变。
每次轮询完整读取从地址 40070 开始的 107 个电表寄存器。解码公式为:整数值 × 10^SF;数值和带符号的缩放因子必须来自同一次响应。电量单位为 Wh,功率因数为百分数。数值增大时,缩放因子可能变化。
共享服务只提供模型 203。固件的模型 201(WEM3080)和 202(WEM2067)不能通过切换页面或 Unit ID 选取。暂不提供浮点模型 211–214。此实现未经 SunSpec 认证。
| 起始地址 | 寄存器数量 | 内容 |
|---|---|---|
| 40000 | 2 | 太阳:0x5375、0x6E53 |
| 40002 | 68 | 常用型号1、长度66:IAMMETER/WEM3050T/simulator-1.0/1AD9B537 |
| 40070 | 107 | 整数米型号203,长度105 |
| 40177 | 2 | 最终型号0xFFFF,长度0 |
故障排除
连接超时:检查页面显示的端口、防火墙和 TCP 连通性。HTTPS 网页可访问,并不代表 Modbus 端口可连接。
数值异常:检查零起始地址、有符号功率、高低字顺序和缩放倍率。不要向 TCP 服务发送 Modbus RTU 帧。