NEWS
Modbus Sentron3200 Node-Red
-
Hallo,
das geht wohl nur mit Node-Red? Ich dachte dafür gibt es den ModBus-Adapter?
Gruß Marco
-
Hey ich freue mich über eure Antwort,
vielen Dank
Also dann möchte ich mal weiteren Input liefern
Also die Sentron Box ist im Schaltschrank verbaut und wird über TCP/IP angesporchen
zum testen habe ich mich über ein Switch direkt mit der Box an meinem Laptop verbunden,
die Verbindung stand und ich habe ich erste Daten erhalten. (ich konnte jedoch diese Daten nicht Interpretieren)
Nun möchte ich heute einen neuen Ansatz versuchen:
Folgendes möchte ich abfragen:
Offset 1
FC 3
länge 2
Als Ergebnis erhoffe ich mir einen Wert in Volt.
Habt ihr eine Idee wie ich die abfrage Parameter bestimmen muss um nun die Leistung also P zu ermitteln?
Später soll der Node-Red code auf einem Raspi 3 laufen und die daten mittels MQTT weiterleiten.
Vielen Dank
Fizzo361
-
Im Handbuch steht folgendes:
> Die Messgrößen stellt das Multifunktionsmessgerät SENTRON PAC zur Verfügung. Auf alle unten aufgelisteten Messgrößen können Sie die Modbus Funktionscodes 0x03 und 0x04 anwenden.
Und in diesen Registern solltest Du die gewünschten Werte finden:
Ich würde mir die Register mit QModMaster ansehen und wenn die erwarteten Werte angezeigt werden dann mit Node-Red weitermachen.
Hier ein Beispiel Tutorial wie und was man mit QModMaster machen kann: https://www.youtube.com/watch?v=XH6ApwII7mY
Den QModMaster kannst du hier herunterladen: https://sourceforge.net/projects/qmodmaster
Damit solltest Du dann den Sentron Modbus Slave auslesen können.
Garf
-
@Fizzo361 , ich habe genau dasselbe Gerät über den Modbus-Adapter mit modbus-tcp an iobroker angebunden. Wenn von Interesse kann ich Dir meine Konfiguration hier einstellen. Ist halt nicht dasselbe wie Nodered, aber es gibt ein paar interessante Skripte von looxer, um die pac3200-Daten auszuwerten.
-
Vielen Dank für eure Untersützung,
ich habe die richtigen Daten bereits ermitteln können, sie lagen bloß in einem "falschem"
Format vor, so das ich die Daten nicht Interpretieren konnten, ich habe mir dann "um Herr der Daten" zu werden
ModBus Poll installiert und die Daten nochmals überprüft,
Meine Daten wie die 17458, 658… sind im NodeRed im Format Signed um Sie Korrekt auszulesen müssen sie
aber im Float AB CD format umgewandelt werden.
Und mittels der Tabelle von @Graf konnte ich dann mir die gewollten Register auslesen.
Also dieser Teil ist somit abgeschlossen.
Benötige jetzt nur noch eine Funktion im NodeRed die mir die Daten von Signed zu Float AB CD
umwandelt, dann sollte ich mit meinem Testlauf durch sein,
habt ihr dazu evtl. Ideen wie ich das umsetzten könnte?
Vielen Dank
Fizzo361
-
Ich vermute, dass Dein Problem mit dem Big-Endian Format zu tun hat, dort wird ein word-swap benötigt, um an weiter verarbeitbare Daten zu kommen. Genau dies macht der iobroker modbus adapter von alleine.
Als Teaser hier ein screenshot des modbus objekt-baums:
dazu brauchst Du nichts weiter zu tun, als den Adapter zu konfigurieren. Wie gesagt, ich verwende auch eine PAC3200. -
Benötige jetzt nur noch eine Funktion im NodeRed die mir die Daten von Signed zu Float AB CD
umwandelt, dann sollte ich mit meinem Testlauf durch sein,
habt ihr dazu evtl. Ideen wie ich das umsetzten könnte? `
Um eine konkrete Idee/Lösung anbieten zu können müsste ich erst einmal verstehen was wie umgewandelt werden muss. Vielleicht hast Du mal ein Beispiel von den beschriebenen Datenformate Signed/Float. Dem Datenblatt hatte ich eigentlich entnommen, dass die Daten bereits als Float vorliegen. Mit dem Funktion Node könnte man z.B. ein Script schreiben und die Daten in das gewünschte Format umwandeln.Garf
-
Hey Jungs vielen Dank euch, das ihr dran bleibt an meinem Problem, echt super (Y)
Ich verwende keinerlei IOBrokrer Adapter oder Co. Ich verwende lediglich einen Raspberry Pi und eine Sentron PAC 3200, die über Ethernet direkt miteinander verbunden sind. Also muss ich die gewünschte Funktionalität irgendwie in meinem Node Red Flow implementieren.
Danke @Graf ich dachte mir auch schon das ich das wahrscheinlich mit dem Funktion Node bewältigen muss.
so erhalte ich aktuell die Daten:
FC 3: read Holing Registers
Address: 1
Quantity: 5
Poll rate: 2 seconds
IP Modbus Server: 192.168.0.13
Port: 502
Unit ID: 1
[17256,38142,17256,43398,17256]
Also von Bedeutung sind nur die Spalten 1, 3 und 5 also die Werte 17256,
wenn ich diese im Modbus Poll umwandle von "Signed" zu "Float AB CD"
sehen die werte so aus:
232.174
–
232.941
--
233.954
Das sind dann wie schon in der Grafik von @Graf ersichtlich die Spannungen von UL1, UL2 und UL3
und ich möchte das die Daten im NodeRed nicht im 17256 Format erscheinen sondern direkt als 232 (V) angezeigt werden.
Habt ihr eine Idee wie dazu dann die NodeRed Funktion aussehen muss?
Ich habe euch mal meine Modbus Poll Datei hinzugefügt, wenn ihr diese Öffnet und seht ihr eine Tabelle, auf dieser Tabelle klickt ihr oben links, so das alle Zeilen und Spalten markiert sind, dann Rechtsklick und auf Format und wählt dann "Float AB CD" um zurück zu den ursprünglichen Daten zukommen, macht ihr das gleiche nochmals jedoch wählt ihr dann unter Format "Signed" aus, dann seht ihr die Umwandlung von 17256 zu 232.
Ich wäre euch super dankbar wenn wir gemeinsam eine Lösung finden würden.
Vielen Dank
Fizzo361
3186_mbpoll1-alle-infos.zip -
Ich verwende keinerlei IOBrokrer Adapter oder Co. `
dann bist Du im iobroker-forum etwas verkehrt - aber verständlich, dass Du den adapter dann nicht verwenden kannst. Vielleicht kann @Garf dennoch helfen …ich vermute, dass das Problem mit dem Format Big Endian zusammenhängt, also müssen die Bytes vertauscht werden (MSB<>LSB) und erst dann gewandelt werden - vielleicht hilft das weiter: http://forum.iobroker.net/viewtopic.php ... ian#p13372
-
….dann bist Du im iobroker-forum etwas verkehrt..... ` Dann sind wir aber schon zu Zweit. Ich habe ioBroker zwar mal kurz auf meiner NAS installiert, war halt neugiergig, dann aber nicht weiter benutzt. IoBroker ist unumstritten hochinteressant und absolut klasse, aber man kann sich halt nicht mit 1000 Dingen gleichzeitig beschäftigen. Ich bin hier, weil ich ansonsten kein deutschsprachiges Forum gefunden habe, welches sich mit NodeRed beschäftigt.
Jetzt aber zurück zum eigentlichen Problem. So ganz ist mir noch nicht klar, warum man die Floatwerte signed im Modbusgegister ablegt. Wie man die Werte in eine reelle Zahl umwandelt dazu fehlt mir im Moment noch ein Lösungsansatz. Vielleicht finden wir es ja gemeinsam raus. Irgendwer hat den Adapter für ioBroker geschrieben, der könnte es z.B. wissen.
Um die drei Spannungswerte mit NodeRed auslesen zu können, musst Du die ersten sechs Register auslesen. Wobei immer zwei Register den richtigen Wert zurück geben.
Der Spannungswert U1 setzt sich somit aus dem signed Floatwert 17256 und 38142 zusammen. Jetzt brauchen wir nur jemand der uns den Weg zeigt wie man den signed Wert in den tatsächlichen Meßwert umrechnet.
Garf
-
genau so, bin ich auch auf dieses Forum gestoßen, da es sonst nirgendwo etwas über NodeRed gibt.
Ich bin immer noch am tüfteln wie man das Umrechnen kann,
ich habe dazu mal eine Tabelle erstellt, damit auch andere User verstehen können wo wir hin wollen
Ich teile euch meine Teilergebnisse, gerne mit, sobald welche vorliege
Vielen
Fizzo361
3186_werte.xlsx -
sorry, mit node red kenn ich mich nicht so aus, aber vielleicht hilft dies weiter:
https://github.com/ioBroker/ioBroker.modbus
da werden auch die Datentypen sehr gut beschrieben - oder mal im code nachschauen.
-
Ich bin immer noch am tüfteln wie man das Umrechnen kann…. `
Und ich habe heute verstanden, wie man den Zahlenwurm wieder entziffert. Das Zauberwort heißt IEEE 754, Umrechnung Gleitkommazahl in IEEE 754. Wenn diese Binärzahl erzeugt wurde, dann kann man nicht mehr stumpf das Zahlengebilde von binär in dezimal umwandeln. Der ursprüngliche Meßwert wird in einem 32 bit Binärwert dargestellt.Bestehend aus 1 bit Vorzeichen, 8 bit Exponent und einer 23 Bit Mantisse.
(Quelle: https://de.wikipedia.org/wiki/IEEE_754)
Wie man ein Gleitkommazahl in IEEE754 umwandelt kann man bei Wikipedia nachlesen, oder sich bei Youtube anschauen:
https://de.wikipedia.org/wiki/IEEE_754
https://www.youtube.com/watch?v=hHpSwBf0DCA
https://www.youtube.com/watch?v=KV7f2bX8vfo
Der 32 bit Binärwert wird dann in zwei Modbusregister abgelegt und kann dort ausgelesen werden. Die Bezeichnung mit Float AB CD oder CD AB beschreibt in welcher Reihenfolge der 32 bit Binärwert in den beiden Modbusregistern abgelegt wurde. Dafür scheint es keine einheitliche Vereinbarung zu geben.
So, ich habe fertig und hoffe als Laie nicht allzuviel falsch ausgedrückt zu haben. Im Prinzip habe ich das System nun verstanden und eben selber einmal auf Papier für den Messwert L1 deines Sentron3200 ausgerechnet. Und was soll ich sagen, es passt soweit. Wie man dies nun in ein Script in NodeRed abbildet, dafür habe ich im Moment noch keine Idee. Mal sehen, ob ich dafür noch Zeit finden werde. (Zur Zeit aber eher unwahrscheinlich.)
Mir war jedoch wichtig, als Nichtinformatiker, das Grundprinzip zu verstehen. Dies ist mir heute endlich gelungen.
Garf
-
hey danke das werde ich mir morgen mal anschauen, und versuchen auch auf dem Blattpapier zu dem Ergebnis zugelangen,
wenn das klappen sollte, bin ich mal auf die Umsetzung in NodeRed gespannt
Ich melde mich morgen wieder
@ Graf, könntest du evtl. deinen rechen weg uns online zur Verfügung stellen?
Vielen Dank
Fizzo361
-
…... bin ich mal auf die Umsetzung in NodeRed gespannt....
` Ich bin schon seit gestern dran. Ganz grob betrachtet sieht es für den 1. Wurf gar nicht so schlecht aus. Im Moment suche ich noch eine Lösung um von Binär nach Dezimal umrechnen zu können. Ob eine allgemein brauchbare Lösung dabei heraus kommt, kann ich als Programmierlaie nicht versprechen.
Den Rechenweg auf Papier könnte ich sicher einscannen und hochladen. Darin sehe ich jedoch wenig Sinn. Da kommt man auch selber drauf, wenn man meinen Links folgt und dann mal selber macht.
Hier das Zwischenergebnis aus NodeRed. Ist aber alles noch im Schritt für Schritt Teststadium.
Edit:
Jetzt habe ich noch den Binärwert in ein Dezimalzahl umgewandelt und auf zwei Stellen hinter dem Komma eingekürzt. Aber wie bereits geschrieben, ist dies keine finale und fertige Lösung, sondern zeigt nur, dass es machbar wäre. Um zu einem Ergebnis zu kommen habe ich an einigen Stellen Hilfsbrücken eingebaut. Somit also nur eine Teillösung, die aus den beiden Modbuswertegegister für den Messwert L1 wieder eine verständliche Dezimalzahl macht.
Sieht dann so aus:
Zur Erläuterung:
1. string[1] = Vorzeichen
2. string[8] = Charakteristik (Exponent)
3. string[24] = Mantisse
4. number = Messwert L1 in [V]
Garf
-
Hey @Graf,
das sieht doch schon super aus
:shock:
ich verzweifle immer noch etwas beim rechnenweg, aber ich bleibe am ball
kannst du evtl. doch deinen rechnenweg einscannen (wenn es nicht zuviel Aufwand ist natürlich) oder deinen NodeRed Flow mir mal
zu schicken oder hier posten? würde mir das von dir erarbeitete gern mal anschauen.
Vielen Dank
Fizzo361
-
Hi Fizzo,
ich will dich ja nicht entmutigen, aber wenn dir der Rechenweg noch nicht klar geworden ist, dann wird dass wahrscheinlich nichts. Ich kann dir nur raten schau dir die Videos bei Youtube an, die Herren erklären es dort Schritt für Schritt. Besser geht es wirklich nicht. Das Beispiel einfach mitmachen und wenn es verstanden ist dann mit deinen Werten weitermachen. Dies alles macht aber nur Sinn, wenn Du dich mit der Javascriptprogrammierung auskennst, um dann die Funktion-Nodes von NodeRed programmieren zu können. Ich muss da leider passen.
Ich habe mich gestern Abend noch einmal intensiver mit deinen Modbus-Zahlenwerten und meinem Flow beschäftigt, dabei sind mir folgende Dinge aufgefallen.
1. Der ausgerechnete Wert für L1 kommt nur zustande weil ich mehrmals händisch in den Javascripts eingegriffen habe. Dies bedeutet, dass bei Eingabe der anderen Messwerte (L2, L3, L1-L2 usw.) aus deiner Exceltabelle nicht der richtige Wert ausgerechnet wird. Damit hatte ich aber auch nicht gerechnet. D.h. hier müsste programmiertechnisch noch erhebliche nachgebessert werden. Für jemanden der sich in der Javascriptprogrammierung sehr gut auskennt ist es sicher ein Kinderspiel. Ich muss da leider aus zeitgünden und fehlenden Programmierkenntnisse passen. Ich weiß nicht wie es um deine Programmierkenntnisse steht.
2. Das Zahlenpaar für L2 kann nach meinem Verständnis nicht stimmen. Für L2 steht im zweiten Modbusregister ein negativer Wert. Die Zahlen müssten eigentlich immer ohne Vorzeichen sein.
Mein Schmierpapier mit dem Rechenweg einzuscannen und hier hochzuladen halte ich weiterhin für sinnlos. Selbst ich komme nicht immer auf Anhieb mit den Handaufzeichnungen klar. Da ich nicht immer händisch ein ganzes DINA4 Blatt ausfüllen wollte, habe ich gestern damit begonnen den Rechenweg in deiner Exceldatei abzubilden. Mich würde nämlich noch interessieren, warum in den Modbusregister Negativwerte stehen, bzw. was dort gemäß dem erlenten Rechenweg stehen müsste.
Garf
-
Hallo Fizzo361,
bist du mit deinem Projekt für die Umrechnung weiter gekommen?
Ich musste mich auch noch einmal mit dem Thema auseinander setzen. Ich habe mir Ende letzten Jahres noch div. Wasserzähler mit Impulsausgang einbauen lassen. Jetzt stand ich vor dem Problem die Zählerstände per Modbus übertragen zu können. Im Moment reicht ein 16 bit Register noch aus, aber spätestens bei einem Zählerstand von größer 65535 wäre dann Schluß. Da die Zähler auch den Literverbrauch anzeigen, müssen ebenfalls noch drei Nachkommastellen mit verarbeitet werden. Und schon war ich wieder Mitten drin im Thema IEEE 754 und der Konvertierung von Fließpunktzahlen. Allerdings muss ich die Messdaten im 32 bit Format in die Modbus Register schreiben und nicht auslesen.
Dies habe ich heute soweit hinbekommen. Für ganz große Zahlen auch im 64 bit Format verteilt auf vier Modbus Register. Ganz so einfach wie gedacht war es nicht, denn die Programmierung in Javascript hat schon so seine Tücken. Aber nun funktioniert es soweit erst einmal fehlerfrei.
Heute Nachmittag habe ich mich dann noch einmal deinem Auslesproblem gewidmet. Auch hier gab es, Dank Javascript, zwei Stolperstellen zu überwinden. Für das Rückrechnen der binären Nachkommastellen konnte ich keine fertigen Funktionen finden und für das Abrunden der Fließpunktnachkommastellen auf drei Stellen ebenfalls nicht. Hierdurch bedingt ging dann noch der ganze Nachmittag für die Programmierung drauf.
Jetzt scheint aber auch dies fehlerfrei zu funktionieren.
Garf
-
Hallo, hatte ein ähnliches Problem mit einem 16 bit signed float.
Habe die Lösung gepostet siehe Beitrag
16 bit signed Float einlesen über den Node-red Modbus
MfG
Jean
-
Jetzt scheint aber auch dies fehlerfrei zu funktionieren. `
Na ja, so ganz fehlerfrei hat es dann doch nicht funktioniert. Ich lese seit dem Wochenende den Außentemperaturmesswert aus einem Regler ein. Dabei musste ich leider feststellen, dass es mir bei Zahlenwerte < 1 falsche oder gar keine Werte mehr in Node-Red angezeigt wurden. Da musste ich noch einmal ran und im Programm noch so einiges nachbessern.Jetzt scheint es soweit zu funktionieren.
Aber vielmehr würde mich mal interessieren was User Jean hier http://forum.iobroker.net/viewtopic.php?f=32&t=11518 für eine Javascript-Funktion verwendet.