Huawei SmartLogger Modbus RTU Setup Guide

The Huawei SmartLogger uses a Modbus Remapped register scheme where each connected SUN2000 inverter is accessible at a calculated starting address — not at the inverter's own Modbus ID. This guide walks through the register layout, address formula, scaling rules, and how to poll a full solar plant using ModbusManager.

What is Modbus Remapped?

When SUN2000 inverters connect to a SmartLogger via RS485, the SmartLogger acts as the single Modbus slave on the external RS485 bus. It remaps each inverter's registers into a sequential address space, making them all available from one slave ID.

This is different from daisy-chaining inverters directly — you do not talk to each inverter at its own Modbus ID. You talk to the SmartLogger only, and use the remapped addresses to target specific inverters.

Key point: All polling goes to the SmartLogger itself, at its Modbus address. In the SmartLogger Modbus-TCP protocol the logic device ID is 0 for the SmartLogger and its remapped registers. The inverter number is encoded in the register address, not in the slave ID. (Some gateways or RS485 setups expose the SmartLogger at address 1 — check SmartLogger › Settings › Modbus if a read at 0 returns nothing.)

Inverter Address Formula

The starting holding register for inverter N (1-based) is:

start_address = 51000 + 25 × (N − 1)

Examples for a 24-inverter plant:

InverterStart Address (0-based)Decimal
10xC73851000
20xC75151025
30xC76A51050
120xC7FF51275
240xC89751575

Each inverter block occupies 25 registers. Reading FC03 from the start address with quantity = 25 retrieves all parameters for that inverter in one request.

Key Registers (Offsets from Start Address)

The offsets below follow Huawei's SmartLogger Modbus Interface Definition, section 2.7 (Remapped Modbus definitions), Table 2-7. Each value's offset is its position within the 25-register inverter block; multi-register values (I32 / U32) occupy two consecutive registers.

OffsetParameterTypeGainUnit
+0 … +1Active powerI32÷1000kW
+2 … +3Reactive powerI32÷1000 (signed)kVar
+4Total DC input currentI16÷100A
+5 … +6Total input powerU32÷1000kW
+7Insulation resistanceU16÷1000
+8Power factorI16÷1000
+9Inverter statusU16raw (enum)
+11Cabinet temperatureI16÷10°C
+12 … +13Major fault codeU32Alarm ID (bit 31–16) + Cause ID (bit 15–0)
+14 … +15Minor fault codeU32Alarm ID + Cause ID
+16 … +17Warning codeU32Alarm ID + Cause ID
+18 … +24Spare (reserved)U16
Watch the offsets: Active power sits at the start of the block (offset +0/+1), not the inverter status. Status is at offset +9. Reading status from offset +0 is the most common mistake — you would be reading the high word of active power instead.
32-bit pairs: Active power, reactive power, total input power, and the fault codes each span two consecutive 16-bit registers (hi-word first, then lo-word — big-endian). Combine them before applying the gain: value = (hi << 16 | lo) / 1000. Active and reactive power are signed I32, so treat the combined value as two's complement; total input power is unsigned U32.

Inverter Status Values

The status register (offset +9) returns an enum. The underlying values come from the SUN2000's own Modbus protocol, but the SmartLogger adds two states of its own (per Table 2-7, "Scope" column):

Value (hex)DecimalMeaning
0xB00045056Communication interrupted (added by SmartLogger)
0xC00049152Uploading / firmware update (added by SmartLogger)
Inverter-level status codes: All other status values (standby, grid-connected, derating, fault, etc.) are defined in the separate SUN2000 Modbus Protocol document, not in the SmartLogger interface definition. The exact enum varies by inverter model and firmware — consult the SUN2000 protocol for your specific model rather than assuming a fixed table. For a simple "running / not running" indicator, treat anything other than 0xB000 and a fault state as on-grid.

Plant-Level SmartLogger Registers

Besides the individual inverter blocks, the SmartLogger exposes plant-level aggregates in its own register range (section 2.1 of the interface definition, roughly registers 40000–41949). These sum or aggregate across all connected inverters. A few useful ones:

RegisterParameterTypeGainUnit
40525Total active power (all inverters)I32÷1000kW
40544Total reactive powerI32÷1000kVar
40560Total energy yield (E-Total)U32÷10kWh
40562Daily energy yield (E-Daily)U32÷10kWh
40543Plant statusU16raw (enum)

These plant-level registers are read at the SmartLogger's own logic device ID (0), not at an inverter address. Always verify the exact map against the "SmartLogger Modbus Interface Definition" document for your firmware — register availability can differ between SmartLogger 3000A and 1000A models and across firmware versions.

Step-by-Step: Polling with ModbusManager

1 Connect — Set up an RS485 or TCP connection to the SmartLogger. For Modbus-TCP, the logic device ID is 0 (the SmartLogger itself). Baud rate for RS485 is usually 9600 or 19200 (check SmartLogger › Settings › RS485).

2 Open a poll window — Choose Function Code 03 (Read Holding Registers), slave / logic device ID 0. Enter the start address for inverter 1: 51000. Set quantity to 25.

3 Apply scaling — Right-click on registers that need scaling, select Scaling and enter the gain. Active power occupies the first two registers (offset +0/+1) — combine them into an I32 using the 32-bit display column in ModbusManager, then scale ÷1000. Single-register values scale directly: DC current ÷100, power factor ÷1000, cabinet temperature ÷10.

4 Duplicate for each inverter — Clone the poll window and change only the start address: 51000 + 25 × (N−1). Name each window "INV-01", "INV-02", etc.

5 Save workspace — Use File › Save Workspace to store all 24 poll windows in a single JSON file. Reload in one click next time.

Poll rate: The SmartLogger updates its internal data cache every 1–5 minutes depending on configuration. Polling faster than the cache refresh rate returns stale values — a scan rate of 60 seconds per window is typically sufficient.

Calculating Plant KPIs with Tags (Pro)

ModbusManager Pro includes a tag engine where you can write Structured Text expressions to compute derived values across multiple poll windows. For a 24-inverter plant, a tag that sums active power across all inverters looks like:

// Total active power — sum I32 pairs from all 24 inverters
plant_kw := 0.0;
FOR i := 1 TO 24 DO
  hi := reg[51000 + 25*(i-1) + 0];
  lo := reg[51000 + 25*(i-1) + 1];
  raw := (hi SHL 16) OR lo;
  IF raw > 2147483647 THEN raw := raw - 4294967296; END_IF
  plant_kw := plant_kw + (raw / 1000.0);
END_FOR;

The result can be bound to a Dashboard gauge or KPI element for a live plant overview visible in full-screen runtime mode.

Download a Ready-Made Workspace

Rather than building all 24 poll windows, scaling rules, tags and dashboard elements by hand, you can start from a complete example workspace. It contains:

Requires ModbusManager Pro: this workspace uses the tag engine and Dashboard HMI, which are Pro features. Opening it in Standard will load the poll windows, but the tags and dashboard will not function. Verify the register map against your own SmartLogger firmware before relying on the values.

SmartLogger_24inv.json

24-inverter solar plant workspace for the Modbus Remapped scheme. Open via File › Open Workspace in ModbusManager Pro.

Download Workspace

Try it with ModbusManager Pro

Tag engine + Dashboard HMI for live plant overviews. Free 14-day trial. No credit card. Windows 10/11.

Download Pro Trial

Frequently Asked Questions

Can I use Modbus TCP instead of RS485?

Yes. The SmartLogger supports Modbus TCP on port 502. The register map is identical — the same address formula and scaling applies. Connect ModbusManager via TCP to the SmartLogger's IP address, logic device ID 0.

My inverter reads 0 even though it is running

Check that the SmartLogger has detected the inverter (SmartLogger web UI › Device List). If the inverter shows "undetected", the RS485 wiring between SmartLogger and inverter is the issue, not the Modbus polling side.

The active power register shows a huge number

You are likely reading it as U16 instead of combining the hi/lo pair into I32. Select the 32-bit signed integer display column in ModbusManager for the register pair starting at offset +0 (the first two registers of the inverter block).

Which SmartLogger firmware versions does this apply to?

The Modbus Remapped scheme described here applies to SmartLogger 3000A and SmartLogger 1000A with firmware V300R023 and later. Older firmware versions may use a different starting address or block size — always verify against the "SmartLogger Modbus Interface Definition" document from Huawei's support portal.