# Modbus-registeroverzicht (EVSE-C-3x32A)

Volledig Modbus RTU-registeroverzicht van de Edge-laadmodule, firmware 2.10.17. Adres, naam, grootte, eenheid en betekenis van elk register; tabellen voor state en fouten; de twee registers die een controller van een andere fabrikant nodig heeft.

Canonical: https://edgetech.eu/nl/docs/modbus-registers  
Bijgewerkt: 2026-10-13

Geldt voor EVSE-C-3x32A met firmware 2.10.17 en later. Modbus RTU via RS485, 9600 baud 8N1 (19200 als een EVSE-SC-02 de module aanstuurt), fabrieksadres 0x01.

**Adres 0x01.** De laadpaal verlaat de fabriek met adres 0x01. Dit is een bijzonder adres: na het opstarten antwoordt de laadpaal daar niet, pas na een state-verandering (bijvoorbeeld de knop op de print, of een auto aansluiten). Een EdgeTech-wifi-module zet elke nieuwe laadpaal op een eigen adres, zodat alle laadpalen op de bus bereikbaar zijn. Doe met je eigen controller hetzelfde: schrijf na een state-verandering een nieuw adres van 0x02 of hoger naar register 0x0200 en sla het op.

**Eenheden.** Alle analoge waarden gebruiken eenheden van 1/256: spanning in 1/256 V, stroom in 1/256 A, energie in 1/256 kWh. Deel door 256.

**Timing.** De print verwacht een antwoordvenster van 40 ms. Gebruik een bedrade RS485-bus. Modbus via ethernet (een RS485-naar-ethernet-gateway, Modbus TCP) werkt in principe, maar de reactie is trager: prima om vanaf een pc te testen, maar niet met EdgeTech-wifi-modules, die snelle antwoorden van de laadpaal nodig hebben. Draadloze Modbus werkt niet.

## De twee registers die je nodig hebt

| Register | fc | Betekenis |
|---|---|---|
| `0x0103` | 4 | Lage byte: IEC 61851-state (1 = A, 2 = B, 3 = C, 4 = D). Hoge byte: foutbitmasker. |
| `0x0201` lage byte | 6 | RemoteMaxCurrent in ampère. Minstens één keer per seconde schrijven. `0` stopt het laden. |

Al het andere is monitoring en configuratie.

## Alleen-lezen-registers (fc 4)

### Systeemregisters 0x0000–0x0017

| Adres | Naam | Grootte | Beschrijving |
|---|---|---|---|
| `0x0000` | SerialNumber | 5 | Serienummer van het apparaat, 5 opeenvolgende registers |
| `0x0005` | FirmwareVersion | 1 | Versie van de applicatiefirmware |
| `0x0006` | MsSinceBoot | 4 | Milliseconden sinds het opstarten, 64-bit |
| `0x000A` | SaveEEPROM | 1 | Instellingen opslaan in EEPROM. Beveiligd |
| `0x000B` | FactoryDefaults | 1 | Alle instellingen resetten. Beveiligd |
| `0x000C` | Reset | 1 | De applicatie herstarten. Beveiligd |
| `0x000D` | EnterBootloader | 1 | Naar de bootloader gaan. Beveiligd |
| `0x000E` | ChallengeResponse | 1 | Magische code controleren |
| `0x000F` | EnableTestMode | 1 | Niet gebruikt |
| `0x0010` | ExternalLock | 1 | Kabelvergrendeling: `0` ontgrendeld, `1` vergrendeld, `0xFFFF` vergrendelingspoort gebruikt als CP disconnect |
| `0x0011` | I2cErrors | 1 | Intern aantal I²C-fouten lezen en resetten |
| `0x0012` | QuietReset | 1 | Resetten zonder CP-glitch |
| `0x0013` | ConditionalAnswer | 1 | Voorwaardelijk antwoord |
| `0x0014` | ConditionalAddress | 1 | Voorwaardelijk antwoord |
| `0x0015` | LockLock | 1 | Kabelvergrendeling inschakelen. Geeft `1` terug, of `0xFFFF` als de poort als CP disconnect wordt gebruikt |
| `0x0016` | UnlockLock | 1 | Kabelvergrendeling uitschakelen. Geeft `0` terug, of `0xFFFF` |
| `0x0017` | DisconnectCP | 1 | Kortstondige CP disconnect (EV wake-up). Geeft `1` terug, of `0xFFFF` als dit niet is geconfigureerd |

Voor beveiligde registers moet eerst de magische code (standaard `0x1234`) naar `0x0202` worden geschreven.

### Statusregisters 0x0100–0x0113

| Adres | Naam | Grootte | Eenheid | Beschrijving |
|---|---|---|---|---|
| `0x0100` | MinPilot | 1 | ruw | Minimaal gemeten pilotniveau |
| `0x0101` | MaxPilot | 1 | ruw | Maximaal gemeten pilotniveau |
| `0x0102` L | MaxCableCurrent | ½ | A | Belastbaarheid van de kabel volgens de PP-weerstand |
| `0x0102` H | MaxCurrent | ½ | A | Laadstroom die nu wordt doorgegeven |
| `0x0103` L | State | ½ | enum | IEC 61851-state, zie hieronder |
| `0x0103` H | Error | ½ | bitmasker | Foutbits, zie hieronder |
| `0x0104` | Temperature | 1 | °C | Temperatuur van de print |
| `0x0105` | CurrentL1 | 1 | 1/256 A | Stroom op L1 |
| `0x0106` | CurrentL2 | 1 | 1/256 A | Stroom op L2 |
| `0x0107` | CurrentL3 | 1 | 1/256 A | Stroom op L3 |
| `0x0108` | EnergySession | 1 | 1/256 kWh | Energie van de laadsessie, alle fasen |
| `0x0109` | VoltageL1 | 1 | 1/256 V | Uitgangsspanning L1, alleen ongelijk aan nul in state C/D |
| `0x010A` | VoltageL2 | 1 | 1/256 V | Uitgangsspanning L2 |
| `0x010B` | VoltageL3 | 1 | 1/256 V | Uitgangsspanning L3 |
| `0x010C` | Options | 1 | bits | Bit 0: DC-aardlekdetector ingeschakeld. Bit 1: 32 A-modus (0 = 16 A) |
| `0x010D` | Energy | 2 | 1/256 kWh | Totale energie over de levensduur, 32-bit: `(reg[0x010E] << 16) \| reg[0x010D]` |
| `0x010F` | EnergySessionL1 | 1 | 1/256 kWh | Energie van de laadsessie L1 |
| `0x0110` | EnergySessionL2 | 1 | 1/256 kWh | Energie van de laadsessie L2 |
| `0x0111` | EnergySessionL3 | 1 | 1/256 kWh | Energie van de laadsessie L3 |
| `0x0112` | EarthQuality | 1 | ruw | Kwaliteit van de aarde, experimenteel |
| `0x0113` | UBRR | 1 | ruw | Huidige waarde van het baudrateregister |

Omrekening: `reg × 1000 / 256` geeft millivolt of milliampère. `0x086A` = 2154 → 8414 mA.

### State (0x0103 lage byte)

| Waarde | IEC-state | CP-spanning | Relais | Betekenis |
|---|---|---|---|---|
| 1 | A | +12 V | open | Geen voertuig |
| 2 | B | +9 V | open | Voertuig aangesloten, laadt niet |
| 3 | C | +6 V | gesloten | Laden |
| 4 | D | +3 V | gesloten | Laden, ventilatie vereist |

Het state-register begint bij 1. Spannings- en stroomregisters zijn alleen zinvol in state C of D.

### Foutbits (0x0103 hoge byte)

| Bit | Waarde | Fout | Ernst |
|---|---|---|---|
| 0 | 1 | Temperatuur te hoog | Kritiek |
| 1 | 2 | Vastzittend relais | Kritiek |
| 2 | 4 | Aardfout | Kritiek |
| 3 | 8 | Max CP te laag | Waarschuwing, pilot buiten bereik |
| 4 | 16 | Min CP te hoog | Waarschuwing, pilot buiten bereik |
| 5 | 32 | DC-aardlekstroom gedetecteerd door de DC-aardlekdetector op de print (EVSE-X-DCD) | Laden geblokkeerd |
| 6 | 64 | I²C-initialisatie mislukt | Intern |
| 7 | 128 | I²C-communicatiefout | Intern |

`0` betekent geen fout. Bits kunnen gecombineerd voorkomen.

## Lees-/schrijfregisters (fc 3 lezen, fc 6 schrijven)

### Configuratie 0x0200–0x020A

| Adres | Naam | Grootte | Beschrijving |
|---|---|---|---|
| `0x0200` L | ModbusAddress | ½ | Slave-adres. Beveiligd. Fabriek `0x01` (antwoordt alleen na een state-verandering); wifi-modules zetten elke laadpaal op een eigen adres |
| `0x0200` H | Discovery | ½ | Niet gebruikt |
| `0x0201` L | RemoteMaxCurrent | ½ | Doorgegeven laadstroomlimiet in ampère. `0` schakelt laden uit. Het stuurregister. |
| `0x0201` H | RemoteMaxCurrentNextSecond | ½ | Failsafe-limiet van één seconde; valt terug op RemoteMaxCurrent als hij niet binnen 1 s opnieuw wordt geschreven. Niet voor normale aansturing. |
| `0x0202` | MagicResetCode | 1 | De magische code wijzigen |
| `0x0203` | Challenge | 1 | Challenge-response voor beveiligde schrijfopdrachten |
| `0x0204` | Settings | 1 | Bitveld, zie hieronder |
| `0x0205` | Led | 1 | `0` GRB-led op de print, `1` adresseerbare ledstrip (36 leds) |
| `0x0206` | Condition | 1 | Voorwaardelijk antwoord |
| `0x0207` | UBRR | 1 | Baudrateregister (`0x33` = 19200) |
| `0x0208` | CPDisconnectTime | 1 | Duur van de CP disconnect, ms |
| `0x0209` | TimeBeforeCPDisconnect | 1 | Wachttijd na het doorgeven van stroom voordat op state C wordt gecontroleerd, ms |
| `0x020A` L | CPType | ½ | `0` normaal, `1` A1/B1-pilotniveaus |
| `0x020A` H | CPDisconnectType | ½ | `0` EV40, `1` uitgebreide EV40 |

### Settings-bitveld (0x0204)

| Bit | Naam | Betekenis |
|---|---|---|
| 0 | PHASES | 1-fase (0) of 3-fase (1) |
| 1 | LOCK_STATE | Gedrag van de kabelvergrendeling |
| 2 | DCL_MUST_BE_PRESENT | Laden blokkeren als de DC-aardlekdetector ontbreekt |
| 3 | MISUSE_LOCK_PORT_AS_CP_DISCONNECT | De vergrendelingspoort gebruiken voor CP disconnect |
| 4 | AUTO_CP_DISCONNECT | Automatische CP disconnect na een pauze (EV wake-up) |
| 5 | EV40_CP_DISCONNECT | CP disconnect in EV40-stijl |

## Bootloader (adres 0xF0)

| Adres | fc | Naam | Beschrijving |
|---|---|---|---|
| `0x0500` | 4 | BootloaderVersion | Versie van de bootloader, `0` als je hem op het applicatieadres leest |
| variabel | 0x10 | FlashPage | Firmwarepagina's van 64 registers schrijven; lage adresbyte = pagina, hoge byte gezet = laatste pagina |

De wifi-module gebruikt dit om de firmware van de laadmodule in het veld bij te werken.

## Minimale regellus voor een controller

```text
every 1 s:
    state, error = read fc4 0x0103           # lage byte state, hoge byte fout
    if error & 0b111: limit = 0              # temperatuur, vastzittend relais, aardfout
    else:            limit = min(site_headroom_A, cable_A, 32)
    write fc6 0x0201 = limit                 # ampère; 0 stopt
```

Mis je twee schrijfopdrachten achter elkaar, dan valt de print terug op zijn vaste limiet.
