FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: SkyFox am 25 Januar 2016, 23:24:22

Titel: FHEM als Modbus Slave
Beitrag von: SkyFox am 25 Januar 2016, 23:24:22
Hallo,

ich mochte gern das FHEM als Modbus-Slave fungiert und dabei die GPIO (Raspberry) + einige Werte von FHEM auf bestimmte Register legen. Diese würde ich dann von extern auslesen.
Gibt es eine Möglichkeit dazu?

Danke im Voraus.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: SkyFox am 27 Januar 2016, 23:06:22
keiner der eine Antwort kennt?
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 07 Februar 2016, 20:51:24
Hallo,

Anbei findest du ein Modul das ich vor langer Zeit für diesen Zweck geschrieben hatte (nur Lesezugriffe). Ich habe es an FHEM 5.7 angepasst und die Möglichkeit zum Schreiben hinzugefügt.

Das Modul wird mit
define mbcc ModbusTCP_CCeingebunden. Da für ModbusTCP Port 502 verwendet wird muss FHEM root/Administratorrechte haben. Falls dies nicht möglich (oder erwünscht) ist kann ein anderer Port (>1024) mit angegeben werden:
define mbcc ModbusTCP_CC 10502 Der Master muss dann auch dementsprechend angepasst werden.

Die Verbindung von FHEM-Readings zu Modbus-Registern erfolgt über das Kommentarfeld des jeweiligen Gerätes. Für einen Homematic Thermostat (HM-TC-CC) mit dem Namen th könnte es z.B. so aussehen:
attr th comment MBR:1,1,I,measured-temp,N,10:1,2,I,humidity:1,21,H,desired-temp,N,10Das Reading measured-temp ist unter UnitId 1, Inputregister 1 erreichbar, humidity unter UnitId 1, Inputregister 2 und desired-temp unter UnitId 1, Holdingregister 21. Die Werte von measured-temp und desired-temp werden beim Lesen mit 10 multipliziert (und beim Schreiben durch 10 geteilt), negative Werte werden im 2er-Komplement dargestellt.

Das Format für das Kommentarfeld ist:
MBR:<unitId>,<register>,<register type>[,<reading>[,<negative representation>[,<multiplier>[,<offset>]]]]mit
    <unitId> - Unit Id (0 - 255), * für beliebig
    <register> - Registernummer (1 - 65536) (Achtung, dies ist nicht die Adresse)
    <register type> - I für Inputregister (nur Lesen), H für Holdingregister (Lesen und Schreiben), * für beide
    <reading> - optional, Name des Readings, wenn nicht angegeben wird 'state' verwendet
    <negative representation> - optional, T for 2er Komplement, bei jedem anderen Wert werden negative Zahlen auf 0 gesetzt
    <multiplier> - optional, Multiplikator, angewandt beim Lesen, beim Schreiben als Divisor verwendet
    <offset> - optional, Offset der beim Lesen zum Reading addiert wird, beim Schreiben wird er abgezogen

Grüße,

ChrisD

Edit: Die aktuelle Version des Moduls kann mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txtdirekt in FHEM installiert werden.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 23 Dezember 2016, 20:11:10
Danke Chris für deine Module.
Ich suche auch ein Module wo den FHEM Daten über Modbus TCP Adresse (holdiing registers) lese und schriebbar sind.
So kann ich zb. mit ein standard HMI panel (WinCCFlex/Vijeo/...) über modbus TCP ein HMI machen die FHEM data visualisiert.

Ist die Module in diese Thread die letzte versione ? Oder gibt es da schon ein neuere ?

Werde diese Module mal ausprobieren.
edit: habe es mal installiert und es funzt super !

Nur integers sind moglich ? Floating values are not possible to map to 4 registers as real format ?
Einige losing wird dann floating x 10 oder x100 zu machen um nicht die zahlen hinten komma zu verlieren.

Habe auch gemerkt wenn ich mein yahoo wetter FHEM Module kein internet findet es delays verursacht und die modbus comm timeouts kriegt.

Wie mapst du zb. swiches : on:off auf die Holding registers ? Hätte mein type von on:off zum 1:0 geändert und dann könnte ich mein swiches ändern über Modbus.
Aber dan geht mein HomeKit/bridge nicht mehr, muss on:off type sein für HomeKit.

Ist da noch Weiterentwicklung in deine Plugin ? zb.:
- neben die registers auch die coil binair FC's. (lesen und schreiben)
- real floating support wie bei SPS: %MF...... (mapping real/float value auf mehere registers)
- binaire bit mapping auf die holding registers. Zb. on:off state auf bit 0 von register x
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 27 Dezember 2016, 09:15:01
noch eine kleine Frage: wie gebe ich den FHEM user auch root Rechte so das ich port 502 benuzte kann ?

edit: gefunden: Um Fhem als root laufen lassen zu können, kann es notwendig sein, den Benutzer fhem in der Datei /etc/passwd auszumarkieren oder mittels deleteuser zu löschen. Fhem schaltet in den Benutzerkontext fhem um, wenn es diesen Benutzer beim Start findet.

einfach ; für den fhem user in /etc/passwd setzen funzt.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 27 Dezember 2016, 20:35:01
Hallo,

Zitat
Ist die Module in diese Thread die letzte versione ? Oder gibt es da schon ein neuere ?

Das Modul entspricht noch dem aktuellen Stand. Dieser befindet sich auf GitHub und kann mit dem Befehl
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txtdirekt in FHEM installiert werden.

Zitat
Nur integers sind moglich ? Floating values are not possible to map to 4 registers as real format ?
Ja, im Moment sind nur Integer möglich da ich für meine Zwecke nicht mehr brauche. Ich kann aber Unterstützung für IEEE 754 Single Precision-Zahlen über 2 Register hinzufügen.

Zitat
Habe auch gemerkt wenn ich mein yahoo wetter FHEM Module kein internet findet es delays verursacht und die modbus comm timeouts kriegt.
Das kann passieren wenn ein Modul FHEM zu lange blockiert. Es gibt zwar verschiedene Möglichkeiten dies zum Teil zu umgehen, ich weiß aber nicht wie das Yahoo-Modul aufgebaut ist.

Zitat
Wie mapst du zb. swiches : on:off auf die Holding registers ?
Dazu muss ich das Modul erweitern, im Moment ist nur begrenzt lesen über userReadings möglich.

Zitat
Ist da noch Weiterentwicklung in deine Plugin ?
Ich sehe mir die nächsten Tage mal an was ich machen kann.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 29 Dezember 2016, 11:26:37
OK, Danke Chris für den autoupdate Befehl.

 Unterstützung für IEEE 754 Single Precision-Zahlen über 2 Register (4 bytes) wäre nett sein.
Ich habe zb. ein Lichtsensor (mit module FHEM BH1750) die oder 4000 Lux oder 12.4 Lux gebt auf die readings.
Feste x10 nach integer geht dan nicht vielleicht.

Den Yahoo Wetter plugin hat kein Internet comm im Moment da effectiv mein Rpi FHEM kein Internet temp. hat.
Aber die Timeouts sind jetzt wieder OK, da ich die "Disable" attribute von Yahoo Wetter Pluging gesetzt habe.

Das Erweitern von das Modul für binaire (zb. switch: on:off) auf bits von Holding registers oder einfach integer Werte 1/0 auf ein Holding register (lesen und schreiben) finde ich eine schöneres Erweiterung dann den floating point. Das floating point ist leicht zu umgehen mit x 10 multiplicazion.
Aber vielleicht ist die floating point schon fertig (copy paste von Code in deine andere Modbus modules (fhem als Modbus master)

Andere FC's für Coils braucht man eingentlich nicht. Nür lese und schreibe von Holding registers (4xxxx). Aber mit Möglichheit float und binair (true/false) zu mappen. Vielleicht mus ich mal suchen nach ein FHEM commando die das ein on:off odere andere binaire reading Tekste umsetzt in 1:0 so das es zu mappen ist auf Modbus registers. Aber da braucht man wieder FHEM dummy's. Und ist nur lesen möglich.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 31 Dezember 2016, 18:25:20
Hallo,

Ich habe das Modul erweitert. Du kannst jetzt Float und Bits in Registern verwenden.

Floats kannst du z.B. mit
attr th comment MBR:1,21,H,desired-temp,Fdefinieren. 'F' legt fest dass die Zahl im Little-Endian Format übertragen wird. Wenn bei der Gegenstelle Unsinn herauskommt kannst du es mit 'FB' versuchen, dann wird die Zahl im Bit-Endian Format übertragen.

Bits kannst du mit
attr licht comment MBR:1,41,H,,B5definieren. Auf den Zustand von 'licht' kann über Bit 5 von Register 41 zugegriffen werden. Dabei wird automatisch 'on' nach 1 und 'off' nach 0 konvertiert. Falls du andere Bezeichner benötigst kannst du die mit angeben:
attr rollo comment MBR:1,41,H,,B11,zu,auf'zu' wird nach 0 und 'auf' nach 1 umgewandelt.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 03 Januar 2017, 18:55:08
Chris,

Vielen Dank für die Erweiterung von deine Modbus Slave Module.  ;)
Funzt einwandfrei. Auch die mapping von mehrere Booleans (verschiedene bitnr) auf das gleiche Modbus holding Register.
Die floating Werte kommt auch gut an.
Und alle lesen und schreiben :-) Super !  :D

Jetzt kann man Fhem wirklich gut anschliessen an zb. Scada/HMI Systeme.

Monty 8)
Titel: Antw:FHEM als Modbus Slave
Beitrag von: franzlimholz am 05 Februar 2017, 19:42:41
Hallo,

das Modul 36_ModbusTCP_CC.pm habe ich installiert und mit einem ModbusTCP-Client getestet.
Das Lesen eines Holdingregisters des Servers (Functioncode 3) funktioniert problemlos , aber das Schreiben auf den Slave (Functioncode 6) funktioniert nicht. Das Reading zeigt immer den Wert 0, obwohl ein Event erzeugt wird. Das sieht man im Event-Monitor und auch am "Zeitstempel" des Readings.
Im Client wird der korrekte Datenverkehr angezeigt.

Wer kann mir hier weiterhelfen?

Danke im Voraus

franzlimholz
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Februar 2017, 22:26:49
Hallo,

Wie sieht die Definition in FHEM aus ?

Was steht genau im Event-Monitor ?

Edit: Der Fehler sollte behoben sein, bitte aktualisiere das Modul.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: franzlimholz am 06 Februar 2017, 21:45:54
Viel Dank ChrisD,

es funktioniert jetzt.
Von github musste ich allerdings das repository als ZIP-File herunterladen und dann die Datei in das Verzeichnis ../fhem/FHEM kopieren.
Beim Update über FHEM kam die Meldung
2017.02.06 19:24:07 1 : UPD FHEM/36_ModbusTCP_CC.pm
2017.02.06 19:24:07 1 : Got 20865 bytes for FHEM/36_ModbusTCP_CC.pm, expected 20841
2017.02.06 19:24:07 1 : aborting.

Gruß
franzlimholz
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 06 Februar 2017, 22:47:01
Danke, habe ich korrigiert
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Ichirou am 26 Mai 2017, 15:33:02
Hallo ChrisD,

ein sehr schönes Plugin, vielen Dank :)
Ich möchte einzelne Schalter bzw. Aktoren steuern, derzeit als dummy-devices drin.
Wie kann ich Coils in dem slave lesen und schreiben?

Ichirou
Titel: Antw:FHEM als Modbus Slave
Beitrag von: KernSani am 26 Mai 2017, 18:24:21
@ChrisD: Was dagegen, wenn ich den Thread nach "Codeschnipsel" verschiebe?
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 27 Mai 2017, 12:01:04
Hallo,

@KerniSani: Kein Problem meinerseits.

@Ichirou: Das Modul bietet nur die Möglichkeit auf Registerebene zuzugreifen. Du kannst aber auf binäre Zustande über einzelne Bits in den Registern zugreifen.

Wenn du von einem externen ModbusTCP-Client auf einen Aktor in FHEM zugreifen willst musst du zuerst das Modul wie in Beitrag 3 beschrieben installieren und einbinden. Anschließend kannst du z.B. mit
attr aktor comment MBR:1,1,H,,B0festlegen dass aktor unter der Registeradresse 1, Bit 0 ansprechbar ist.

Welchen ModbusTCP-Client verwendest du ?

Grüße,

ChrisD

Titel: Antw:FHEM als Modbus Slave
Beitrag von: Ichirou am 27 Mai 2017, 12:26:23
Hi,

ich hab derzeit noch GSI Modbus App aufm tablet, es wird ein Eaton HMI älteren Baujahres werden.

Das mit den Registeradressen funktioniert gut, ich wollte es der Einfachheit wegen aber gerne über Coils regeln, da ich viele Einzelzustände habe und die Register dafür mißbrauchen eigentlich nicht Sinn und Zweck der Sache ist.

Technisch muss ich dann sehen, wie ich das auf dem Panel umsetze. Es soll die werte dann an eine PLC weiter reichen und das Gateway Modbus-MPI spielen.

Ggf. ist es nur eine kleine Anpassung für I und H noch ein C für Coil einzubauen, dann wäre dein Modul unschlagbar :)
Es funktioniert jetzt schon fast perfekt, einzig die Übertragung eines Baro-Sensor ist auf 5 Ziffern begrenzt, das muss ich noch fixen. Multiplikator 10 geht (5 Stellen), bei 100 (6 Stellen) kommt nur noch 0.

Sonst lesen und schreiben top :)

Daniel

Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 27 Mai 2017, 17:04:59
Hallo,

Ich habe versucht das Modul so zu erweitern dass auch Coils direkt gelesen und geschrieben werden können, die Syntax ist ähnlich wie bei den Registern:

MBC:<unitId>,<coil>,<type>[,<reading>[,<off>[,<on>]]mit
    <unitId> - Unit Id (0 - 255), * für beliebig
    <coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)
    <type> - I für Input (nur Lesen), C für Coil (Lesen und Schreiben), * für beide
    <reading> - optional, Name des Readings, wenn nicht angegeben wird 'state' verwendet
    <off> - optional, alternativer Wert für 'off', z.B. 'auf' bei Jalousie
    <on> - optional, alternativer Wert für 'on', z.B. 'zu' bei Jalousie

Damit kann der Aktor z.B. durch setzen von
attr aktor comment MBC:1,10,Cüber Coil 10 ausgelesen und gesteuert werden.

Du kannst das Modul mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txtaktualisieren. Danach muss FHEM neu gestartet werden.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Ichirou am 29 Mai 2017, 00:04:55
Hallo ChrisD,

nach etwas rumprobieren, einigen Anwenderfehlern (shutdown restart vergessen, MBR nicht auf MBC geändert) und etwas ärger mit der App funktioniert es tadellos :)

Als Hinweis für andere:
Modbus kann mit einem Adressoffset arbeiten, in dem Beispiel von Chris: MBC:1,10,C habe ich Reaktion auf Coil 9.
Je nachdem wo die Anwendung anfängt zu zählen, sind die Coils und Register möglicherweise um -1 verschoben.

Danke ChrisD, vor allem für die superschnelle Umsetzung.  :)
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 29 Mai 2017, 09:02:57
Hallo,

Bei Modbus wird (leider) zwischen Coils/Registern und ihren Adressen unterschieden. Die Adressen liegen dabei immer 1 unter der Coil/Registernummer. Oft ist aber nicht klar ob ein Hersteller unter dem Begriff Register/Coil eigentlich die Adresse meint. Deshalb habe ich in der Dokumentation geschrieben
Zitat
<coil> - Coilnummer (1 - 65536) (Achtung, dies ist nicht die Adresse)

Zum Teil findet man auch in der Dokumentation Register wie 40108 die unter der Adresse 107 anzusprechen sind. Hierbei wird der FC (4 für Eingangsregister lesen) vor die Registernummer gesetzt.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: rammelsberg am 14 Januar 2018, 02:15:14
Moin!

Ich habe das Ganze mit einem Codesys V3 auf einem Raspberry als Master getestet, lesen von der SPS aus mit FC 4 funktioniert, schreiben mit FC 6 leider nicht, ist ähnlich dem was franzlimholz weiter oben geschrieben hatte: im Event Monitor taucht das zyklische Schreiben (1x pro sekunde) auf, allerdings immer mit dem Wert 0, ich schreibe aber 255 rein, es sollten 25,5 ankommen.
"2018-01-14 02:11:58 MAX MAX_0682e1 desiredTemperature 0"
Definition am Aktor: MBR:1,1,I,temperature,N,10:1,21,*,desiredTemperature,N,10

Fällt Euch da direkt was auf?
Danke und viele Grüße...

Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 14 Januar 2018, 11:23:51
Hallo,

Ich habe das Modul geändert, so dass das Schreiben in deinem Fall auch funktionieren sollte. In der Version 0007 werden unbekannte Format-Bezeichner (in deinem Fall 'N') ignoriert.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: rammelsberg am 16 Januar 2018, 10:25:19
Hallo ChrisD,

Das hat auf Anhieb geklappt, vielen Dank!  :D
Grüße...
Titel: Antw:FHEM als Modbus Slave
Beitrag von: lechez am 22 Februar 2018, 09:29:19
Hallo Chris,

ich möchte gerne dass fhem als Modbus Slave über rs485 läuft, kann man kein Modul Slave auf von TCP auf RS485 rtu irgendwie umbauen?

Gruß

lechez
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 23 Februar 2018, 00:32:11
Hallo,

Die Anpassungen für den Betrieb als Modbus Slave sind nicht all zu groß. Ich sehe mir das am Wochenende an.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 24 Februar 2018, 17:25:34
Hallo,

Anbei eine erste Version für Modbus RTU. Das Gerät kann z.B. mit
define mbslave ModbusSlave /dev/ttyS0angelegt werden. Die Schnittstelle wird dann mit 9600,8,E,1 geöffnet.

Optional können auch die Parameter für die Schnittstelle mit übergeben werden, z.B.:
define mbslave ModbusSlave /dev/ttyS0@19200,8,N,1
Unter Windows mit Strawberry Perl lautet die Syntax:
define mbslave ModbusSlave COM1@19200,8,N,1
Bei Problemen mit der Datenübertragung kann verbose auf 5 gesetzt werden damit die ein- und ausgehenden Pakete aufgezeichnet werden.

Die Zuordnung von Coils/Registern erfolgt wie beim Modul ModbusTCP_CC über die Kommentarfelder.

Grüße,

ChrisD

Edit 06.10.2019: Version 0002 mit Anpassungen für Windows

Edit 24.09.2022: die angehängte Version ist nicht mehr aktuell, bitte von hier (https://github.com/ChrisD70/FHEM-Modules/blob/master/36_ModbusSlave.pm) herunterladen
Titel: Antw:FHEM als Modbus Slave
Beitrag von: lechez am 26 Februar 2018, 10:57:43
Cool vielen Dank!
Werde hoffe ich heute noch ausprobieren können.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 23 November 2018, 14:39:16
Hallo Chris,

Zunächst einmal vielen Dank für die hervorragenden Modbus Master & Slave FHEM-Module.
Ich habe eine Frage zum Schreiben von separaten Bits in Holding-Register (4xxxxx).

Mein SCADA-System (Industrial HMI) scheint ein separates Bit an FHEM (als Modbus-Slave) zu schreiben.

Lesen ist kein Problem. Der SCADA Modbus IO-Treiber kann ein separates Bit aus einem Halteregister lesen.

Das Schreiben eines separaten Bits in ein Halteregister funktioniert jedoch nicht.

Ich vermute, der SCADA IO-Treiber verwendet Modbus FC22 (16 Hex). (Maskenschreibregister).
Ich glaube, das Modbus-Slave-Modul unterstützt dies nicht? Richtig?

FHEM als Modbus-Master unterstützt auch FC22 nicht? (zB wenn FHEM mit einer Slave-Modbus-SPS verbunden ist).
Kann der FC22 auch für beide Master als Slave-Module unterstützt werden?

Andere Lösung ist, dass ich für Ex verwendet habe. Kepware OPC-Server, der auswählen kann, ob Sie FC22 verwenden oder nicht.
Wenn der FC22 nicht verwendet wird, liest der OPC-Server den Wert schnell, bevor er mit den "geänderten" Bits maskiert wird, bevor er zum Modbus-Slave zurückgeschaltet wird.

Eine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Danke im Voraus,

Monty :-)

Or english:


Hi Chris,

First of all thanks already for the excellent Modbus Master & Slave FHEM Modules.
I have a question about writing seperate bits into Holding registers (4xxxxx). My SCADA system (industrial HMI) can seem to write a seperate bit to FHEM (as modbus slave).
Reading is no problem. SCADA Modbus IO driver can read a seperate bit from a holding register. But writing a seperate bit into a holding register does not work.
I suspect the SCADA IO driver uses modbus FC22 (16 hex). (Mask write Register).
I seems the modbus slave module does not support this ? Correctly ?

FHEM as Modbus master also does not support FC22 ? (for ex. if FHEM connects to a slave Modbus PLC).
Is it possible to also add support for FC22 for both Master as Slave modules ?

Other solution is that I used for ex. Kepware OPC server which has the ability to select if you use FC22 or not. If FC22 is not used then the OPC server quickly reads the value before masking it with the "changed" bits before poking it back to the modbus slave.

Another remark I have on the Modbus Slave module is that it expects a Modbus UnitID slave nr when polled by a modbus master. Some Modbus master don't provide this slave ID (mostly 1) in it's modbus FC requests. (as it mostly is a single IP adress already specified).

Thanks in advance,

Monty :-)

Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 23 November 2018, 14:48:51
FC22 :


5.3.4 Mask write register (FC 22)

Request

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Response

Byte 0:      FC = 16 (hex)
Byte 1-2:   Reference number
Byte 3-4:   AND mask to be applied to register
Byte 5-6:   OR mask to be applied to register

Exceptions

Byte 0:      FC = 96 (hex)
Byte 1:      exception code = 01 or 02

Example

Change the field in bits 0-3 of register at reference 0 (40001 in Modicon 984) to value 4 hex
(AND with 000F, OR with 0004)

16 00 00 00 0F 00 04  =>   16 00 00 00 0F 00 04
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 24 November 2018, 14:30:17
Hallo,

Ich habe versucht FC 22 in ModbusTCP_CC zu integrieren. Leider kann ich es nur sehr begrenzt testen.

Du kannst die neue Version mit
update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/mbs/controls_mbcc.txtinstallieren.

Nach einem Neustart von FHEM sollte FC 22 funktionieren.

Zitat
Eine weitere Bemerkung, die ich zu dem Modbus-Slave-Modul habe, ist, dass eine Modbus-UnitID-Slave-Nummer erwartet wird, wenn sie von einem Modbus-Master abgefragt wird. Einige Modbus-Master geben diese Slave-ID (meistens 1) in ihren Modbus-FC-Anforderungen nicht an. (da meistens nur eine einzige IP-Adresse angegeben ist).

Das Protokoll verlangt eine UnitId im Byte 7. Sie ist aber bei vielen echten ModbusTCP-Servern ohne Funktion. Wenn du in FHEM die UnitId ignorieren möchtest, kannst du bei der Definition * angeben.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: monty_burns_007 am 24 November 2018, 22:32:43
Hallo Chris,

Ich habe gerade das Update installiert und es funktioniert! ;-)

Getestet mit Modbus Tools & mit einem echten SCADA IO-Treiber von Wonderware HMI.
Der MBBTCP DA-Server des Wonderware IO-Treibers kann ohne Verwendung von FC22 keine separaten Bits in den Halteregistern schreiben.
Eine andere funktionierende Lösung bestand in der Verwendung eines Modbus-OPC-Servers (wie Kepware), bei dem es eine Option gibt, ob der harware-Slave auf FC22-Anforderungen antworten kann.

FHEM als Modbus-Slave kann jetzt auf FC22 antworten. :-)

Ich verwende die FHEM auch als Modbus-Master in Verbindung mit einer SPS. Ist der FC22-Code auch da?
Es spielt keine Rolle, da meine SPS nicht auf FC22-Modbus-Anforderungen antworten kann ... (günstige Version mit eingeschränkter Modbus-Protokollfunktionalität)

Schönes Wochenende noch....
Titel: Antw:FHEM als Modbus Slave
Beitrag von: SandroK am 26 Juni 2019, 18:05:48
Muss mal Fragen, ob das Thema noch aktuell ist:

Mein Problem:

Ich bekomme ein "Connection refused from the non-local address XXX.XXX.XXX.XXX:YYYY, as there is no working allowed instance defined for it"
beim Versuch mit einem Modbus Client auf die FHEM-Anwendung von extern zu zugreifen.

Habe schon einiges nachgelesen, aber nichts passenden gefunden: Ich benutze den Port 10502 und FHEM läuft nicht als root !

Was kann nich noch tun ?

VG Sandro
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 26 Juni 2019, 19:22:01
Hallo,

Der Zugriff erfolgt wahrscheinlich von einem Client der keine private IP-Adresse verwendet (127/8, 10/8, 192.168/16, 172.16/12, 169.254/16). In dem Fall blockiert FHEM den Zugriff.

Du kannst versuchen durch Eingabe von
{$attr{'NameDerModbusClientInstanz'}{allowfrom} = ".*"}in der Kommandozeile den Zugriff freizuschalten.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: SandroK am 27 Juni 2019, 11:16:04
Hallo Chris,

genau das war es, vielen Dank und viele Grüße

Sandro
Titel: Antw:FHEM als Modbus Slave
Beitrag von: SandroK am 10 Juli 2019, 15:33:02
Hallo Chris,

ein ganz großes Lob, funktioniert einwandfrei.

Habe dennoch eine Frage, Real/Floatwerte kann ich mit dem Suffix "F" im comment
adressieren, wie geht das mit Double (32Bit) Werten ? Im Quellcode habe ich
ein "FB" gefunden, das dreht scheinbar die Float-Register, dann habe ich noch "T"
gefunden, damit kann ich gar nichts anfangen.

Danke für eine kurze Rückinfo.

VG Sandro
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 10 Juli 2019, 20:53:35
Hallo,

Mit 'F' werden Real-Zahlen aus FHEM als Single-Gleitkommazahlen (32 Bit) interpretiert und auf 2 aufeinanderfolgenden Registern zurückgeliefert. Mit 'FB' lässt sich die Reihenfolge von Low/High-Word invertieren.

Wenn du die Zahlen als Double (64 Bit) haben möchtest (auf 4 Registern) muss ich das Modul anpassen.

Mit 'T' lässt sich festlegen dass eine 16-Bit Integerzahl im 2-Komplement übertragen wird.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: SandroK am 11 Juli 2019, 08:49:37
Hallo Chris,

nein 64Bit Double benötige ich nicht, lediglich 32Bit als Double.

Habe des jetzt erstmal als Real/Float gelöst, jedoch gibts da scheinbar einen kleinen Rundungsfehler.

Grüße
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 02 Oktober 2019, 07:31:56
Hallo Gemeinde,

ich kämpfe nun schon viele Tagen mit dem ModbusSlave aber es will einfach nix an Daten austauschen. Ich gebe aber zu, so die Ahnung von FHEM hab ich nicht, brauchte aber vor ca. einem halben Jahr eine Möglichkeit 2 Modbus Master zu verbinden. IP-Symcon und C.M.I., was dank Anleitung und einigem probieren hin und her dann auch seitdem Störungsfrei läuft.

FHEM läuft bei mir auf einem win10 Laptop in der Version 5.9 mit strawberry-perl-5.30.0.1-64bit-portable.

Wie bereits erwähnt nur als Brücke zwischen den Mastern. Nun habe ich noch einen SDM630 Zähler angeschafft, dieser wird mittels RS485 USB Adapter von IP-Symcon ausgelesen.

Diese Daten werden dann per Modbus TCP an FHEM übertragen, mit ModbusTCP_CC. Nun müssen diese Daten bzw. eigentlich nur die Gesamtleistung, als Modbus Slave meinem PV Wechselrichter zur Verfügung gestellt werden, damit dieser sich so regeln kann das er etwa bei Nulleinspeisung liegt und der Rest zum Akku laden genutzt wird.

Nun der einzige Erfolg bisher, FHEM findet den Comport und öffnet ihn. Hab es ewig mit "define SDM630 ModbusSlave /dev/ttyS0@19200,8,N,1" und allen möglichen Varianten probiert, aber immer nur Fehler, nach einigen probieren und ewigem suchen mit Google und Co. Und dem Forum bin ich bei "define SDM630 ModbusSlave /com4@19200,8,N,1" gelandet, war nur ein kleiner Hinweis, irgendwo versteckt das es bei Windows anders aufgerufen wird, wobei ich das so nirgends gefunden habe immer mit „dev“ davor nur kommt dann immer „Pfad nicht gefunden“.

so sieht meine derzeitige Config aus:

define CMI ModbusTCP_CC 502
define SDM630 ModbusSlave /com4@19200,8,N,1


define SDM630_30049 dummy
attr SDM630_30049 comment MBR:1,49,H,,F
attr SDM630_30049 group SDM630
attr SDM630_30049 room SDM630

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

define SDM630_30057 dummy
attr SDM630_30057 comment MBR:1,56,H,,F
attr SDM630_30057 group SDM630
attr SDM630_30057 room SDM630


Mittels Modbus_CC wird die Leistung auch wie gewollt in SDM630_30053 dummy eingetragen.

Aber nun: der Wechselrichter senden ca. aller 1s die Anfrage zu: Daten lesen, aber es scheitert bei mir nun schon daran, dass irgendwie in FHEM zu erkennen wie und wo die Daten ankommen, geschweige dem, auszuwerten was er sendet. Dank HTerm weiß ich das der Wechselrichter „01 04 00 34 C7 91 17 72 63“ sendet für die Abfrage der Gesamtleistung.
Den Beschreibungen nach habe ich es so verstanden, das der ModbusSlave sich um alles kümmert genau so wie es der ModbusTCP_CC macht (einfügen und läuft) und ich mich nicht erst darum kümmern muss zu verstehen was da alles abläuft im Hintergrund.

Die Kombination ModbusTCP_CC "verbose 5" und ModbusSlave "verbose 5" ergibt das in der LogDatei:

2019.10.02 07:21:40 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:21:40 3: WEB: port 8083 opened
2019.10.02 07:21:40 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:21:41 3: CMI: port 502 opened
2019.10.02 07:21:41 1: Including ./log/fhem.save
2019.10.02 07:21:41 3: Opening SDM630 device /com4
2019.10.02 07:21:41 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 07:21:41 3: SDM630 device opened

wenn ModbusSlave "verbose 5" allein läuft:
2019.10.02 07:23:18 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:23:18 3: WEB: port 8083 opened
2019.10.02 07:23:18 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:23:18 1: Including ./log/fhem.save
2019.10.02 07:23:18 3: Opening SDM630 device /com4
2019.10.02 07:23:18 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 07:23:18 3: SDM630 device opened

wenn ModbusTCP_CC "verbose 5" allein läuft:
2019.10.02 07:27:15 1: Including C:/FHEM/fhem.cfg
2019.10.02 07:27:15 3: WEB: port 8083 opened
2019.10.02 07:27:15 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 07:27:16 3: CMI: port 502 opened
2019.10.02 07:27:16 1: Including ./log/fhem.save
2019.10.02 07:27:18 4: Connection accepted from CMI_192.168.2.11_50421
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 14 00 01
2019.10.02 07:27:18 4: ModbusTCP_CC_Parse(CMI_192.168.2.11_50421) : caching devspec2array
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 01 97
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 15 00 01
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 5C 08
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 14 03 00 16 00 01
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 05] 14 03 02 01 F4
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: received [00 00 00 00 00 06] 0A 06 00 01 00 7B
2019.10.02 07:27:18 5: ModbusTCP_CC_Parse: sending [00 00 00 00 00 06] 0A 06 00 01 00 7B


Ich hoffe nun auf viele Vorschläge und am besten wäre es natürlich wenn ich es daduch zum laufen bekomme.

Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 02 Oktober 2019, 08:47:04
Hallo,

Die Anfrage vom Wechselricher (01 04 00 34 C7 91 17 72 63) ist nicht richtig. Die ersten vier Bytes sehen noch gut aus (lesen von Slave 1 ab Adresse 52), der Rest ist aber falsch. Insgesamt dürfen es nur 8 Bytes sein.

Eventuell stimmt das Datenformat nicht oder es gibt Störungen bei der seriellen Übertragung. Die Anfrage für z.B. 2 Worte müsste 01 04 00 34 00 02 30 05 lauten.

Bei verbose 5 sollte ModbusSlave auch anzeigen dass die Daten fehlerhaft sind. Hast du schon versucht die Definition in
define SDM630 ModbusSlave com4@19200,8,N,1zu ändern ? Der / am Anfang sollte nicht nötig sein.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 02 Oktober 2019, 14:47:43
Hallo,

danke für die Tipps,

hier nochmal der Empfangene Satz, ist natürlich nur 8bytes lang, so kommt es bei IP-Symcom rein.

01 04 00 34 00 02 30 05
es war mein Fehler, ich habe den falchen Satz eingefügt, das tut mir sehr leid.

Ohne "/" funktioniert es auch, leider aber weder besser noch schlechter.

define SDM630 ModbusSlave com4@19200,8,N,1

Lagdatei:
2019.10.02 14:34:26 1: Including C:/FHEM/fhem.cfg
2019.10.02 14:34:26 3: WEB: port 8083 opened
2019.10.02 14:34:26 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.02 14:34:26 3: CMI: port 502 opened
2019.10.02 14:34:26 1: Including ./log/fhem.save
2019.10.02 14:34:26 3: Opening SDM630 device com4
2019.10.02 14:34:26 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.02 14:34:26 3: SDM630 device opened

Viele Grüße
Sven
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 02 Oktober 2019, 22:22:43
Hallo,

Ich habe nicht verstanden wieso die Daten vom Wechselrichter jetzt bei IP-Symcon ankommen.

In deinem 1. Beitrag steht dass der SDM von IP-Symcon ausgelesen wird und die Daten per ModbusTCP an FHEM übertragen werden (was auch funktioniert). Der Wechselrichter ist direkt mit dem Rechner auf dem FHEM läuft verbunden und diese Verbindung scheint nicht zu gehen.

Kannst du nochmal mit HTerm prüfen was der Wechselrichter auf COM4 sendet ?

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 03 Oktober 2019, 01:22:15
Ja Okay ist etwas Verwirrend, ich versuche das mal besser zu beschreiben:

Auf dem Win10 Rechner läuft IP-Symcon und FHEM parallel.

IP-Symcom kümmert sich um die ganzen Steuer- und Regelungsaufgaben:
- Heizung
- thermische Solaranlage 
- PV Anlage -> Wechselrichter per USB - RS232 -> COM2
- PV Anlage -> Batteriemanagmantsystem per USB - RS232 -> COM1
- PV Anlage -> Wechselrichter Modbus Karte USB - RS485 -> COM4 (um die geht es, darüber Regel der WR seine Ausgangsleistung, liest aber dabei nur die Gesamtleistung vom SDM630 aus, ich möchte und benötige aber mehr Daten vom SDM630, daher mein Umweg über
- SDM630 PER USB - RS485 -> COM3 am PC.

FHEM kümmert sich um:
- Datenaustausch zwischen IP-Symcon und dem C.M.I. über ModbusTCP_CC, da IP-Symcon und das C.M.I. beide nur als ModbusMaster arbeiten.
- Datenaustausch zwischen IP-Symcon und Wechselrichter per ModbusSlave über USB - RS485 -> COM4 da beide nur als ModbusMaster arbeiten,

dazu
lese ich die Daten des SDM630 mit IP-Symcon aus dem SDM630 aus (funktioniert)
übergebe die Gesamtleistung mit ModbusTCP_CC von IP-Symcon an FHEM (funktioniert)

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

und nun kommt der Teil wo ich nicht weiter komme, es aber auch keine Fehlermeldung gibt, das diese Variable mit ModbusSlave dem Wechselrichter zur Verfügung gestellt wird.

Der WR sendet:

01 04 00 34 00 02 30 05

und erwartet, vom Aufbau her diese Antwort:

01 04 04 43 FD 91 13 53 AD

wobei 43 FD 91 13 die Gesamtleistung ist wie sie auch in der Variable steht.


Statt mit HTerm habe ich mit IP-Symcon geguckt was der WR sendet,

mit HTerm kommt aber das gleiche:

01 04 00 34 00 02 30 05


Viele Grüße
Sven
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 03 Oktober 2019, 01:28:01
Kam gerade beim wieder öffnen von COM4

2019.10.03 01:25:14 3: Opening SDM630 device com4
2019.10.03 01:25:14 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.03 01:25:14 3: SDM630 device opened
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CloseHandle redefined at ./FHEM/99_CommPort.pm line 170.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CreateFile redefined at ./FHEM/99_CommPort.pm line 175.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommState redefined at ./FHEM/99_CommPort.pm line 180.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommState redefined at ./FHEM/99_CommPort.pm line 184.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetupComm redefined at ./FHEM/99_CommPort.pm line 188.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine PurgeComm redefined at ./FHEM/99_CommPort.pm line 192.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine CreateEvent redefined at ./FHEM/99_CommPort.pm line 196.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommTimeouts redefined at ./FHEM/99_CommPort.pm line 200.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommTimeouts redefined at ./FHEM/99_CommPort.pm line 204.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommProperties redefined at ./FHEM/99_CommPort.pm line 208.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ReadFile redefined at ./FHEM/99_CommPort.pm line 212.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine WriteFile redefined at ./FHEM/99_CommPort.pm line 216.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine TransmitCommChar redefined at ./FHEM/99_CommPort.pm line 220.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ClearCommBreak redefined at ./FHEM/99_CommPort.pm line 224.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommBreak redefined at ./FHEM/99_CommPort.pm line 229.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ClearCommError redefined at ./FHEM/99_CommPort.pm line 234.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine EscapeCommFunction redefined at ./FHEM/99_CommPort.pm line 238.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommModemStatus redefined at ./FHEM/99_CommPort.pm line 242.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetOverlappedResult redefined at ./FHEM/99_CommPort.pm line 246.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommConfig redefined at ./FHEM/99_CommPort.pm line 250.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine GetCommMask redefined at ./FHEM/99_CommPort.pm line 254.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommConfig redefined at ./FHEM/99_CommPort.pm line 258.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine SetCommMask redefined at ./FHEM/99_CommPort.pm line 262.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine WaitCommEvent redefined at ./FHEM/99_CommPort.pm line 266.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ResetEvent redefined at ./FHEM/99_CommPort.pm line 270.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine OS_Error redefined at ./FHEM/99_CommPort.pm line 505.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine get_tick_count redefined at ./FHEM/99_CommPort.pm line 507.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine set_no_messages redefined at ./FHEM/99_CommPort.pm line 510.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine nocarp redefined at ./FHEM/99_CommPort.pm line 515.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine internal_buffer redefined at ./FHEM/99_CommPort.pm line 517.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine yes_true redefined at ./FHEM/99_CommPort.pm line 519.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine new redefined at ./FHEM/99_CommPort.pm line 525.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine fetch_DCB redefined at ./FHEM/99_CommPort.pm line 1029.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine init_done redefined at ./FHEM/99_CommPort.pm line 1121.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine update_DCB redefined at ./FHEM/99_CommPort.pm line 1128.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine initialize redefined at ./FHEM/99_CommPort.pm line 1312.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_status redefined at ./FHEM/99_CommPort.pm line 1352.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine reset_error redefined at ./FHEM/99_CommPort.pm line 1380.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_baud redefined at ./FHEM/99_CommPort.pm line 1387.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_databits redefined at ./FHEM/99_CommPort.pm line 1392.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_stopbits redefined at ./FHEM/99_CommPort.pm line 1397.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_dtrdsr redefined at ./FHEM/99_CommPort.pm line 1402.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_handshake redefined at ./FHEM/99_CommPort.pm line 1407.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_check redefined at ./FHEM/99_CommPort.pm line 1412.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_config redefined at ./FHEM/99_CommPort.pm line 1417.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_parity_enable redefined at ./FHEM/99_CommPort.pm line 1422.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rlsd_config redefined at ./FHEM/99_CommPort.pm line 1427.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rlsd redefined at ./FHEM/99_CommPort.pm line 1432.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_16bitmode redefined at ./FHEM/99_CommPort.pm line 1437.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_ioctl redefined at ./FHEM/99_CommPort.pm line 1442.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_rs232 redefined at ./FHEM/99_CommPort.pm line 1447.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_modem redefined at ./FHEM/99_CommPort.pm line 1452.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_rtscts redefined at ./FHEM/99_CommPort.pm line 1457.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_xonxoff redefined at ./FHEM/99_CommPort.pm line 1462.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_xon_char redefined at ./FHEM/99_CommPort.pm line 1467.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_spec_char redefined at ./FHEM/99_CommPort.pm line 1472.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_interval_timeout redefined at ./FHEM/99_CommPort.pm line 1477.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine can_total_timeout redefined at ./FHEM/99_CommPort.pm line 1482.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_handshake redefined at ./FHEM/99_CommPort.pm line 1487.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_handshake redefined at ./FHEM/99_CommPort.pm line 1499.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_baudrate redefined at ./FHEM/99_CommPort.pm line 1506.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_baudrate redefined at ./FHEM/99_CommPort.pm line 1518.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_parity redefined at ./FHEM/99_CommPort.pm line 1525.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_parity redefined at ./FHEM/99_CommPort.pm line 1537.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_databits redefined at ./FHEM/99_CommPort.pm line 1544.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_databits redefined at ./FHEM/99_CommPort.pm line 1556.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_stopbits redefined at ./FHEM/99_CommPort.pm line 1563.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_stopbits redefined at ./FHEM/99_CommPort.pm line 1575.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_buf redefined at ./FHEM/99_CommPort.pm line 1583.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_buf redefined at ./FHEM/99_CommPort.pm line 1590.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_buffers redefined at ./FHEM/99_CommPort.pm line 1596.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine read_bg redefined at ./FHEM/99_CommPort.pm line 1610.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine write_bg redefined at ./FHEM/99_CommPort.pm line 1641.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine read_done redefined at ./FHEM/99_CommPort.pm line 1675.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine write_done redefined at ./FHEM/99_CommPort.pm line 1697.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_all redefined at ./FHEM/99_CommPort.pm line 1719.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_rx redefined at ./FHEM/99_CommPort.pm line 1734.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine purge_tx redefined at ./FHEM/99_CommPort.pm line 1748.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine are_buffers redefined at ./FHEM/99_CommPort.pm line 1762.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine buffer_max redefined at ./FHEM/99_CommPort.pm line 1768.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine suspend_tx redefined at ./FHEM/99_CommPort.pm line 1774.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine resume_tx redefined at ./FHEM/99_CommPort.pm line 1780.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xmit_imm_char redefined at ./FHEM/99_CommPort.pm line 1786.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xon_char redefined at ./FHEM/99_CommPort.pm line 1797.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xoff_char redefined at ./FHEM/99_CommPort.pm line 1809.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_eof_char redefined at ./FHEM/99_CommPort.pm line 1821.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_event_char redefined at ./FHEM/99_CommPort.pm line 1833.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_error_char redefined at ./FHEM/99_CommPort.pm line 1845.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xon_limit redefined at ./FHEM/99_CommPort.pm line 1857.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_xoff_limit redefined at ./FHEM/99_CommPort.pm line 1872.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_interval redefined at ./FHEM/99_CommPort.pm line 1887.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_char_time redefined at ./FHEM/99_CommPort.pm line 1904.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_read_const_time redefined at ./FHEM/99_CommPort.pm line 1916.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_const_time redefined at ./FHEM/99_CommPort.pm line 1928.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_write_char_time redefined at ./FHEM/99_CommPort.pm line 1940.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine update_timeouts redefined at ./FHEM/99_CommPort.pm line 1952.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_binary redefined at ./FHEM/99_CommPort.pm line 2015.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_parity_enable redefined at ./FHEM/99_CommPort.pm line 2028.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ignore_null redefined at ./FHEM/99_CommPort.pm line 2039.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine ignore_no_dsr redefined at ./FHEM/99_CommPort.pm line 2060.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine subst_pe_char redefined at ./FHEM/99_CommPort.pm line 2081.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine abort_on_error redefined at ./FHEM/99_CommPort.pm line 2102.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_dsr redefined at ./FHEM/99_CommPort.pm line 2123.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_cts redefined at ./FHEM/99_CommPort.pm line 2144.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine input_xoff redefined at ./FHEM/99_CommPort.pm line 2165.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine output_xoff redefined at ./FHEM/99_CommPort.pm line 2186.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine tx_on_xoff redefined at ./FHEM/99_CommPort.pm line 2207.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine dtr_active redefined at ./FHEM/99_CommPort.pm line 2228.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine rts_active redefined at ./FHEM/99_CommPort.pm line 2235.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_dtr_off redefined at ./FHEM/99_CommPort.pm line 2244.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_rts_off redefined at ./FHEM/99_CommPort.pm line 2254.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_break_on redefined at ./FHEM/99_CommPort.pm line 2264.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_dtr_on redefined at ./FHEM/99_CommPort.pm line 2274.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine pulse_rts_on redefined at ./FHEM/99_CommPort.pm line 2284.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine break_active redefined at ./FHEM/99_CommPort.pm line 2294.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xon_active redefined at ./FHEM/99_CommPort.pm line 2301.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine xoff_active redefined at ./FHEM/99_CommPort.pm line 2307.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine is_modemlines redefined at ./FHEM/99_CommPort.pm line 2313.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine debug_comm redefined at ./FHEM/99_CommPort.pm line 2325.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine close redefined at ./FHEM/99_CommPort.pm line 2340.
2019.10.03 01:25:27 1: PERL WARNING: Subroutine DESTROY redefined at ./FHEM/99_CommPort.pm line 2389.
2019.10.03 01:25:27 1: Including C:/FHEM/fhem.cfg
2019.10.03 01:25:27 3: WEB: port 8083 opened
2019.10.03 01:25:27 2: eventTypes: loaded 89 events from ./log/eventTypes.txt
2019.10.03 01:25:27 3: CMI: port 502 opened
2019.10.03 01:25:27 1: Including ./log/fhem.save
2019.10.03 01:25:28 3: Opening SDM630 device com4
2019.10.03 01:25:28 3: Setting SDM630 serial parameters to 19200,8,N,1
2019.10.03 01:25:28 3: SDM630 device opened
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 03 Oktober 2019, 23:06:37
Hallo,

Danke für die Erklärungen.

Ich habe Strawberry Perl installiert und festgestellt dass FHEM keine Daten von der seriellen Schnittstelle liest. An der Perl-Version liegt es nicht, ein kleines Perl-Testprogramm zeigt Daten an.

Ich muss mir ansehen wo die Daten in FHEM hängen bleiben.

Woher kommt das Modul 99_CommPort ? Es gehört nicht zu zur Standard FHEM-Installation.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 04 Oktober 2019, 01:21:57
Vielen Dank das Du dir das ansiehst,

ich habe viel rumprobiert und versucht, bewusst genutzt wird das Modul 99 von mir nicht. Ich nehmean das ist durch meine vielen versuche dazu gekommen. wie bekomme ich das wieder weg?

VG
Sven
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Oktober 2019, 14:33:48
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 (https://github.com/ChrisD70/FHEM-Modules/blob/master/36_ModbusSlave.pm) herunterladen
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 05 Oktober 2019, 17:43:49
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Oktober 2019, 18:01:21
Hallo,

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

Zitat
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.

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 (https://rt.cpan.org/Public/Bug/Display.html?id=113337#txn-1691722).

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 05 Oktober 2019, 20:34:09
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Oktober 2019, 21:06:31
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 05ist 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


Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 05 Oktober 2019, 22:40:31
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Oktober 2019, 23:07:37
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Sjae am 06 Oktober 2019, 06:13:26
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 06 Oktober 2019, 11:01:34
Hallo,

Schön dass es funktioniert.

Das Log brauche ich nicht.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: bugs am 22 November 2019, 16:41:18
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 24 November 2019, 20:47:15
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 ?

Zitat
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.

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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: bugs am 02 Dezember 2019, 17:26:25
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 05 Dezember 2019, 21:20:36
Hallo,

Zitat
Can'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.

Zitat
Es 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.

Zitat
Der 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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: bugs am 30 Dezember 2019, 17:17:08
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
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Guzzi-Charlie am 08 Juni 2021, 18:45:55
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?
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 08 Juni 2021, 21:40:18
Hallo,

Ich denke dass das umsetzbar ist. Da du die Registerbelegungen (und Formate) der beiden Geräte kennst sollte sich der Aufwand in Grenzen halten.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Guzzi-Charlie am 08 Juni 2021, 23:03:48
Ok, Danke für die superschnelle Antwort.

Dann werde ich mir Dein Modul demnächst mal zu Gemüte führen und schauen ob ich was damit hinbekomme. Das heißt ich müßte dann das Modbus-Modul von Stefan Strobel zum Einlesen der Daten vom Zähler verwenden (das benutze ich jetzt schon für andere Modbus-Zähler) und dann Dein Modul als Slave mit einem weiteren USB-RS485 Stick als virtuellen Zähler den ich dann an meinen FEMS-Modbus hänge, oder? Und in FHEM mache ich dann lediglich ein Variablen-Mapping, oder?
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 09 Juni 2021, 22:25:06
Hallo,

Wenn es ein fertiges Modul für deinen Zähler gibt solltest du dieses verwenden. Andernfalls kannst du das generische Modbus-Modul von Stefan Strobel einsetzen.

Das Mapping der Variablen erfolgt über die Kommentar-Funktion beim jeweiligen Gerät.

Grüße,

ChrisD
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Guzzi-Charlie am 09 Juni 2021, 22:54:58
Ob es für den vorgesehenen ABB B23 Zähler ein fertiges Modul gibt habe ich noch gar nicht geschaut. Für die anderen bisher von mir eingesetzten Zähler gab es nichts Fertiges. Da habe ich ein anderes Modul angepaßt.

"Kommentar-Funktion", ja stimmt habe ich ja in den Beiträgen schon gelesen. Hab mich nur bisher noch nicht damit beschäftigt. Da werden dann sicher noch einige Fragen auftauchen. Das dauert aber noch, da das FEMS noch nicht installiert ist. Heute ist der BYD-Batteriespeicher gekommen. Die ABB-Zähler kommen Morgen und die PV-Module sind auch schon da, aber die Unterkonstruktion fehlt noch.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Klinki am 07 März 2022, 11:02:45
Hi,
Hast Du Deine Modbus-Umsetzung eigentlich an den Start bekommen? Ich werde mich mit ähnlichen Thematiken auseinandersetzen. Zwar kein FEMS, aber dessen opensource-Ableger OpenEMS. Fhem hält bei mir eine ganze Menge an Stromzähler-Informationen vor - zumeist Impuls-Zähler.

Die Idee die Readings per Kommentar per Modbus zu Verfügung zu stellen, gefällt mir nicht so gut. Es setzt eine gute Strukturierung voraus, die man sich vorher überlegen muss. Eine doppelte Belegung von Slave-IDs oder Registern muss ausgeschlossen werden.

Aber es ist ja schon mal sehr schick überhaupt diese Möglichkeit zu haben!

Gruß,
Klinki
Titel: Antw:FHEM als Modbus Slave
Beitrag von: Guzzi-Charlie am 08 März 2022, 13:42:35
Hallo,

inzwischen sind alle Zähler (auf verschiedenste Weise) eingebunden:

Die Zähler 3-5 werden wg. Eichablauf demnächst durch ABB B23-100-112 (3-phasig), bzw. B21-100-112 (1-phasig) ersetzt und dann ebenfalls per D1-Mini und MQTT an FHEM angebunden.

Zukünftige Projekte sind noch:

Titel: Antw:FHEM als Modbus Slave
Beitrag von: pdp1173 am 21 September 2022, 07:29:42
Für eine dynamische Nulleinspeisung am Growatt SPH3600 brauche ich einen virtuellen SDM630 Leistungsmesser, dem ich selbst die Leistung mitgeben kann (3Phasen Netz mt 1 Phasen Inverter). Modbus Master zum Auslesen des Eastron SDM630 gibts einige, aber keinen für die Simulation eines solchen. Da alle Daten in FHEM vorhanden sind (SML Orbis Strommesser, Leistungsmesser Solar, etc.) habe ich dieses genial einfache Modul von ChrisD ausgesucht.  Der Growatt ist RTU Master und sucht den Energymeter auf Adresse #2. Er liest die ersten 18 Input Register. Ein einfacher Amazon USB-RS485 Stecker dient als Anschluß.

Leider hat der hier im Thread angebotene und auch der im Github vorhandene 36_ModbusSlave.pm einen Fehler, der den Betrieb mit dem Growatt unmöglich macht. Statt des Datensatzes der angekommen ist, wird nur das letzte Byte der Checksumme der Parse Routine übergeben, und die sendet dann ein 5 Byte Reply.

Fehlerhafter Code
sub ModbusSlave_Read($) {############################################################
# called from the global loop, when the select for hash->{FD} reports data
[color=red]Log 0[/color],"Read";
  my ($hash) = @_;
  my $buf = DevIo_SimpleRead($hash);
  return "" if(!defined($buf));

  my $name = $hash->{NAME};

  my $pdata = $hash->{helper}{PARTIAL};
  $pdata .= $buf;

  ModbusSlave_LogFrame($hash,"ModbusSlave_Read($name)",$pdata,4);

  if(( bytes::length($pdata) >= 4 ) && ( ModbusSlave_crc_is_ok($pdata)))
  {
    Log3 $hash,4,"ModbusSlave_Read($name) : crc ok, parsing request";
    RemoveInternalTimer( "RTimeout:".$name);
    $hash->{helper}{PARTIAL} = undef;
    ModbusSlave_UpdateStatistics($hash,1,0,bytes::length($buf),0);  #$buf ist letzter Block
    ModbusSlave_Parse($hash, $buf);  #$buf ist letzter Block, nicht ganzer Satz

Bei 9600baud und schnellem Rechner kommt der Datensatz nicht in einem Stück, sondern Zeichen- für Zeichen. Wahrscheinlich fällt der Fehler bei einem langsamen System mit hoher Baudrate gar nicht auf.

$buf = letzter Block von empfangenen Zeichen (hier: 2. Byte der Checksumme)
$pdata = Modbus Datenblock , der verarbeitet werden soll

Richtig  muss es also heissen:

    ModbusSlave_UpdateStatistics($hash,1,0,bytes::length($pdata),0);
    ModbusSlave_Parse($hash, $pdata);

Ausserdem "müllt" der Log über das Read bei Dauerabfragen das Logfile zu. Daher habe ich es auf verbose Level 2 gesetzt:

# called from the global loop, when the select for hash->{FD} reports data
  my ($hash) = @_;
  Log3 $hash,2,"Read RTU"
 

Danach läuft es jetzt einfach super, über MQTT2 hole ich die benötigten Werte für Spannung (wird nicht gebraucht) und natürlich die Leistung mit Vorzeichen. Die einfache Definition hier noch der Vollständigkeit:

root@mobilheim-esx:/opt/fhem# cat fhem.cfg

attr global userattr cmdIcon devStateIcon:textField-long devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride
attr global autoload_undefined_devices 1
attr global autosave 0
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd none
attr global statefile ./log/fhem.save
attr global verbose 3

define WEB FHEMWEB 8083 global
setuuid WEB 6327fbb8-f33f-9008-edc0-7d16279fe4a5412f

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log Logfile
setuuid Logfile 6327fbb8-f33f-9008-3f21-7401c05374272240

define autocreate autocreate
setuuid autocreate 63294800-f33f-9008-952b-d5effcc5fb36ae0b
attr autocreate filelog ./log/%NAME-%Y.log

define eventTypes eventTypes ./log/eventTypes.txt
setuuid eventTypes 6327fbb8-f33f-9008-164d-9139fc43c197395e

# Disable this to avoid looking for new USB devices on startup
#define initialUsbCheck notify global:INITIALIZED usb create

define MQTT2_Garage MQTT2_CLIENT 192.168.188.240:1883
setuuid MQTT2_Garage 6327fbb8-f33f-9008-1fbf-fad8914b9bc67ccc
attr MQTT2_Garage room Garage

define MQTT2_ewe MQTT2_DEVICE ewe
setuuid MQTT2_ewe 63294800-f33f-9008-39d9-e9b242ee7ccfda5a
attr MQTT2_ewe IODev MQTT2_Garage
attr MQTT2_ewe readingList garage/Strom/Strom/power:.* ewe_power\
  garage/Strom/Strom/power_L1:.* ewe_power_L1\
  garage/Strom/Strom/power_L2:.* ewe_power_L2\
  garage/Strom/Strom/power_L3:.* ewe_power_L3\
  garage/Growatt/Growatt/voltage:.* ewe_voltage
attr MQTT2_ewe room Garage



define SDM630 ModbusSlave /dev/ttyUSB1@9600,8,N,1
setuuid SDM630 63294800-f33f-9008-b320-ceb744d0d0fa80f9
attr SDM630 verbose 1

define SDM630_30001 dummy
setuuid SDM630_30001 63294800-f33f-9008-cd70-66f90b0318cc4025
attr SDM630_30001 comment MBR:2,0,I,,F
attr SDM630_30001 group SDM630
attr SDM630_30001 room SDM630

define SDM630_30003 dummy
setuuid SDM630_30003 63294800-f33f-9008-5876-b9d359d188945905
attr SDM630_30003 comment MBR:2,2,I,,F
attr SDM630_30003 group SDM630
attr SDM630_30003 room SDM630

define SDM630_30005 dummy
setuuid SDM630_30005 63294800-f33f-9008-d17b-b66dc1c0651e6d07
attr SDM630_30005 comment MBR:2,4,I,,F
attr SDM630_30005 group SDM630
attr SDM630_30005 room SDM630

define SDM630_30007 dummy
setuuid SDM630_30007 63294800-f33f-9008-5bda-716d0bc978966cd8
attr SDM630_30007 comment MBR:2,6,I,,F
attr SDM630_30007 group SDM630
attr SDM630_30007 room SDM630

define SDM630_30009 dummy
setuuid SDM630_30009 63294800-f33f-9008-8b30-de23e95b435476b6
attr SDM630_30009 comment MBR:2,8,I,,F
attr SDM630_30009 group SDM630
attr SDM630_30009 room SDM630

define SDM630_30011 dummy
setuuid SDM630_30011 63294800-f33f-9008-2043-c80a26a8d1ff9246
attr SDM630_30011 comment MBR:2,10,I,,F
attr SDM630_30011 group SDM630
attr SDM630_30011 room SDM630

define SDM630_30013 dummy
setuuid SDM630_30013 63294800-f33f-9008-6f26-2784b56ef96ab936
attr SDM630_30013 comment MBR:2,12,I,,F
attr SDM630_30013 group SDM630
attr SDM630_30013 room SDM630

define SDM630_30015 dummy
setuuid SDM630_30015 63294800-f33f-9008-2e00-979ffccc4ccc5d2b
attr SDM630_30015 comment MBR:2,14,I,,F
attr SDM630_30015 group SDM630
attr SDM630_30015 room SDM630

define SDM630_30017 dummy
setuuid SDM630_30017 63294800-f33f-9008-2d2d-8818d8fd079470c0
attr SDM630_30017 comment MBR:2,16,I,,F
attr SDM630_30017 group SDM630
attr SDM630_30017 room SDM630


#define sendtogrowatt at +00:00:10 { fhem "set SDM630_30013 " . ReadingsVal('MQTT2_ewe','ewe_power',0) }

define n_ewe_power notify MQTT2_ewe:ewe_power:.* { fhem "set SDM630_30013 " . ReadingsVal('MQTT2_ewe','ewe_power',0);;fhem "set SDM630_30001 " . ReadingsNum('MQTT2_ewe','ewe_voltage',0) }

setuuid n_ewe_power 63294800-f33f-9008-bda9-d0e2698a87eabef9
attr n_ewe_power room SDM630



30001 = Spannung an der 1. Leitung
30007 = Strom an der 1. Leitung
30013 = Leistung saldiert an der 1. Leistung +/-

Selbst setze ich FHEM schon lange Zeit auf Raspi ein, fremdle jedoch mit der PERL Sprache und vor allem der Syntax. Super mächtig aber manchmal für den non-Profi extrem nervig. Daher bisher wenig selbst gemacht. Ich bitte um Entschuldigung, wenn das Beispiel nicht für jeden optimal ist.

Eine "Unschönheit" des ModbusSlave Moduls: Da nicht global eine Adresse dem Slave zugeordnet wird, sondern nur in den Registern, antwortet der Slave manchmal (während der Testphase) auch auf Aufrufe mit anderen Adressen (#1, #3, etc.) . Das "verwirrte" manche Master, die einfach nach Teilnehmern auf dem Bus suchen (wie mein Growatt). Ein optionaler Parameter für die Slave Adresse wäre eine tolle Erweiterung, sodass das Modul bei allen anderen Adressen "den Mund hält". Ich sehe aber auch das Potential in der Lösung mit übergreifenden Registern. Danke für die Bereitstellung des Moduls.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 21 September 2022, 20:53:19
Hallo,

Vielen Dank für den ausführlichen Fehlerbericht. Ich habe deine Korrekturen übernommen.

Den letzen Absatz habe ich nicht ganz verstanden. Die Adresse (Unit ID) kann mit angegeben werden, in deinem Beispiel ist dies auch der Fall (MBR:2,4,I,,F). Bei Anfragen auf nicht definierte Adressen, Register oder Coils antwortet das Modul mit einem Fehler. Möchtest du diese Fehlermeldung unterdrücken ?

Grüße,

ChrisD


Titel: Antw:FHEM als Modbus Slave
Beitrag von: pdp1173 am 22 September 2022, 00:26:01
Hallo, ich denke an das "diagslave" / "modpoll" Programm als Referenz. Dieses hat in der Start Command Line den Schalter "-a 2" (für ID 2) und kann dann mit beliebigen Daten beschickt werden, ohne zu reagieren. Das ist ja die Idee vom modBUS, dass mehrere Teilnehmer auf der gleichen 2-Draht-Leitung liegen und immer der, der angesprochen ist (also die ID stimmt), seine Sendeleitung auf die Leitung legen darf. Alle anderen müssen still bleiben. Realisiert ist das elektrisch in der RS485 mit 3-State Schaltern, die zwischen Empfangen/Senden/offen im Halb-Duplex schalten. Das wird heute fast nicht mehr gebraucht, meist ist der BUS eine Punkt-zu-Punkt Verbindung; das erspart viele elektrischen Probleme , die man damit haben kann. Wir haben heute LAN/Wifi-Netzwerke stattdessen , das hat sich damit eigentlich erledigt.

Zur Antwort auf deine Frage: Bei einer Anfrage, die zu keinem Register oder Coil passt, wäre IMHO das Richtige, einfach nicht zu antworten. Dennoch kann das auch so bleiben, da 99% der Fälle die Point-2-Point Situation ist.

Danke.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: ChrisD am 24 September 2022, 19:14:59
Hallo,

Das aktuelle Verhalten ist auf einem seriellen Bus mit mehreren Teilnehmer in der Tat nicht sinnvoll.

Ich habe das Modul um das Attribut slaveAddress erweitert. Damit kann festgelegt werden auf welche Adresse(n) geantwortet werden soll. Wenn das Attribut nicht definiert ist wird wie bisher auf alles geantwortet. Beim Attribut kann entweder eine einzelne Adresse oder eine Regexp angegeben werden, z.B.:
attr mbslave slaveAddress [1|7|12]Hier würde nur auf die Adressen 1, 7 und 12 geantwortet.

Grüße,

ChrisD

Die aktuelle Version kann hier (https://github.com/ChrisD70/FHEM-Modules/blob/master/36_ModbusSlave.pm) heruntergeladen werden.
Titel: Antw:FHEM als Modbus Slave
Beitrag von: pdp1173 am 25 September 2022, 19:22:18
Klappt wunderbar, vielen Dank!

 8)