NEWS
Modbus adapter
-
Eigentlich sollte es so aussehen ( Beta v5.0.3) :
Beispiel :
In der Konfig mit Leerzeichen ,
4521 Aktuelle Wirk- Leistung Phase L1 4523 Aktuelle Wirk- Leistung Phase L2 4525 Aktuelle Wirk- Leistung Phase L3
Datenpunkt werden aber dann so erstellt mit _ :
modbus.0.holdingRegisters.4521_Aktuelle_Wirk-_Leistung_Phase_L1 modbus.0.holdingRegisters.4523_Aktuelle_Wirk-_Leistung_Phase_L2 modbus.0.holdingRegisters.4525_Aktuelle_Wirk-_Leistung_Phase_L3
Beispiel :
Da wir aber nichts dazugebaut !?
_ ist schon in der Config vorhanden :
4521 Aktuelle_Wirk- Leistung Phase_L1 4523 Aktuelle_Wirk- Leistung Phase_L2 4525 Aktuelle_Wirk- Leistung Phase_L3
Datenpunkte :
modbus.5.holdingRegisters.4521_Aktuelle_Wirk-_Leistung_Phase_L1 modbus.5.holdingRegisters.4523_Aktuelle_Wirk-_Leistung_Phase_L2 modbus.5.holdingRegisters.4525_Aktuelle_Wirk-_Leistung_Phase_L3
-
@klassisch sagte in Modbus adapter:
einer Lawine, die da auf uns zurollt?
Das Chaos kommt noch , denn alle Vorlagen die hier im Forum sind , sind zu 90% mit Leerzeichen.
Und wie auch andere ,werden die Datenpunkte per Influx , History , SQL ....und auch in Scripte genutzt .EDIT :
Beispiel :
Ein kleine Änderung und ...
Siehe bei Admin 6 ..... Ohh .... da sieht man wieviel gerade in Beta unterwegs sind ( unwissenheit) ....... jeder zweite Thread mit ... " kann nicht Updaten , habe ein komische Meldung " -
Bei mir sieht der Datenpunkt (kopiert)
so aus:modbus.0.holdingRegisters.100.817_AC_Consumption L1
Also mit Blank vor L1 .
Anderes Beispiel aus einem Skript:
const setIChargeId = 'modbus.0.holdingRegisters.100.2705_DVCC_system max charge current';
Also jede Menge Blanks drin
Nichts selbst angelegt, hat der Modbus Adapter wahrscheinlich in einer 3er Version gemacht.Aus meiner Sicht würde eine solche nachträgliche Restriktion allgemein nicht gut tun. Sollte man meiner Meinung nach nicht wirklich durchziehen. Zumal ich keinen wirklich zwingenden Grund sehe oder gelesen habe.
Betas nutze ich nur, wenn nicht vermeidbar. Also in einzelnen Adaptern. Eigentlich nicht beim Framework. Ich steuere meine gesamte Wohnungsbeleuchtung mit ioBroker, das dämpft die Experimentierfreude ....
-
Hallo!
Ich habe einen Batteriewechselrichter der über eine RS485 Schnittstelle verfügt und via Modbus RTU Informationen aus dem Zähler liest und dann dementsprechend die Leistung regelt etc.
Hardware:
Ich habe mir einen Waveshare RS485 to eth Adapter gekauft und angeschlossen.
Den Adapter habe ich eingestellt auf RS485 to Modbus TCP to RTU.IoBroker:
Im IOBroker habe ich diverse Einstellungen versucht und mit diesen scheine ich (in den Logs) was zu sehen.Ich bekomme diese Einträge im Log (steht auf Silly). Ich habe versucht das Register 300012 auszulesen.
Ich denke mal ich habe ein Register gelesen, dass ich nicht angelegt habe.
Ich habe einige Sachen angelegt um das auszuschließen. (Register ohne Alias 10-13, mit Alias 300010-300013, habe das auch jeweils im input- und holding-register)Ich kann aus dem Eintrag im Log leider nicht erkennen welche addresse ausgelesen werden sollte.
Kann ich das irgendwo sehen?So wie ich das mit den Einstellungen im Waveshare Adapter verstehe müsste ich im IOBroker Modbus Adapter eigentlich RTU over TCP einstellen aber dann kann ich leider nicht mehr Slave einstellen oder übersehe ich was?
-
@klamm-0 sagte in Modbus adapter:
Waveshare RS485 to eth Adapter
hier steht einiges drin darüber :
https://forum.iobroker.net/topic/51804/erledigt-modbusfrage-mit-waveshare-rs485-to-eth-b
-
@klamm-0
Vielleicht hilft Dir mein Beitrag SDM120 Modbus RTU RS485 Stromzähler (W)LAN ioBroker etwas.
Ich verwende allerdings USRIOT statt Waveshare. Waveshare würde mich aber auch interessieren, weil in D verfügbar.Mir hat das Programm "QModMaster" zur Evaluierung der Register weiter geholfen.
Separat habe ich mir noch in meinen Unterlagen notiert:
"Die Brücke zum Modbus geschieht über ein USR-WIFI232-A2 Modul
Dabei muß genau in einem der beiden Verbndungspartner (USRIOT oder Modbus Adapter) die Option "Modbus TCP <-> Modbus RTU" gewählt werden - nicht aber in beiden. Präferenz: Soll der USRIOT richten, damit auch einfachere Modbus Programme darauf zugreifen können"Generell würde ich wie im zweiten Beitrag des referenzierten Posts auf "Mehrere Geräte Ids" gehen und die Adresse dann in den Instanzeneinstellung als "Slave-Id" eingeben. Geht auch, wenn man nur ein Gerät hat und scheint mir universeller zu sein.
-
@glasfaser said in Modbus adapter:
@klamm-0 sagte in Modbus adapter:
Waveshare RS485 to eth Adapter
hier steht einiges drin darüber :
https://forum.iobroker.net/topic/51804/erledigt-modbusfrage-mit-waveshare-rs485-to-eth-b
Habe mir das mal alles durchgelesen (teilweise nur überflogen) es ist aber leider nicht mein "Problem". In dem Beispiel ist der Zähler vorhanden und man will den IOBroker als MASTER haben.
Meine Frage geht eher in diese Richtung (hier hat man es dann aber doch anders gemacht):
https://forum.iobroker.net/topic/51897/modbus-adapter-energiemessgerät-simulieren@klassisch said in Modbus adapter:
@klamm-0
Vielleicht hilft Dir mein Beitrag SDM120 Modbus RTU RS485 Stromzähler (W)LAN ioBroker etwas.
Ich verwende allerdings USRIOT statt Waveshare. Waveshare würde mich aber auch interessieren, weil in D verfügbar.Mir hat das Programm "QModMaster" zur Evaluierung der Register weiter geholfen.
Separat habe ich mir noch in meinen Unterlagen notiert:
"Die Brücke zum Modbus geschieht über ein USR-WIFI232-A2 Modul
Dabei muß genau in einem der beiden Verbndungspartner (USRIOT oder Modbus Adapter) die Option "Modbus TCP <-> Modbus RTU" gewählt werden - nicht aber in beiden. Präferenz: Soll der USRIOT richten, damit auch einfachere Modbus Programme darauf zugreifen können"Generell würde ich wie im zweiten Beitrag des referenzierten Posts auf "Mehrere Geräte Ids" gehen und die Adresse dann in den Instanzeneinstellung als "Slave-Id" eingeben. Geht auch, wenn man nur ein Gerät hat und scheint mir universeller zu sein.
Wenn ich das richtig verstanden habe hast auch du den Zähler und nutzt den IOBroker als Master um Werte vom Zähler zu erfragen.
In meinem Fall ist der WR aber der Master und der IOBroker müsste der Slave sein.Ich vermute mit den aktuellen Einstellungen (die ja eigentlich nicht richtig sind, weil nicht RTU over TCP als Slave möglich ist) scheint es auch Komminikation zu geben. Nur eben nicht im richtigen register?!
Evtl. macht der Waveshare ein Fehler beim "Übersetzen" daher die Frage ob ich im iobroker adapter sehen kann welche Adresse versucht wird zu lesen. So könnte ich mir die passende Adresse anlegen und dann sehen ob die Kommunikation zurück (iobroker zum Wechselrichter) funktioniert oder ob der Waveshare da auch fehler beim "übersetzen" macht.
Nachtrag: Stelle ich auf mehrere ID´s und RTU over TCP, dann bleibt der Adapter in gelb stehen (not connected)
Die Warnung FC3 request outside register boundaries: from 11, len 1. Expected max address 0 kommt übrigens auch wenn der Master werte einer anderen Geräte ID abfragt.
-
@klamm-0 sagte in Modbus adapter:
daher die Frage ob ich im iobroker adapter sehen kann welche Adresse versucht wird zu lesen.
Nein , der Modbus Adapter scannt / liest die Adressen/ Register vom angeschlossen Teilnehmer nicht aus.
So könnte ich mir die passende Adresse anlegen
Die mußt du in der Dokumentation zum Wechselrichter herraussuchen und in der Instanz eintragen ,
Input / oder Holding , so das der Modbus-Adapter dieses Register abfragt . -
@glasfaser
Nein ich glaube du hast meine Frage nicht verstanden.
Ich möchte nicht rausfinden welche Register es gibt (dafür habe ich die Dokumentation des Zählers und da steht alles drin)
Der Master (Wechselrichter) Fragt bereits ein Register ab
Direkt auf der RS485 Leitung sieht das dann so aus:
01 03 00 0B 00 01 F5 C8
------------------^^^^^ crc
------------^^^^^------ anzahl der zu lesenden Register
------^^^^^------------ Startadresse
---^^------------------ Funktionscode (03 read holding register)
^^--------------------- GeräteIDDer Waveshare übersetzt das dann in TCP und schickt es an den iobroker.
Hier habe ich das Holdingregister 300012 auch bereits angelegt
Die Anfrage scheint auch im iobroker anzukommen. Hier gibts aber dann den Fehler:
FC3 request outside register boundaries: from 11, len 1. Expected max address 0Was sich für mich danach anhört als hätte man versucht ein nicht vorhandenes Register abzufragen.
Meine Frage ist also: welches register wurde ausgelesen? (bzw. versucht) was dann zu dem Fehler geführt hat.
evtl. übersetzt der Waveshare ja schwachsinn und das Register 5331896 (wild auf dem Numpad rumgedrückt) wird abgefragt. -
Wenn ich das richtig verstanden habe hast auch du den Zähler und nutzt den IOBroker als Master um Werte vom Zähler zu erfragen.
Ja, genau. geht auch mit mehreren dieser Zähler
In meinem Fall ist der WR aber der Master und der IOBroker müsste der Slave sein.
Sorry, das hatte ich nicht verstanden oder überlesen. Diesen Fall hatte ich noch nicht und kann dazu leider auch nichts sagen. Mir ist auch unklar, welche Daten der ioBroker dem WR per Modbus bereit stellen sollte.
Wie gesagt, beim Suchen der Adressen hat mir das etwas angestaubte Programm QModMaster geholfen, weil die Adressen und Werte stur in Bin, Dec oder Hex anzeigt. Dem ioBroker Modbus-Adapter vermochte ich diese Informationen nicht zu entlocken. Der Autor von QModMaster verweist auf seiner Sourceforge Seite auf seinen Modbus Slave SW PyModSlave
https://sourceforge.net/projects/pymodslave/Vielleich hilft das weiter?
Nachtrag: Stelle ich auf mehrere ID´s und RTU over TCP, dann bleibt der Adapter in gelb stehen (not connected)
Bei mir war es so, daß nur EINER der Kommunikationspartner die Übersetzung RTU over TCP vornehmen durfte. Wenn beide oder keiner diese Translarion vornahmen hat es nicht funktioniert.
-
@klamm-0 sagte in Modbus adapter:
Habe mir das mal alles durchgelesen (teilweise nur überflogen)
Schlecht ... dann hättest du das erstmal gemacht :
Vorschlag ... teste erstmal damit :
https://forum.iobroker.net/topic/51804/erledigt-modbusfrage-mit-waveshare-rs485-to-eth-b/28 -
@klassisch said in Modbus adapter:
Mir ist auch unklar, welche Daten der ioBroker dem WR per Modbus bereit stellen sollte.
Normalerweise fragt der WR am Zähler Leistung, Strom, Spannung etc. ab.
Ich habe aber einen SMA Zähler und will mir nicht noch einen weiteren Zähler einsetz sondern die Werte des SMA nutzen und diese dem WR bereitstellen wenn er die entsprechenden Register abfragt.@klassisch said in Modbus adapter:
https://sourceforge.net/projects/pymodslave/
Vielleich hilft das weiter?
Habe ich mir angesehen aber leider nicht viel verstanden
@glasfaser said in Modbus adapter:
@klamm-0 sagte in Modbus adapter:
Habe mir das mal alles durchgelesen (teilweise nur überflogen)
Schlecht ... dann hättest du das erstmal gemacht :
Vorschlag ... teste erstmal damit :
https://forum.iobroker.net/topic/51804/erledigt-modbusfrage-mit-waveshare-rs485-to-eth-b/28Meinst du den Radzio? oder meinst du die Instanz neu aufsetzen?
der Radzio! ist ja ein MASTER und genau den brauche ich nicht.
Die Instanz habe ich schon neu aufgesetzt. Hat nicht geholfen. -
Ich meine eine Ausleseprogramm wie auch ..... geschrieben hat .
Erstmal unabhängig von ioBroker testen.@klassisch sagte in Modbus adapter:
verweist auf seiner Sourceforge Seite auf seinen Modbus Slave SW PyModSlave
https://sourceforge.net/projects/pymodslave/ -
Habe die Instanz auf dem iobroker jetzt so eigestellt gelassen (TCP Slave) und die Objekte mit Daten gefüllt.
Habe versucht die dann mit radzio auszulesen. Ich weiß nicht ob es eine Radzio oder Modbus Beschränkung ist aber es können nur Register bis 65535 genutzt werden.Wenn ich im Modbus Adapter 300002 anlege (eine Adresse die ich nachher auch brauche), dann erhalte ich die oben genannte Fehlermeldung.
Ich werde mal noch ein paar Sachen mit Alias bzw. ohne Versuchen und mich mal morgen im Laufe des Tages erneut dazu melden.
Hilfreich wäre es, wenn ich im Log sehen könnte welches Register gelesen wurde bzw. versucht wird zu lesen.
Ist das irgendwie möglich? -
@klamm-0 sagte in Modbus adapter:
Wenn ich im Modbus Adapter 300002 anlege
so eine lange Registeradresse kenne ich nicht, wo hast du die her ! und deshalb kommt bei dir :
request outside register boundaries: from 11, len 1. Expected max address 0
Beispiel , von mir :
-
@glasfaser
Die Register habe ich aus der Dokumentation des EM24. Hier mal ein paar Beispiele:wenn ich in Radzio einen Wert größer als 65535 eingebe, wird einfach wieder vor vorne begonnen zu zählen.
65536 ist also quasi wieder 0.
Ich vermute der Iobroker Adapter nutzt die Zahl die wirklich reinkommt. Gibts eine Modbus Schnittstellenbeschreibung in der steht was gemacht werden soll wenn das abgefragte Register größer ist als FFFF? Bzw. gibts eine vorgabe bis wohin die Registeradressen gehen dürfen? -
nimm mal Holding-Register in der Instanz ( kein ALIAS ) , dann 40001 mit int32 , wenn nichts kommt dann das Register rauf oder runter +1 / oder -1
Also 40000 oder 40002 -
Oder physical Address und ohne alias, falls noch nicht getestet
Adressen wie 30019 hat mein SDM auch. Aber wie gesagt, da habe ich ja eine Master-Instanz und keine Slave Instanz.
-
-
@glasfaser said in Modbus adapter:
nimm mal Holding-Register in der Instanz ( kein ALIAS ) , dann 40001 mit int32 , wenn nichts kommt dann das Register rauf oder runter +1 / oder -1
Also 40000 oder 40002Wenn ich das mache bekomme ich immer die Fehlermeldung. Egal ob mit oder ohne Alias. Auch wenn ich beim Holdingregister kleinere Registeradressen vergebe (40 zb.) bekomme ich immer die Fehlermeldung.
Input Register funktioniert über radzio sofort.
@glasfaser said in Modbus adapter:
@klamm-0 sagte in Modbus adapter:
Dokumentation des EM24
Siehe mal in der Suche ...
bzw. hier :
Auch hier geht es darum das der Zähler vorhanden ist und ausgelesen werden soll. Ich will aber den Zähler simulieren.
Das heißt ich mache den ioBroker zum Slave, lege die Register an und fülle diese mit Daten.
Wenn mein Wechselrichter dann auf diese Daten zugreifen will (wie er es beim Zähler auch tun würde), dann soll ioBroker die Werte rausgeben. Anscheinend funktioniert das als Slave nicht wenn die Inputregister größer sind als 65535.
Das könnte daran liegen dass Radzio aus 300001 die 37857 macht oder daran dass der Modbus adapter aus der 300001 nicht die 37857 macht. Ich kenne hierzu halt nicht den Soll
Ich denke also entweder wird aus dem Beispiel RS485 Telegramm 03 00 0B als Adresse genommen (was dann ja deutlich über 35565 liegt) oder der Waveshare übersetzt ganz groben Unfug.
Mir sagt es leider nichts aber hier mal ein tcpdump vom raspberry (iobroker).
IP 170 ist der Waveshare und 166 der Raspberry
Hier ist es GeräteID 3, Funktionscode 3, Register 0100 (dezimal 256) was man im ersten Päckchen auch zum Ende hin sieht.
Vielleicht sieht man daran welche Registeradresse lt. Modbusadapter gelesen werden soll (was dann mit FC3 nicht gemacht wird)09:22:55.558539 IP 192.168.100.170.4197 > 192.168.100.166.4196: Flags [P.], seq 1305343477:1305343489, ack 1863987640, win 3000, length 12 0x0000: e45f 0115 89f8 2861 98ea ccaf 0800 4500 0x0010: 0034 0d70 0000 4006 22b3 c0a8 64aa c0a8 0x0020: 64a6 1065 1064 4dcd f5f5 6f1a 31b8 5018 0x0030: 0bb8 3028 0000 0126 1eb0 0006 0303 0100 0x0040: 0001 09:22:55.558598 IP 192.168.100.166.4196 > 192.168.100.170.4197: Flags [.], ack 1305343489, win 64228, length 0 0x0000: 2861 98ea ccaf e45f 0115 89f8 0800 4500 0x0010: 0028 3781 4000 4006 b8ad c0a8 64a6 c0a8 0x0020: 64aa 1064 1065 6f1a 31b8 4dcd f601 5010 0x0030: fae4 4abc 0000 09:22:55.762428 IP 192.168.100.170.4197 > 192.168.100.166.4196: Flags [.], ack 10, win 3000, length 0 0x0000: e45f 0115 89f8 2861 98ea ccaf 0800 4500 0x0010: 0028 0d71 0000 4006 22be c0a8 64aa c0a8 0x0020: 64a6 1065 1064 4dcd f601 6f1a 31c1 5010 0x0030: 0bb8 5407 0000 0126 3432 0020 09:22:55.664385 IP 192.168.100.166.4196 > 192.168.100.170.4197: Flags [P.], seq 0:9, ack 1, win 64228, length 9 0x0000: 2861 98ea ccaf e45f 0115 89f8 0800 4500 0x0010: 0031 3782 4000 4006 b8a3 c0a8 64a6 c0a8 0x0020: 64aa 1064 1065 6f1a 31b8 4dcd f601 5018 0x0030: fae4 4ac5 0000 0126 1eb0 0003 0383 02
Hier die passende Fehlermeldung aus dem ioboker:
Wenn die Zeitstempel alle passen, dann scheint es auf das erste Telegramm hin einen Fehler zu geben.
Und auf das zweite wird etwas geantwortet (was das zweite Telegramm sein soll weiß ich nicht.)EDIT: Ich habe im inputregister natürlich Adressen angelegt (250-260) und gefüllt mit 1,2,3 bis 11
Als Antwort hätte ich also idealerweise
03 03 01 XX CRC
^^ Gerät
---^^ Funktion
------^^ bytes transferedfür XX dann eine der Zahlen zwischen 1 und 11,
CRC dementsprechend.