Coding Frage, Modbus TCP

Hi in die Runde,

leider konnte ich mit der Suche kein Thema finden, was mir bei einer aktuellen Frage weiterhilft. Gleichzeitig bin ich noch nicht lang genug im OpenEMS Code drin, um das aus meiner Expertise beantworten zu können. Daher freue ich mich über “sachdienliche Hinweise” und euer Schwarmwissen.

Aktuelle Frage zum Modbus Coding: Ist es von der Architektur des OpenEMS her möglich eine Componente zu bauen, deren Modbus Definition z.B. aus einer CSV eingelesen wird? Darüber hinaus interessiert mich auch warum es ggf. keinen Sinn macht sowas zu implementieren.

Anmerkungen: Als langjähriger Java Entwickler würde ich behaupten, dass das aus folgenden Gründen geht.

  • Die ChannelIds sind Enums, die ein Interface implementieren und auf einer String ID aufbauen (=> kann man dynamisch anlegen).
  • Die Modbus Definition mappen im Wesentlichen Modbus Register auf Channel IDs (=> kann man auch dynamisch erzeugen).
  • Die Modbus Bridge liest eh alle Modbus Register eines Geräts ein, dass per IP und Port verbunden worden ist, da man aktuell keinen Offset konfigurieren kann.

Habe ich die OpenEMS Architektur inkl. der zugehörigen Code Module da richtig verstanden?

Danke schon jetzt und viele Grüße.

Hi,

Das habe ich hier bereits mal erläutert:

Wenn du aber natürlich der Meinung bist, dass du das in einer Komponente abbilden kannst und willst, dann darfst du gerne einen PR erstellen - beachte jedoch bitte, dass dann die Register auch die Skalierungen von OpenEMS abbilden sollten. Genau da liegt für viele “"End-User” ja das Problem. Diese kennen OpenEMS nicht und wollen sich (vermutlich) dann auch nicht mit Skalierungen rumärgern, sondern die Adressen eintragen und gut - das funktioniert aber eben aus oben genannten Gründen nicht.

Grüße!

@Sn0w3y Danke für den Hinweis, das hab ich dann wohl überlesen. In dem Thread bin ich auch gewesen.

Was meinst Du mit Skalierung? Die Anzahl der Edges oder die Anzahl der Modbus Bridges?

Ich glaube, er meinte eher ob ein Wert jetzt in mW, W, kW, MW, etc. übertragen wird, ggf. auch der Datentyp (int, float, …).

1 Like

Exakt das - OpenEMS ist da eben umfangreicher, als manch andere Systeme :slight_smile: Dazu muss man allerdings den Code lesen, um das zu wissen :slight_smile:

Guter Punkt, danke für den Hinweis.

Vorschlag: Um die Aufwände besser einschätzen zu können, möchte ich der Community gern kurzfristig ein UML Klassendiagramm und ggf.ein Aktivitätsdiagramm in diesem Thread einstellen. Dann kann man besser Pros und Cons diskutieren und wir können die Hinweise aus der Community in das Konzept einfließen lassen.

Wie steht ihr zu dem Vorschlag?

Mit Code lesen hab ich so überhaupt keine Probleme. Das mit den Einheiten an den Enums ist mir bekannt. Manchmal macht es schon Sinn statt Stichworten wie z.B. “Skalierung” die qualifizierte Bezeichnung zu verwenden. Skalierung kann recht viel sein, ja, es kann sich auch auf Einheiten beziehen.

Ich teile die Anmerkungen von @Sn0w3y; das war bisher immer der Grund, warum wir uns gegen eine “generische Modbus-Implementierung” und für spezifische Implementierungen entschieden haben. Jedes Gerät hat leider seine Tücken - erst recht, wenn es nicht nur eine lesende, sondern auch schreibende Einbindung sein soll. Selbst SunSpec ist nicht so gut und eindeutig, dass das immer klappt.

Am Ende werden bei einer generischen Implementierung immer irgendwo im Internet CSV-Dateien geteilt werden. Dann hätte ich zumindest lieber direkt Code in der Versionskontrolle.

Das heißt natürlich nicht, dass es technisch nicht möglich wäre oder für deinen Use-Case die falsche Lösung wäre. Falls du es machen möchtest, würde ich aber nicht CSV verwenden, sondern eine besser definierte Syntax, z. B. JSON.

1 Like

Danke für die Rückmeldungen. Dann sehe ich das was wir eigentlich vorhatten als so nicht machbar an. Gut das vorher zu wissen.