Ich nutze die Modbus-Slave-Funktionalität vom EMS mittlerweile recht intensiv. OpenEMS ist quasi der “Modbus-Chef”, sammelt sämtliche Zählerdaten und stellt sie der Haussteuerung und mittlerweile 5 Siemens Logos zur Verfügung. Problem: nach einem Neustart vom OpenEMS startet die Mobus-Slave-Komponente nicht mehr.
[odbusExt] ERROR [s.common.worker.AbstractWorker] [ctrlModbusExt] Unable to start Modbus/TCP Api on port [503]: Cannot start TCP listener - Die Adresse wird bereits verwendet (Bind failed)
Zuerst dachte ich an offene Sockets auf Port 503. Aber selbst bei gezogenem Netzwerk-Kabel und nach einem Reboot tritt das Problem auf. Eine Änderung des Ports und ein “Komponente aktualisieren” funktioniert nicht. Die anderen Modbus-Master empfangen keine Daten vom OpenEMS-Modbus-Slave.
Ein Hochsetzen der Cycle-Time brachte auch nichts. Es könnte ja sein, dass die Zählerdaten zunächst nicht schnell genug gelesen und verarbeitet werden können.
Einzige Abhilfe: sämtliche (10 Stück) Zähler aus der “Controller Api Modbus/TCP Read-Only”-Komponente löschen, OpenEMS neu starten, alle Zähler wieder einfügen und die Komponente dann aktualisieren.
wir hatten das Problem bei uns kürzlich auch. Die Ursache ist wohl, dass die Bridge öfters activated/deactivated wurde, beim deactivate aber der Server nicht schnell genug gestoppt wurde und dann deshalb beim activate nicht mehr auf dem gleichen Port gestartet werden kann.
Die Lösung ist, dass wir beim deactivate einen sleep einbauen - das hat geholfen:
Kurze Info an euch bei Fenecon @stefan.feilmeier eventuell auch eine Möglichkeit um die Port-Fehler der FEMS bezüglich des USB-Ports zu beheben. Der BB öffnet anscheinend ab und zu einen anderen Port, wenn der EasySync kurz mal weg war. Dann kann natürlich der EasySync nicht mehr auf den gleichen Port, weil der ja im BB noch “open” ist.
Eventuell “einfach” einen Check einfügen bei euch in der Impl, welcher checkt, ob ein Fehler vorliegt, dann schaut ob ein anderer Port vorhanden ist und den dann (wenn bestimme Bedingungen vorliegen) nutzt, um weiterarbeiten zu können
@Sn0w3y: So einfach ist das leider nicht, einfach einen anderen Port zu prüfen. Das Problem lässt sich aber auf Betriebssystemebene lösen, indem man eine UDEV-Rule anlegt, die dafür sorgt, dass ein Gerät immer den gleichen Namen bekommt.
Hier ein Beispiel, um für das Gerät, das aktuell an /dev/ttyUSB0 hängt, immer einen Alias /dev/bus0 zu geben (das dürfte unser 2nd-/3rd-Level-Service auch so machen in diesen Fällen):