NEWS
Proxy für Objekte des Modbus-Adapters
-
Hallo Forum,
ich bin neu hier und habe mich gerade im Forum für diese Frage angemeldet. Ich beobachte und teste ioBroker schon seit ca 1,5 Jahren und möchte nach ein paar Fixes am Modbus-Adapter vor einiger Zeit ggf. noch etwas zur Funktionalität beitragen.
Bisher habe ich nur ein kleine Konfiguration zum Testen erstellt. Die meisten Geräte hängen bei meinem Aufbau an Wago 750 SPS sowie an KNX. Für die Anbindung der SPS nutze ich Modbus. Für den ioBroker.Modbus-Adapter habe ich einen Konverter geschrieben, der die Definitionen aus der Codesys-Speicherlayoutdatei (Codesys ist die Programmierumgebung der SPS) in eine CSV-Datei umwandelt, die dann im Modbus-Adapter importiert werden kann. Damit stehen im ioBroker für Lesen und Schreiben sofort Objekte bereit, die im Codesys als Variablen im Modbus-Speicherbereich liegen. Auch verschachtelte Strukturen und Arrays werden entsprechend abgebildet. Ich werde diesen Konverter demnächst auf GitHub veröffentlichen.
Ich habe nun das Problem, dass auf der SPS der Modbus-Server immer läuft, auch wenn die Anwendung auf der SPS nicht gestartet ist. Beispielsweise, wenn ein neues Programm geladen wird, dass nicht per online-change aktualisiert werden kann. In diesem Fall liefert der Modbus-Server der SPS einen mit 0 initialisierten Speicherbereich aus. Wenn ich beispielsweise Temperaturfühler darüber im ioBroker auslese führt das in der Aufzeichnung zu dem Wert 0 während das Programm nicht läuft, obwohl dieser natürlich kein richtiger Messwert war.
Ich würde nun gerne den Modbus-Adapter so lassen wie er ist und eine Art Proxy-Adapter nachschalten, der z.B. ein Flag prüft, ob die Anwendung läuft und eine Versionierung der Datenstruktur kennt, und erst dann die über Modbus gelesenen Objekte an einen gespiegelten Satz Objekte weitergibt. Eine Lösung mit einem händisch gepflegten Javascript kommt nicht in Frage, da zu es zu viele Objekte sind und die Fehleranfäligkeit zu hoch ist.
Ich will also dafür einen Adapter bauen, der die Objekte eines anderen Adapters (in dem Fall Modbus) ausliest, bewertet, und anschließend an einen gespiegelten Satz Objekte weiterreicht. Ich habe die Alias Objekte gesehen, die schon sehr richtig dafür aussehen, jedoch habe ich keine Option zum Aktivieren und Deaktivieren der Getter und Setter gefunden.Ich würde mich freuen, wenn ihr mir einen Tipp geben könnt, auf welche Weise das am besten ioBroker-konform umzusetzen ist. Ich kann mir vorstellen, dass eine solche Funktion auch noch an anderen Stellen nützliche sein könnte.
Ich bin beruflicher Softwareentwickler im C, C++ Umfeld unter Linux, hatte bisher nicht viel Berührung mit Javascript, sehe darin aber kein Problem. Ich bin also auch für einen komplexen Vorschlag zu haben.
Viele Grüße und Hallo an alle hier im Forum
Benny -
@prog42 sagte:
Ich habe die Alias Objekte gesehen, die schon sehr richtig dafür aussehen, jedoch habe ich keine Option zum Aktivieren und Deaktivieren der Getter und Setter gefunden.
Diese Option gibt es auch nicht.
@prog42 sagte in Proxy für Objekte des Modbus-Adapters:
Eine Lösung mit einem händisch gepflegten Javascript kommt nicht in Frage, da zu es zu viele Objekte sind und die Fehleranfäligkeit zu hoch ist.
Man kann mit dem $Selector alle Modbus-Datenpunkte erfassen. Ist die Eigenschaft common.read im Modbus-Adapter korrekt gesetzt ? Dann kann man die zu lesenden Datenpunkte zum Spiegeln auf eigene Datenpunkte filtern.
-
@paul53 said in Proxy für Objekte des Modbus-Adapters:
Man kann mit dem $Selector alle Modbus-Datenpunkte erfassen. Ist die Eigenschaft common.read im Modbus-Adapter korrekt gesetzt ? Dann kann man die zu lesenden Datenpunkte zum Spiegeln auf eigene Datenpunkte filtern.
Der $Selector sieht sehr gut aus. Dann scheint sich dass ja wirklich sehr einfach als Script umsetzen zu lassen. Vielen Dank für den Tipp!
common.read wird bei mir vom Modbus-Adapter für holdingRegisters und inputRegisters auf true gesetzt. Das ist korrekt.