Документация
Публичная демоверсия
Русский

Чтение данных через Modbus/TCP

Подключитесь к общей конечной точке TCP, декодируйте регистры и проверьте текущие показания энергии.

Официальная документация IAMMETER

Устройства IAMMETER поддерживают Modbus/TCP. Этот симулятор предоставляет общие устаревшие регистры и карту SunSpec 203, доступную только для чтения, описанную ниже. Обратитесь к официальным руководствам для совместимости с реальными моделями устройств.

Цель и инструменты

Прочтите этап A с помощью клиента Modbus или приведенный ниже пример стандартной библиотеки Python. Никакие пакеты Python не требуются.

Используйте имя хоста и TCP-порт, а не URL-адрес HTTPS или путь к модели. Настроенная конечная точка показана ниже.

Конечная точка Modbus

simulator.iammeter.com:502

Настройки подключения

  1. Подключитесь к конечной точке выше. Прочитайте 10 регистров, начиная с адреса 0.
  2. Расшифруйте напряжение, ток, активную мощность и энергию со знаком, используя таблицу ниже.
  3. Повторите через несколько секунд: энергия растет, пока активно соответствующее направление мощности. Чтения не управляют часами моделирования.
ПараметрЦенить
Хозяинsimulator.iammeter.com
TCP-порт502
Код функции03 или 04
Идентификатор объектаЛюбое значение, отображается без изменений
Начальный адрес0
Количество регистров10

Фаза декодирования А

АдресТипКонверсия
0uint16÷100 В
1uint16÷100 А
2–3int32W
4–5uint32÷800 кВтч (импорт)
6–7uint32÷800 кВтч (экспорт)
8int16÷1000 ПФ

Пример 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)

Ожидаемые результаты

Источник Inverter and grid по умолчанию возвращает поколение A, мощность сети со знаком B и C с нулевым значением. B и C начинаются с адресов 10 и 20. Все 32-битные значения сначала используют старшее слово с байтами с прямым порядком байтов.

Все модели используют общую трехфазную карту регистров: активная энергия ÷ 800 кВтч и реактивная энергия ÷ 1000 кварч. Не применяйте физическое однофазное масштабирование ÷3200.

Выбор источника браузера и настройки Reactive/NEM не меняют эту общую службу. Он поддерживает только чтение.

SunSpec 203: трехфазный счетчик только для чтения

SunSpec использует ту же конечную точку TCP, что и устаревшие регистры. Используйте функцию 03 и адреса протокола, отсчитываемые от нуля. Симулятор всегда идентифицируется как WEM3050T, модель 203, независимо от выбранной веб-модели или идентификатора устройства.

Прочтите 107-регистровый блок счетчиков по адресу 40070 в каждом опросе. Декодируйте значения как целое число × 10^SF, считывая каждое значение и масштабный коэффициент со знаком в одном ответе. Энергия указана в Втч; коэффициент мощности выражается в процентах. Шкалы могут меняться по мере роста значений.

Общая конечная точка предоставляет только модель 203. Сопоставления встроенного ПО 201 (WEM3080) и 202 (WEM2067) не выбираются через страницы браузера или идентификаторы устройств. Поплавковые модели 211–214 не предусмотрены. Эта реализация не сертифицирована SunSpec.

Начальный адресКоличество регистровСодержание
400002Солнца: 0x5375, 0x6E53
4000268Общая модель 1, длина 66: IAMMETER/WEM3050T/симулятор-1.0/1AD9B537
40070107Целочисленный счетчик, модель 203, длина 105
401772Конечная модель 0xFFFF, длина 0

Поиск неисправностей

Тайм-аут соединения: проверьте отображаемый порт, брандмауэр и доступность TCP. Работающая страница HTTPS не подтверждает доступность порта Modbus.

Неожиданные значения: проверьте адресацию с отсчетом от нуля, степень со знаком, порядок слов и масштабирование. Не отправляйте кадры Modbus RTU в эту конечную точку TCP.

← Вернуться к симулятору