FHEM als Modbus Slave

Begonnen von SkyFox, 25 Januar 2016, 23:24:22

Vorheriges Thema - Nächstes Thema

ChrisD

#45
Hallo,

Ich habe das Modul geändert so dass es auch unter Windows mit Strawberry Perl funktioniert.

Ob du 99_CommPort benötigst kann ich nicht sagen, eventuell enthält es den Fix für die serielle Schnittstelle unter 64-Bit Perl.

Kannst du mir die Datei schicken, sie befindet sich im FHEM-Verzeichnis.

Grüße,

ChrisD

Edit 24.09.2022: die angehängte Version ist nicht mehr aktuell, bitte von hier herunterladen

Sjae

Hallo,

99_ ist eine Kopie von 99_myUtilys und hatte ich selbst angelegt, das ist mir eingefallen als ich es geöffnet habe um nachzusehen was es macht.

Ich hab die neue Version probiert, aber ich glaube es geht trotzdem nicht, siehe Log???


2019.10.05 17:37:18 0: Server shutdown
2019.10.05 17:37:22 1: registering fhem as Windows Service
2019.10.05 17:37:22 1: starting fhem as a service
2019.10.05 17:37:22 1: Including C:/FHEM/fhem.cfg
2019.10.05 17:37:24 3: WEB: port 8083 opened
2019.10.05 17:37:24 2: eventTypes: loaded 91 events from ./log/eventTypes.txt
2019.10.05 17:37:27 3: CMI: port 502 opened
2019.10.05 17:37:27 1: Including ./log/fhem.save
2019.10.05 17:37:27 3: Opening SDM630 device com4
2019.10.05 17:37:27 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.05 17:37:27 3: SDM630 device opened
2019.10.05 17:37:27 0: Featurelevel: 5.9
2019.10.05 17:37:27 0: Server started with 269 defined entities (fhem.pl:20069/2019-08-27 perl:5.030000 os:MSWin32 user:SYSTEM pid:1580)
2019.10.05 17:37:27 3: FHEMWEB WEB CSRF error: csrf_565145487979007 ne csrf_143286092711894 for client WEB_127.0.0.1_49972 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.
2019.10.05 17:37:27 0: Server shutdown
2019.10.05 17:37:30 1: registering fhem as Windows Service
2019.10.05 17:37:30 1: starting fhem as a service
2019.10.05 17:37:30 1: Including C:/FHEM/fhem.cfg
2019.10.05 17:37:31 3: WEB: port 8083 opened
2019.10.05 17:37:31 2: eventTypes: loaded 91 events from ./log/eventTypes.txt
2019.10.05 17:37:33 3: CMI: port 502 opened
2019.10.05 17:37:33 1: Including ./log/fhem.save
2019.10.05 17:37:33 3: Opening SDM630 device com4
2019.10.05 17:37:33 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.05 17:37:33 3: SDM630 device opened
2019.10.05 17:37:33 0: Featurelevel: 5.9
2019.10.05 17:37:33 0: Server started with 269 defined entities (fhem.pl:20069/2019-08-27 perl:5.030000 os:MSWin32 user:SYSTEM pid:8476)
2019.10.05 17:37:33 3: FHEMWEB WEB CSRF error: csrf_143286092711894 ne csrf_758795323537473 for client WEB_127.0.0.1_49976 / command shutdown restart. For details see the csrfToken FHEMWEB attribute.



es werden auch keine Daten gesendet

VG

ChrisD

Hallo,

Im Log ist keine Meldung die zeigt dass es nicht gehen würde. Steht verbose beim SDM630 noch auf 5 ?

Zitat99_ ist eine Kopie von 99_myUtilys und hatte ich selbst angelegt, das ist mir eingefallen als ich es geöffnet habe um nachzusehen was es macht.

Wieso hast du die seriellen Funktionen (CloseHandle, CreateFile , etc) in 99_myUtils ? Hast du die Datei selbst erstellt ?

Wenn du die x64 Version von Perl verwendest muss die Datei perl\vendor\lib\Win32API\CommPort.pm angepasst werden. Ansonsten funktioniert die serielle Schnittstelle nicht. Details gibt es hier.

Grüße,

ChrisD

Sjae

Fast am Ziel:

verbose steht auf 5...

Ich habe mir aus Verzweiflung alles mögliche kopiert und eingefügt, um irgendwie die Daten zu empfangen, von selber schreiben bin ich tausende Kilometer entfernt.

Zitat
Wenn du die x64 Version von Perl verwendest muss die Datei perl\vendor\lib\Win32API\CommPort.pm angepasst werden. Ansonsten funktioniert die serielle Schnittstelle nicht. Details gibt es hier.

Hatte ich noch nie was davon gehört also gleich überprüft und geändert, hat aber leider nicht sofort geholfen.

In der Annahmme das es mit dem neuen 36_... gehen muss, habe ich alle Datein unter C:\fhem\FHEM...... gelöscht und aus einer frischen Download Version reinkopiert plus 36_ModbusSlave und 36ModbusTCP_CC und siehe da einen "shutdown und neustart" später und nun geht es.

Allerdings sendet es noch das falsche, es müsste  399,1335 (hex 01 04 04 43 C7 91 17 72 63) aus


define SDM630_30053 dummy
attr SDM630_30053 comment MBR:1,52,H,,F
attr SDM630_30053 group SDM630
attr SDM630_30053 room SDM630


senden ;

sendet aber 01 84 02 C2 C1 von keine Ahnung woher. Hier bin ich noch ratlos aber wenigstens klappt die Verbindung erstmal, nochmal vielen dank.

VG
Sven

ChrisD

Hallo,

Die Meldung 01 84 02 ... besagt dass versucht wurde Daten zu lesen die nicht definiert sind. Das kann daran liegen dass es 2 Adressierungsmöglichkeiten gibt:

01 04 00 34 00 02 30 05
ist die Anfrage nach 2 Worten ab Adresse 52 oder Register 53. Die Registernummern (die ModbusSlave verwendet) liegen immer um 1 höher als die Adressen. SDM630_30053 ist über Register 52, also Adresse 51 erreichbar, so dass die obige Anfrage nicht funktioniert. Kannst du den Wechselrichter umparametrieren so dass er die Daten von Adresse 51 liest ?

Grüße,

ChrisD



Sjae

Am Wechselrichter kann ich nicht einstellen.

Ich habe jetzt versucht in FHEM mit der Adresse hoch und runter zu gehen, in der Hoffnung die Richtige zu treffen, aber das hilft nix, nur wenn ich aus H ein I mache ändert sich was bzw. wird was gesendet allerdings nicht das richtige.


MBR:1,53,I,,F --> 01 04 04 80 00 43 C7 A2 E6



MBR:1,52,I,,F --> 01 04 04 00 00 01 8F BB B0


und senden sollte es 01 04 04 "399,1335" + CRC


viele grüße

ChrisD

Hallo,

Der Wechselrichter will Input Register lesen (Code 04), deshalb musst du I oder * verwenden.

Wenn du das Attribut änderst, ändert sich dann auch der Wert des Dummy ?

Kannst du das Attribut auf MBR:1,53,*,,F setzen und ein Log mit verbose 5 von CMI und SDM630 erstellen ?

Grüße,

ChrisD

Sjae

Guten Morgen,


es ist geschafft und es läuft. Nachdem ändern auf "*" kamen die Daten an, zunächst erst noch vertauscht aber das waren dann nur noch 2 klicks, einmal in IP Sycon auf


"Swap LSW/MSW for 32Bit/64Bit values
,

und das "B" in


MBR:1,53,*,,FB


und nun geht es.

Brauchst Du das Log trotzem?

Danke für die Hilfe das hätte ich wahrscheinlich nie alleine geschafft.

Beste Grüße
Sven

ChrisD

Hallo,

Schön dass es funktioniert.

Das Log brauche ich nicht.

Grüße,

ChrisD

bugs

Hallo

Ich bin auf der Suche einer Lösung für eine Kommunikation zwischen digitalSTROM (dSS20) und Codesys welches als Runtime auf einem Raspberry PI 3 B+ läuft. Meine Idee ist FHEM, auf dem Raspi installiert, als Gateway zu nutzen. Die Kommunikation zwischen digitalSTROM und FHEM habe ich mit Hilfe einer detaillierten Anleitung zum Laufen gebracht. (https://wiki.fhem.de/wiki/DigitalSTROM_einbinden)
FHEM kenne ich leider nur rudimentär und schaffe es nicht eine Verbindung zu Codesys via Modbus-TCP aufzubauen. Das Modul ,36_ModbusTCP_CC.pm ' konnte ich installieren komme nun aber nicht weiter, mir fehlen einfach die Kenntnisse.
Hilfreich wäre eine ähnlich ausführliche Anleitung wie die Projektierung FHEM-digitalSTROM im wiki.fhem. Vielleicht gibt es jemand der mir weiterhelfen kann, ich verstehe aber auch wenn mein Wunsch zu viel verlangt und sich deshalb niemand die Arbeit macht.
Ich bin auch daran FHEM besser zu verstehen was leider nicht ganz einfach ist und viel Zeit beansprucht, zu FHEM findet man im Web viele unterschiedliche und teils auch widersprüchliche Angaben.
Noch eine Zusatzfrage, wie bringe ich FHEM dazu dass der Port 502 deklariert werden kann, die Massnahme in Antwort #4 funktioniert bei mir leider nicht.

Beste Grüsse aus der Zentralschweiz
Heinz

ChrisD

Hallo,

Kannst du etwas genauer beschreiben welche Informationen du weitergeben möchtest ? Auf Basis des Wiki könnte die Definition eventuell so aussehen:
attr dSM_0000131e comment MBR:1,1,I,Consumption,F

In den Beiträgen 2 und 7 sowie in der CommandRef ist die Funktion des Modules beschrieben, welche Informationen fehlen dir ?

ZitatNoch eine Zusatzfrage, wie bringe ich FHEM dazu dass der Port 502 deklariert werden kann, die Massnahme in Antwort #4 funktioniert bei mir leider nicht.

Was funktioniert nicht ?
Gibt es eine Fehlermeldung ?
Es kann sein dass die CoDeSys-Runtime Port 502 blockiert, in dem Fall musst du einen anderen Port verwenden.

Grüße,

ChrisD

bugs

Hallo Chris
Danke für deine Unterstützung, bitte entschuldige die späte Reaktion meinerseits.

Grundsätzlich möchte ich Messwerte wie z.B. den aktuellen Stromverbrauch von digitalSTROM via FHEM zu Codesys übertragen aber auch Ereignisse der Schaltuhr von digitalSTROM zu Codesys senden. Umgekehrt sollten Ereignisse von Codesys, z.B. Steuerbefehle Umwälzpumpe Fussbodenheizung ein-aus, über FHEM zu digitalSTROM gesendet werden.

Dein Code-Vorschlag werde ich testen und schauen ob ich von FHEM zu Codesys eine Kommunikation aufbauen kann.
Mir fehlen einfach die Kenntnisse um FHEM korrekt zu projektieren, zu kontrollieren und zu testen.

Beim Einbinden ,define mbcc ModbusTCP_CC' kommt die folgende Fehlermeldung
.mbcc: Can't open server port at 502: Permission denied', mit dem Port 10502 kommt jedoch keine Fehlermeldung. Der Port 502 wird auf der Codesys-Seite benutzt für eine Kommunikation über Modbus-TCP mit einem PV-Wechselrichter (Solaredge).

Es scheint jedoch, dass der Port trotzdem korrekt ist im FHEM, unter Internals DeviceName steht hinter der IP-Adresse ....:502.

Schöne Grüsse aus der Zentralschweiz
Heinz

ChrisD

Hallo,

ZitatCan't open server port at 502: Permission denied'
kommt wahrscheinlich daher dass der Benutzer unter dem FHEM läuft keine Root-Rechte hat. Entweder musst du auf einen Port >1024 ausweichen oder FHEM den Zugriff auf Port 502 erlauben. Dazu gibt es eine Reihe von Möglichkeiten, die vom eingesetzten Betriebssystem abhängen, für Linux z.B. nach 'linux privileged ports' suchen.

ZitatEs scheint jedoch, dass der Port trotzdem korrekt ist im FHEM, unter Internals DeviceName steht hinter der IP-Adresse ....:502.
FHEM zeigt den konfigurierten Port an, ob dieser geöffnet werden konnte wird an der Stelle nicht angezeigt.

ZitatDer Port 502 wird auf der Codesys-Seite benutzt für eine Kommunikation über Modbus-TCP
Wenn Codesys Port 502 belegt musst du einen anderen verwenden. Da du den Port in Codesys für jeden ModbusTCP-Slave getrennt einstellen kannst sollte das kein Problem sein.

Grüsse,

ChrisD

bugs

Hallo Chris
Danke für deine Hinweise und Tipps.

Den Port änderte ich auf beiden Seiten auf 1502 eine Verbindung kommt jedoch nicht zustande.
Ich versuchte ziemlich viel, leider alles ohne Erfolg, mir fehlt einfach das notwendige FHEM-Wissen für die Projektierung der Modbus-Kommunikation. Aufgeben werde ich trotzdem noch nicht, die Hoffnung stirbt bekanntlich zuletzt.

Grüsse und einen guten Rutsch ins neue Jahr
Heinz

Guzzi-Charlie

Hallo Chris,

das Thema ist zwar schon über ein Jahr alt, aber ich hoffe die Frage erreicht Dich trotzdem.

Ich habe ein spezielles Problem. Ich betreibe mehrere PV-Anlagen und jetzt kommt noch eine Weitere (incl. Batteriespeicher) hinzu. Dafür installiere ich auch das Fenecon Energy Management System (FEMS). Dieses steuert dann die Energieflüsse aller Wechselrichter und der ebenfalls hinzukommenden Batterieanlage. Dafür muß pro PV-Anlage ein Energiezähler installiert werden. Alles zusammen wird mit FEMS per Modbus RTU (RS485) verbunden (siehe anhängendes Schema).

Das Problem ist nun das in FEMS zur Zeit nur bestimmte Zähler implementiert sind und genau diese entweder nicht zu bekommen sind oder absolut überteuert sind. Das betrifft die zusätzlichen Zähler (in meinem Beispiel die Zähler 1+2). Ich habe mir nun überlegt ob ich nicht als Ersatz ein anderes Fabrikat nehmen könnte, die Daten dann mit FHEM abfragen, dort die Register quasi "ummappen" und dann FHEM als Slave an den vorgesehenen Modbus hänge und damit dem FEMS praktisch andere Zähler vorspiegelt werden. Die Registerbelegungen der (in FEMS) implementierten Zähler als auch die der Ersatztypen habe ich natürlich.

Wäre dieses Konstrukt problemlos umzusetzen oder hälst Du das für nicht, bzw. nur mit unverhältnismäßigem Aufwand machbar?
- RaspPI 4+: (Cuno V2 -2x KS300, JeeLink -13x EC3000)
- Stromzähler (B+G E-Tech): 6x SDM120M, 9x XTM100A, 38x DRS110M
- LAN: IT LAN-Gateway mit 34x RMF-R1 (Rohrmotor24)
- WLAN: 85x Shelly, 12x Gosund SP111, 16x D1-Mini, 15x Sonoff Basic
- DECT: 6x DECT200, 8x DECT301, - HmIP: 3x FalmotC12, 16x WTH2