Two jobs, one box
Inside every battery container there is a BMS — the battery management system that knows the cells' state of charge, temperatures, voltages and the limits it will tolerate — and a PCS, the power conversion system that actually moves energy between the DC cells and the AC grid. They come from different vendors more often than not, and something has to translate between them: read the BMS limits, keep its heartbeat alive, and tell the PCS how many kilowatts to push, in which direction, right now.
The BESS controller's job
Keep BMS and PCS synchronised. Watch SoC, temperature and alarms. Never command the converter past what the cells allow. Keep the heartbeat the BMS insists on, every second, or the battery trips.
The EMS's job
Decide what the battery should do: charge from cheap hours or surplus solar, discharge into the peak, stay inside export limits, follow the day-ahead schedule, and prove afterwards that it did.
Vendors usually sell these as separate products — a site controller from the battery integrator, an EMS from someone else, and a cloud on top. The TLCTL edge controller fulfils the site role directly: it speaks Modbus TCP and RTU to the BMS and the PCS, enforces the limits in its own dispatch loop, and executes the setpoints the VPP platform plans. One box, one vendor, one loop to audit.
How the loop actually runs
- The platform plans Every day before the auction closes the VPP engine builds tomorrow's schedule from the price forecast: charge windows in the cheapest hours, discharge into the evening peak, nothing exported under your price floor
- The controller reads the battery Over Modbus it polls the BMS — state of charge, health, cell temperatures, allowed charge and discharge current — and the PCS — measured power, mode, faults
- Limits are clamped before anything moves Every setpoint is cut to the SoC band, the C-rate, the PCS rating and the curtailment floor. That clamp lives in the dispatch loop itself, so it applies whether the command came from the plan, from an operator override or from the AI advisor
- The PCS is told, then checked The controller writes the setpoint and then reads measured power back. If the plant did not move, the command is re-sent and the platform is told — a converter that says "OK" and does nothing is the most common failure we see
- The heartbeat never stops BMS units that require a register toggled every second get it from a dedicated fast loop with its own persistent connection, decoupled from the slower read poll and from the uplink
- Telemetry is buffered and uplinked Readings are stored locally and sent over LTE or Ethernet with acknowledgement; a watchdog restarts the radio if the link goes quiet. Nothing is lost when the network blinks
- The platform settles Delivered power is compared to the schedule at quarter-hour resolution, and the imbalance is yours to see before your trader tells you
What happens when the cloud is gone? The controller keeps the heartbeat, keeps the last safe limits, keeps buffering, and lets the plant sit in its own safe state. It does not invent a schedule of its own. When the link returns, the buffer drains and the plan resumes.
What the controller does
BMS to PCS integration
- Modbus TCP and Modbus RTU over RS-485 to both sides; register maps are configuration, not firmware, so a new BMS or PCS brand is a register map away
- Multi-master RS-485: the controller sits on the existing bus next to the site's own logger without disturbing it
- Reference site runs a Kehua PCS with a Hithium BMS; SunSpec-style inverters are read the same way
- Remote plants behind a firewall: Modbus over an SSH tunnel, no inbound port on your network
BESS control
- Charge and discharge setpoints with closed-loop verification
- SoC band, C-rate and PCS rating enforced on the controller, independent of the platform
- Curtailment floor: solar is held at a minimum rather than driven to zero, so the site keeps covering its own load
- Kill-switch and manual override from the portal, with the same hardware limits
Multi-asset site
- PV inverters, grid and sub-meters, and dry-contact loads over two relays share the controller with the battery
- Export-limit windows per site; zero-export where the grid connection demands it
- Every reading lands in the same platform as the rest of your fleet
Market link
- Day-ahead schedule from the platform's three-method price forecast; replan when the auction publishes
- Intraday quarter-hour prices and live national grid data beside the plan
- Quarter-hour settlement, plan versus delivered
How it compares
| TLCTL edge + VPP platform | Integrator's BESS controller | Cloud-only EMS | |
|---|---|---|---|
| Scope | BESS + solar + meters + loads, and the market schedule | The battery, sometimes the PV | Scheduling; needs someone else's box on site |
| BMS link | Direct, Modbus TCP / RTU, heartbeat kept locally | Direct, usually one brand | None — through the vendor cloud |
| PCS link | Direct, setpoint verified against measured power | Direct | Vendor API, fire and forget |
| Physical limits | Clamped in the dispatch loop, whoever sent the command | Yes | Only what the vendor API refuses |
| Cloud outage | Heartbeat and limits held, telemetry buffered | Runs, but blind to the market | Nothing moves |
| Multi-brand | Register maps, any Modbus BMS or PCS | Vendor's own list | Whatever has a cloud API |
| Where the data lives | Your plant, your tenant, EU hosting | Integrator's portal | Foreign cloud |
Where it fits
- A 1 MW / 2 MWh battery with a third-party PCS and BMS, trading through a balance-responsible party and wanting a day-ahead schedule — the classic case, and the one our reference plant mirrors
- A solar park adding storage, where the new battery must respect the park's export limit and the existing logger must not be touched
- Multi-PCS sites — one controller coordinates several converters against one BMS view and one schedule
- Small batteries under 100 kW usually do not need the box at all: we read and, where the vendor allows, steer them through the inverter cloud
What it is not
There is no machine learning running on the controller, and we do not think there should be: the planning belongs in the platform, where the forecast, the prices and the fleet are, and the controller's job is to execute exactly and refuse what the battery cannot do. We are not a licensed trader — the schedule goes to your market seat, not to the exchange. And the platform is built for balancing services but is not yet prequalified for them; when it is, it will say so here.