文档

通过 Modbus/TCP 读取数据

连接共享 TCP 服务,解析寄存器并核对实时电量读数。

IAMMETER 官方文档

IAMMETER 设备支持 Modbus/TCP。该模拟器提供共享传统寄存器和如下所述的只读 SunSpec 203 映射。有关真实设备型号兼容性的信息,请参阅官方指南。

目标和工具

使用 Modbus 客户端或下面的 Python 标准库示例读取 A 相,不需要安装第三方 Python 包。

填写主机名和 TCP 端口,不要填写 HTTPS URL 或型号路径。当前服务地址如下。

Modbus 服务地址

simulator.iammeter.com:502

连接设置

  1. 连接上述服务,从零起始地址 0 开始读取 10 个寄存器。
  2. 按下表解析电压、电流、有符号有功功率和电量。
  3. 间隔几秒再次读取,对应方向有功率流动时,其累计电量应增加。读取操作不会推进模拟时钟。
设置项值
主机地址simulator.iammeter.com
TCP 端口502
功能码03 或 04
Unit ID任意值,原样回传
起始地址0
寄存器数量10

解析 A 相数据

地址类型换算方式
0uint16÷100V
1uint16÷100 A
2–3int32W
4–5uint32÷800 kWh(输入)
6–7uint32÷800 kWh(输出)
8int16÷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 认证。

起始地址寄存器数量内容
400002太阳:0x5375、0x6E53
4000268常用型号1、长度66:IAMMETER/WEM3050T/simulator-1.0/1AD9B537
40070107整数米型号203,长度105
401772最终型号0xFFFF,长度0

故障排除

连接超时:检查页面显示的端口、防火墙和 TCP 连通性。HTTPS 网页可访问,并不代表 Modbus 端口可连接。

数值异常:检查零起始地址、有符号功率、高低字顺序和缩放倍率。不要向 TCP 服务发送 Modbus RTU 帧。

← 返回模拟器