Modbus/TCP - Lese-/Schreibzugriff

Diese Anleitung dient der Beschreibung des Lese-/Schreibzugriffs auf ein FENECON Stromspeichersystem mittels Modbus/TCP API. Zunächst werden Grundlagen zum Protokoll beschrieben. Anschließend wird die Funktionsweise der Schnittstelle erklärt.

Voraussetzungen

Das auf das Stromspeichersystem zugreifende Gerät (z.B. Notebook/PC) muss direkten Zugriff auf die IP-Adresse des FEMS haben – also z. B. im gleichen physischen Netzwerk angeschlossen sein.

Grundlagen Modbus/TCP

Das Modbus-Protokoll ist ein Kommunikationsprotokoll, das auf einer Client/Server-Architektur basiert. Es wurde 1979 von Gould-Modicon für die Kommunikation mit seinen speicherprogrammierbaren Steuerungen ins Leben gerufen. In der Industrie hat sich der Modbus zu einem De-facto-Standard entwickelt, da es sich um ein offenes Protokoll handelt. Seit 2007 ist die Version Modbus TCP Teil der Norm IEC 61158.

Mittels Modbus können ein Client (z. B. ein PC/EMS) und mehrere Server (z. B. Mess- und Regelsysteme, Batteriespeicher, PV-Anlage, Ladestation E-Auto) verbunden werden. Es gibt zwei Versionen: Eine für die serielle Schnittstelle (EIA-232 und EIA-485) und eine für Ethernet. In dieser Anleitung wird die Version für Ethernet beschrieben. Hierbei werden TCP/IP-Pakete verwendet, um die Daten zu übermitteln.

Lese- und Schreibzugriffe sind auf folgende Objekttypen möglich:

Objekttyp

Zugriff

Größe

Funktionscode

Einzelner Ein-/Ausgang „Coil“

Lesen & Schreiben

1-bit

01 / 05 / 15

Einzelner Eingang „Discrete Input“

nur Lesen

1-bit

02

(analoge) Eingänge „Input Register“

nur Lesen

16-bits

04

(analoge) Ein-/Ausgänge „Holding Register“

Lesen & Schreiben

16-bits

03 / 06 / 16

Lesezugriff

Diese App ist im Standard-Lieferumfang enthalten.

Die Modbus-Schnittstelle ist folgendermaßen konfiguriert:

Table 1. Parameter für Lesezugriff

Geräteadresse

IP-Adresse des EMS (z.B. 192.168.0.20)

Port

502

Unit-ID

1

Function-Codes

03 (Read Holding Registers)

04 (Read Input Registers)

Die Schnittstelle ermöglicht standardmäßig Zugriff auf die Kanäle der Komponente _sum. Der Zugriff auf weitere Komponenten wird projektspezifisch freigegeben – um z. B. ansteuerbare Stromspeichersysteme oder Ladesäulen über die Schnittstelle freizugeben.

Modbus-Tabelle

Die individuelle Modbus-Tabelle für Ihr System können Sie bequem über das Online-Monitoring als Excel-Datei wie folgt herunterladen:

app center start 01
Abbildung 1. Reiter links oben im Online-Monitoring öffnen
app center start 02
Abbildung 2. Reiter "Einstellungen" öffnen
Modbus Anlagenprofil 3
Abbildung 3. Anlagenprofil öffnen
Modbus Anlagenprofil 4
Abbildung 4. ctrlApiModbusTcp öffnen und auf "Download Protocol" klicken

Die wichtigsten Datenpunkte finden Sie auch hier in der Schnellübersicht:

Address (Adresse)

Name (Name)

Type (Typ)

Value/Description (Wert/Beschreibung)

Unit (Einheit)

Access (Zugang)

Header

0

Hash of "OpenEMS"

uint16

0x6201

RO

1

Length of block "_meta"

uint16

199

RO

2

OpenEMS Version Major

uint16

2020

RO

3

OpenEMS Version Minor

uint16

26

RO

4

OpenEMS Version Patch

uint16

1

RO

5

Manufacturer

string16

FENECON GmbH

RO

21

Manufacturer Model

string16

OpenEMS

RO

37

Manufacturer Options

string16

RO

53

Manufacturer Version

string16

RO

69

Manufacturer Serial Number

string16

RO

85

Manufacturer EMS Serial Number

string16

RO

Sum

200

Component-ID

string16

_sum

RO

216

Length of block "_sum"

uint16

300

RO

220

Hash of "OpenemsComponent"

uint16

0xb3dc

RO

221

Length of block "OpenemsComponent"

uint16

80

RO

222

_sum/State

enum16

0:Ok, 1:Info, 2:Warning, 3:Fault

RO

300

Hash of "Sum"

uint16

0x462b

RO

301

Length of block "Sum"

uint16

220

RO

302

_sum/EssSoc

uint16

Percent [%]

RO

303

_sum/EssActivePower

float32

AC-side power of Energy Storage System. Includes excess DC-PV production for hybrid inverters. Negative values for charge; positive for discharge

Watt [W]

RO

305

Reserved

float32

RO

307

Reserved

float32

RO

309

_sum/EssReactivePower

float32

VoltAmpereReactive [var]

RO

311

Reserved

float32

RO

313

Reserved

float32

RO

315

_sum/GridActivePower

float32

Grid exchange power. Negative values for sell-to-grid; positive for buy-from-grid

Watt [W]

RO

317

_sum/GridMinActivePower

float32

Watt [W]

RO

319

_sum/GridMaxActivePower

float32

Watt [W]

RO

321

Reserved

float32

RO

323

Reserved

float32

RO

325

Reserved

float32

RO

327

_sum/ProductionActivePower

float32

Total production; always positive

Watt [W]

RO

329

_sum/ProductionMaxActivePower

float32

Watt [W]

RO

331

_sum/ProductionAcActivePower

float32

Production from AC source

Watt [W]

RO

333

_sum/ProductionMaxAcActivePower

float32

Watt [W]

RO

335

Reserved

float32

RO

337

Reserved

float32

RO

339

_sum/ProductionDcActualPower

float32

Production from DC source

Watt [W]

RO

341

_sum/ProductionMaxDcActualPower

float32

Watt [W]

RO

343

_sum/ConsumptionActivePower

float32

Watt [W]

RO

345

_sum/ConsumptionMaxActivePower

float32

Watt [W]

RO

347

Reserved

float32

RO

349

Reserved

float32

RO

351

_sum/EssActiveChargeEnergy

float64

WattHours [Wh]

RO

355

_sum/EssActiveDischargeEnergy

float64

WattHours [Wh]

RO

359

_sum/GridBuyActiveEnergy

float64

WattHours [Wh]

RO

363

_sum/GridSellActiveEnergy

float64

WattHours [Wh]

RO

367

_sum/ProductionActiveEnergy

float64

WattHours [Wh]

RO

371

_sum/ProductionAcActiveEnergy

float64

WattHours [Wh]

RO

375

_sum/ProductionDcActiveEnergy

float64

WattHours [Wh]

RO

379

_sum/ConsumptionActiveEnergy

float64

WattHours [Wh]

RO

383

_sum/EssDcChargeEnergy

float64

WattHours [Wh]

RO

387

_sum/EssDcDischargeEnergy

float64

WattHours [Wh]

RO

391

_sum/EssActivePowerL1

float32

AC-side power of Energy Storage System on phase L1. Includes excess DC-PV production for hybrid inverters. Negative values for charge; positive for discharge

Watt [W]

RO

393

_sum/EssActivePowerL2

float32

AC-side power of Energy Storage System on phase L2. Includes excess DC-PV production for hybrid inverters. Negative values for charge; positive for discharge

Watt [W]

RO

395

_sum/EssActivePowerL3

float32

AC-side power of Energy Storage System on phase L3. Includes excess DC-PV production for hybrid inverters. Negative values for charge; positive for discharge

Watt [W]

RO

397

_sum/GridActivePowerL1

float32

Grid exchange power on phase L1. Negative values for sell-to-grid; positive for buy-from-grid

Watt [W]

RO

399

_sum/GridActivePowerL2

float32

Grid exchange power on phase L2. Negative values for sell-to-grid; positive for buy-from-grid

Watt [W]

RO

401

_sum/GridActivePowerL3

float32

Grid exchange power on phase L3. Negative values for sell-to-grid; positive for buy-from-grid

Watt [W]

RO

403

_sum/ProductionAcActivePowerL1

float32

Production from AC source on phase L1

Watt [W]

RO

405

_sum/ProductionAcActivePowerL2

float32

Production from AC source on phase L2

Watt [W]

RO

407

_sum/ProductionAcActivePowerL3

float32

Production from AC source on phase L3

Watt [W]

RO

409

_sum/ConsumptionActivePowerL1

float32

Watt [W]

RO

411

_sum/ConsumptionActivePowerL2

float32

Watt [W]

RO

413

_sum/ConsumptionActivePowerL3

float32

Watt [W]

RO

415

_sum/EssDischargePower

float32

Actual AC-side battery discharge power of Energy Storage System. Negative values for charge; positive for discharge

Watt [W]

RO

417

_sum/GridMode

enum16

1:On-Grid, 2:Off-Grid

RO

ess0

500

Component-ID

string16

ess0

RO

516

Length of block "ess0"

uint16

580

RO

520

Hash of "OpenemsComponent"

uint16

0xb3dc

RO

521

Length of block "OpenemsComponent"

uint16

80

RO

522

ess0/State

enum16

0:Ok, 1:Info, 2:Warning, 3:Fault

RO

600

Hash of "SymmetricEss"

uint16

0x42ee

RO

601

Length of block "SymmetricEss"

uint16

100

RO

602

ess0/Soc

uint16

Percent [%]

RO

603

ess0/GridMode

enum16

1:On-Grid, 2:Off-Grid

RO

604

ess0/ActivePower

float32

Watt [W]

RO

700

Hash of "ManagedSymmetricEss"

uint16

0xa3ed

RO

701

Length of block "ManagedSymmetricEss"

uint16

100

RO

702

ess0/AllowedChargePower

float32

Watt [W]

RO

704

ess0/AllowedDischargePower

float32

Watt [W]

RO

706

ess0/SetActivePowerEquals

float32

Watt [W]

WO

708

ess0/SetReactivePowerEquals

float32

VoltAmpereReactive [var]

WO

710

ess0/SetActivePowerLessOrEquals

float32

Watt [W]

WO

712

ess0/SetReactivePowerLessOrEquals

float32

VoltAmpere [VA]

WO

714

ess0/SetActivePowerGreaterOrEquals

float32

Watt [W]

WO

716

ess0/SetReactivePowerGreaterOrEquals

float32

Watt [W]

WO

800

Hash of "EssSymmetric"

uint16

0x1352

RO

801

Length of block "EssSymmetric"

uint16

300

RO

Beispiel 1: Lesezugriff Batterieladezustand mit QModMaster

Im Folgenden soll der Lesezugriff auf den Ladezustand (SoC) der Batterie mittels des kostenlosen Tools QModMaster exemplarisch gezeigt werden.

Das Tool kann unter folgendem Link heruntergeladen werden:
Online: https://sourceforge.net/projects/qmodmaster/

Der Wert des Ladezustands ist wie folgt hinterlegt (s. oben):

Table 2. Registeradresse für den Ladezustand der Batterie

Address

Name

Type

Value/Description

Unit

Access

302

_sum/EssSoc

uint16

Percent [%]

RO

Standardmäßig wird in QModbusMaster die Base Address auf 1 gesetzt. Dieser Wert ist auf 0 zu ändern. Anderenfalls sind die Registeradressen aus dem Anlagenprofil um 1 verschoben.

Modbus Lesezugriff Beispiel 4
Abbildung 5. Einstellungen

Unter Modbus TCP Settings müssen Slave IP und TCP Port richtig konfiguriert sein.

Modbus Lesezugriff Beispiel 2
Abbildung 6. Modbus TCP Einstellungen

Da es sich um einen unit16 handelt, muss ein 16-bit Wort, also ein Register, ausgelesen werden. Nach Setzen der Werte auf den Menüpunkt "Read/Write" klicken. Der gelesene Wert erscheint unten.

Modbus Lesezugriff Beispiel 1
Abbildung 7. Wert lesen

Der Abgleich mit dem Online-Monitoring bestätigt die Korrektheit des gelesenen Wertes.

Modbus Lesezugriff Beispiel 3
Abbildung 8. Vergleich mit Online-Monitoring

Die Durchführung anderer Leseoperationen erfolgt analog.

Schreibzugriff

Diese App ist nicht im Standard-Lieferumfang enthalten. Sie kann jedoch nachträglich jederzeit nachgerüstet werden.

Die Modbus-Schnittstelle ist folgendermaßen konfiguriert:

Table 3. Parameter für Schreibzugriff

Geräteadresse

IP-Adresse des EMS (z.B. 192.168.0.20)

Port

502

Unit-ID

1

Function-Codes

03 (Read Holding Registers)

04 (Read Input Registers)

06 (Write Single Holding Register)

16 (Write Multiple Holding Registers)

Beispiel 2: Schreibzugriff auf EssActivePower mit QModMaster

Im Folgenden soll der Schreibzugriff für das Setzen der EssActivePower mittels des kostenlosen Tools QModMaster exemplarisch gezeigt werden. Hierdurch kann die Funktion des Controller Fix Active Power Symmetric simuliert werden.

Der Wert ist wie folgt hinterlegt (s. oben):

Table 4. Registeradresse für das Setzen der EssActivePower des Speichers

Address

Name

Type

Value/Description

Unit

Access

706

ess0/SetActivePowerEquals

float32

Watt [W]

WO

Zusätzlich zur Überprüfung der Base Address auf 0 muss sichergestellt werden, dass unter Endian die Einstellung Big ausgewählt ist.
Modbus Schreibzugriff Beispiel 1
Abbildung 9. Einstellungen

Da es sich um einen float32 handelt, müssen zwei 16-bit Wörter, also zwei Register, geschrieben werden. In diesem Beispiel soll der Speicher mit 4000 (4E+03) Watt entladen werden. Der Wert kann direkt als Dezimalzahl in das Register eingegeben werden, wobei das Data Format Float zu wählen ist. Nach Setzen des Wertes auf den Menüpunkt "Read/Write" klicken, um die Schreiboperation durchzuführen.

Modbus Schreibzugriff Beispiel 2
Abbildung 10. Wert schreiben

Der Abgleich mit dem Online-Monitoring bestätigt die Korrektheit des geschriebenen Wertes.

Modbus Schreibzugriff Beispiel 3
Abbildung 11. Vergleich mit Online-Monitoring
Die Schreiboperation wird nur für die Dauer des Api-Timeout durchgeführt. Diese beträgt in der Standardkonfiguration 60 Sekunden, kann aber durch den Service angepasst werden.

Die Durchführung anderer Schreiboperationen erfolgt analog.