Unter-Zähler über Modbus verfügbar machen

Hallo Forum,

Ich habe diverse Modbus-Zähler in OpenEMS integriert. Alle liefern brav ihre Werte, usw.
Das Problem ist möglicherweise das verbaute Modbus-Gateway. Dieses steigt nach Laufzeit (1,2 Tage - manchmal Wochen) aus und muss resettet werden.

Die Zähler werden teilweise auch noch von anderen Komponenten abgefragt. Hier kommt es dann möglicherweise zu Problemen.

Ich möchte Folgendes errreichen: OpenEMS fragt als einziges System die Zähler ab und stellt diese Daten allen anderen Systemen per Modbus zur Verfügung. Mit den Core.Sum-Kanälen setze ich das bereits um. Aber wie ist es möglich, dass OpenEMS auch die Zählerdaten von anderen Channels per Modbus verfügbar macht und wie komme ich an die entsprechenden Register?

Gruß,
Klinki

Hallo Klinki,

angenommen für jeden der von dir ausgelesenen Zähler existiert eine ‘meter’-Komponente, z.B. meter0, meter1, .., meterX.
Dann könntest du einen “Controller Api Modbus/TCP Read-Only” aktivieren. Dort kann man bei den Komponenten IDs jeden einzelnen der oben angegebenen Meter hinzufügen (über das “+” bei Component IDs). Der Modbus Server bietet dann die angegebenen Komponenten zum Auslesen an.

Wie genau die Belegung der Modbus-Tabelle ist, kann man dann direkt als Excel-Protokollspezifikation herunterladen: Menü → Einstellungen → Anlagenprofil → Runterscrollen zu “Externe Schnittstellen” → den DropDown-Pfeil ganz links anklicken → dann das Protokoll herunterladen (siehe Screenshot)

Jede Komponente, die das ModbusSlave Interface erfüllt, kann über diesen Mechanismus ausgelesen werden. Ein Beispiel findest du hier.
Ich bin nicht sicher ob schon alle OpenEMS-Zähler das Modbus-Slave Interface erfüllen. Die von dir verwendeten Zähler müssten also vorab geprüft und evtl. erweitert werden.
VG Christian

Hallo Christian,

Die entsprechenden Zähler mit ihren IDs hatte ich der Modbus-Bridge schon beigebracht. Es scheint so, als wenn die SDM630 noch erweitert werden müssten.

Ich versuche mal mein Glück…

Danke Dir für den Hinweis!

Gruß,
Klinki

Hallo,

Christian hat das genau richtig beschrieben. Damit das funktioniert ist es allerdings notwendig, dass die Komponente das Interface ModbusSlave implementiert. Mit den nächsten FEMS-Backports gibt es in dem Fall ansonsten in Zukunft eine Warnmeldung im Log.

Leider ist das bei dem SDM630-Zähler aktuell noch nicht umgesetzt. Hier ein Beispiel aus der SOCOMEC-Komponente:

Gruß,
Stefan

Hi Stefan,

Genau so habe ich das mittlerweile auch beim SDM630 umgesetzt. Die IDs tauchen im Export nicht auf. Der Debugger reagiert auch nicht auf den Haltepunkt (in Deinem Auszug Zeile 424). Das Interface habe ich entsprechend erweitert:

...
public interface MeterMicrocareSdm630 extends SymmetricMeter, AsymmetricMeter, OpenemsComponent, ModbusSlave  {
...

Gruß,
klinki

Hallo Klinki,

es reicht für OSGi nicht, dass das Interface ModbusSlave implementiert, sondern die eigentliche Komponente muss ModbusSlave implementieren.

Ich dachte, das hätte ich getan in dem ich die Zeilen aus Deinem vorherigen Post eingefügt habe…

Nachtrag: Habe für einen Test mal ein UMG604 angelegt und die ID im Modbus-Server angegeben. In der Excel-Datei steht auch dieser nicht. Hm…
Meine Version ist die 2022.8.2

Gruß,
Klinki

Jetzt funktioniert es!

Es fehlte noch die ModbusSlave-Komponente bei der Klassen-Definition:

public class MeterMicrocareSdm630Impl extends AbstractOpenemsModbusComponent
		implements MeterMicrocareSdm630, AsymmetricMeter, SymmetricMeter, ModbusComponent, OpenemsComponent, ModbusSlave {

Schönes Wochenende,
Klinki

Nachtrag: Ich habe Pull-Requests erstellt. Dabei noch einen Fehler korrigiert: bei Active Energy waren Consumption und Production vertauscht

Zur Info für die, die hier mitgelesen haben. Die Verbesserung von Klinki wurde mit diesem Pull-Request in OpenEMS übernommen:

…und ist im Release 2022.11.0 enthalten: