Skip to main content

Modbus TCP on the VOOL LMC

Reading the LMC's mains currents and voltages over Modbus TCP: activation via support, connection settings, the full register map, current-limit writes and troubleshooting.

J
Written by Juhan Harm

The VOOL LMC has a Modbus TCP server for local integrations. A building management system (BMS), energy management system (EMS), Home Assistant or any other Modbus client can read the site’s mains currents and voltages per phase, and — with write access — set the grid connection current limit used by load management. Available from LMC software v6.4.0.

This is separate from the charger’s own Modbus interface (see the Charger Modbus manual). The LMC map does not provide individual charger measurements, energy counters or charger start/stop registers — for those, use the charger’s interface.

Getting started

Modbus TCP is disabled on the LMC by default and is enabled by VOOL support. Email [email protected] with the LMC serial number and say whether you need read-only access (monitoring) or write access too. Write access is also off by default and enabled by support. Activation and port settings cannot be changed through Modbus itself.

  1. Arrange activation with support — LMC serial number, read-only or read/write.

  2. Confirm the local connection details. Get the LMC’s local IPv4 address from your installer or network administrator (or your router’s list of connected devices). Use its Ethernet or Wi-Fi connection; if both are connected, confirm which address serves Modbus — the server listens on one address at a time.

  3. Configure your Modbus client with the settings below and read your first measurement.

Setting

Value

Protocol

Modbus TCP — the LMC is the server, your system is the client

Server address

The LMC’s local IPv4 address

TCP port

502 by default (use the port confirmed by support)

Unit ID / device ID

Use 1 if your client requires a value. The LMC ignores it — it does not select a downstream charger.

Numeric format

Float32, two registers per value, high word first and high byte first (ABCD, “big-endian, no word swap”)

Address convention

Zero-based decimal addresses (see “Addresses and encoding”)

Modbus TCP has no authentication or encryption. Anything that can reach the port can read the interface. Restrict access to trusted systems and never expose the port to the internet. Write access applies to all writable registers — including the device and list commands — and cannot be limited to the current-limit setting.

Your first measurement

Read the current on phase L1: function 03 (Read Holding Registers), start address 600 (decimal, zero-based), quantity 2 registers, decode as float32 ABCD. Unit: amperes.

Example: if the two registers return 0x41A4 and 0x0000, the value is 20.5 A. Combine both registers into one 32-bit float — do not treat either register as a separate value and do not apply a scaling factor.

Measurement registers (read-only)

Read with FC03 (holding registers) or FC04 (input registers) at the same zero-based addresses.

Registers

Measurement

Unit

Position in a 26-register read

600–601

Mains current L1

A

0–1

602–603

Mains current L2

A

2–3

604–605

Mains current L3

A

4–5

606–619

Reserved — reads return zero

—

6–19 (ignore)

620–621

Mains voltage L1

V

20–21

622–623

Mains voltage L2

V

22–23

624–625

Mains voltage L3

V

24–25

Read everything at once with start 600, quantity 26. Or read only currents (start 600, quantity 6) or only voltages (start 620, quantity 6). The “position” column counts from zero within the returned array — it is not the register address.

What “mains current” means: it is the LMC’s calculated total current per phase. With the meter (CTs) at the main connection, it comes from the meter. If the meter measures other building loads only, the LMC adds the charger currents. The installer’s metering configuration therefore matters when comparing readings with another system. A zero or unchanged reading on its own does not prove the meter is working.

Setting the grid connection current limit (write access)

Requires write access enabled by VOOL support. A wrong current limit can allow loads above the installation’s capacity and trip protective devices. Use only limits confirmed by your installer and never exceed the installation’s rated capacity.

The grid connection current limit is the per-phase current budget load management works with. It applies to the whole grid connection, including other building loads — it is not an individual charger’s current.

Registers

Setting

Unit

Format / access

104–105

Grid connection current limit

A

Float32 / read-write

  1. Read the existing value — FC03, start 104, quantity 2. Keep it in case you need to restore it.

  2. Write the agreed limit as one float32 with FC16 (Write Multiple Registers), two registers in a single request. Example for 32 A: register 104 = 0x4200, register 105 = 0x0000.

  3. Read back and confirm, then observe the installation. A write response alone does not prove the change took effect.

Configuration changes are persistent and affect load management during operation.

Addresses and encoding

All addresses here are zero-based decimal protocol addresses. A quantity is the number of 16-bit registers, not the number of values — each numeric value uses two consecutive registers. Clients use different conventions; for the L1 current read, enter:

Client convention

Enter

Zero-based address / offset

600

One-based register number (register 1 = address 0)

601

Holding-register reference (40001 = address 0)

40601

Do not send 40601 as the protocol address.

  • Measurements and settings are in engineering units, no scaling.

  • Switches: float32 0.0 = off, 1.0 = on (any non-zero value is treated as on).

  • Modes: the documented integer choice encoded as float32, e.g. 1.0.

  • Common values: 0.0 = 0x0000 0x0000; 1.0 = 0x3F80 0x0000; 20.5 = 0x41A4 0x0000; 32.0 = 0x4200 0x0000.

  • List commands use raw integers — see below.

Request rules

Function

Use

03 — Read Holding Registers

Any readable region

04 — Read Input Registers

Measurements only (600–625)

16 (0x10) — Write Multiple Registers

Writable values and command blocks

FC06 (Write Single Register) is not supported and returns exception 02 — use FC16 even for a single value. Coils are not used.

Readable region (inclusive)

Contents

Functions

104–111

Grid limit, operating modes, antenna setting

FC03

240–283

Load-management tuning

FC03

600–625

Measurements and reserved zeros

FC03, FC04

  • Each read must stay within one region. Reads outside them — including command registers — return exception 02.

  • Write numeric values starting at their first register and write both registers. Consecutive writable values can be combined in one request, but not across an unmapped gap.

  • Write command blocks at their exact start address and quantity.

  • The interface does not enforce the commissioning ranges in this article — validate values in your client and use finite numbers.

  • A normal write response only acknowledges the request. Read back settings, and verify that commands completed before retrying.

Troubleshooting

Symptom

What to check

Connection refused or timed out

Confirm with support that Modbus is enabled; check the LMC’s local IPv4 address and port, reachability and firewall rules. If both Ethernet and Wi-Fi are connected, confirm which address is listening. Modbus does not cross subnets or VLANs.

Read returns exception 02

Check address convention, quantity and region boundaries. FC04 only reads 600–625. Command registers cannot be read.

Write returns exception 02

Confirm write access with support. Use FC16, a writable address and a complete value or block. FC06 is rejected.

Implausibly large or tiny numbers

Decode as float32 ABCD, two registers per value, no scaling. Check for an off-by-one address.

Zero or unchanged measurements

Check response positions and the reserved range. Ask support to verify the meter and metering configuration.

Write succeeds but value is unchanged

Read back, check encoding and allowed values. Acknowledgement alone does not guarantee the change was applied.

Integration worked, then stopped

The LMC’s local IP may have changed after a router change or update — set a static IP or DHCP reservation for the LMC (and the chargers). A software update or service restart also drops the session; do not automatically repeat an update command after a timeout.

Exceptions: 01 Illegal Function — unrecognised function. 02 Illegal Data Address — register-map validation failures and disabled writes. 03 Illegal Data Value — invalid protocol quantity (e.g. an FC16 write outside 1–123 registers); it does not mean a setting’s range was checked.

Advanced settings (write access — agree values with VOOL support)

These change load-management behaviour or hardware configuration. All are read-write float32 values. Ranges are commissioning limits, not recommended settings — read the installed values before changing anything.

Operating modes and antenna

Registers

Setting

Values

106–107

Mains metering mode

0 = meter at main connection, including chargers; 1 = meter measures other building loads, LMC adds charger currents

108–109

Load management mode

0 = prioritised sharing; 1 = equal power sharing

110–111

Use external Wi-Fi antenna

0 = off; 1 = on. Needs compatible hardware and antenna; takes effect after the LMC restarts

Load-management tuning

Registers

Setting

Unit

Range / values

240–241

Reference rate limit enabled (current ramping)

—

0 = off; 1 = on

242–243

Reference rate limit rate

A/s

0–32

244–245

Current threshold for completing start-up ramping

A

0–32

246–247

Equal power sharing: initial current step

A

0.01–32

248–249

Equal power sharing: default current step

A

0.01–32

250–251

Equal power sharing: minimum equal current threshold

A

0–32

252–253

Equal power sharing: delay before disabling charger charging

s

0–86400

254–255

Equal power sharing: delay before allowing charger charging

s

0–86400

256–257

Phase load management enabled

—

0 = off; 1 = on

258–259

Phase switch delay

s

0–30

260–261

Phase switch current threshold

A

0–1000

262–263

Phase switch imbalance threshold

%

0–100

264–265

Phase overload suspension enabled

—

0 = off; 1 = on

266–267

Force single-phase charging during phase overload handling

—

0 = off; 1 = on

268–269

Phase overload off time

s

0–86400

270–271

Suspension avoidance enabled

—

0 = off; 1 = on

272–273

Suspension stage 1 current threshold

A

0–32

274–275

Suspension stage 1 hold time

s

0–600

276–277

Suspension stage 2 current threshold

A

0–32

278–279

Suspension stage 2 hold time

s

0–600

280–281

Suspension stage 3 current threshold

A

0–32

282–283

Suspension stage 3 hold time

s

0–600

Device and list commands (write-only)

Commands need write access, cannot be read (exception 02) and can interrupt operation or change the installation’s configuration — use them only as part of an agreed service or commissioning procedure.

Device commands

FC16, exactly two registers at the start address. Writing float32 1.0 (0x3F80 0x0000) — or any non-zero value — triggers the command; 0.0 does nothing.

Registers

Command

Effect

4–5

Update LMC software

Starts the default software update. Completion is not reported over Modbus.

12–13

Restart LMC service

Restarts the controller application and drops the Modbus connection.

Charger list

Write exactly 7 registers starting at 8900 in one FC16 request. Raw unsigned integers, not float32. The list cannot be read back over Modbus.

Register

Field

Encoding / use

8900

Sub-command

1 = add; 2 = remove; 3 = update; 4 = purge

8901–8903

Charger serial number

6 bytes, high byte first per register. Serial 112233445566 → 0x1122, 0x3344, 0x5566

8904

Multipoint ID

0–255, low byte only — the point the charger is assigned to

8905

Flags

Bit 0 enables OCPP 1.6 for the charger (use 1); keep other bits zero

8906

Reserved

Write 0

Remove uses only the serial number (write zero in the other fields). Purge resets the list to defaults and ignores the payload. An unknown sub-command is acknowledged but ignored.

Multipoint list

A multipoint is a connection point with its own current limit. Write exactly 4 registers starting at 8920 in one FC16 request, raw unsigned integers. The list cannot be read back over Modbus.

Register

Field

Encoding / use

8920

Sub-command

1 = add; 2 = remove; 3 = update; 4 = purge

8921

Multipoint ID

1–255. Point 0 is the grid connection and cannot be changed with these commands

8922

Current limit

Whole amperes, uint16 (0–65535), within the installation’s agreed capacity

8923

Parent multipoint ID

Write 0 (no parent) — non-zero parents are not supported by this command

Remove uses only the multipoint ID. Remove assigned chargers and child points before removing a point. Purge restores defaults. Confirm the resulting configuration with support.

Contact support

For activation, write access or integration help, email [email protected] with the LMC serial number. When reporting a problem also include the client software, the LMC’s local IP and port, the function code, start address, quantity, the response or exception, the time it happened and the LMC software version if known.

This article covers the LMC Modbus interface introduced in LMC software v6.4.0. Ask support to confirm the available functions for your installed software before commissioning an advanced integration.

Did this answer your question?