NEWS
Modbus - Erste Schritte
-
Ich möchte z.B. den Wert 658519 auf Adresse 14288 schreiben:
Bild 001.png `
Danke. Gefixt. -
Hi Bluefox,
super Arbeit. Sieht sehr gut aus. Ich werde jetzt am WE sicherlich mal intensiver testen können, wo es mal langsam läuft.
-
Ich vermute immer noch nen kleines Problem bei den BYTE Adressen.
Ich glaube, dass die mit nem Update kamen, da es mal ging.
Adressen in der WAGO:
Folgendes kommt in ioBroker an:
Wireshark:
-
Es fehlt noch, wie du das im IoB konfiguriert hast.
Gibt es überhaupt Byte Adressen???
In IoB gibt die nicht.
-
wie die anderen funktionierenden auch Signed 16 Bit (Little Endian).
EDIT: Komisch ist, dass die Daten auch im Modbus Master Simulator "falsch" angezeigt werden.
EDIT2: Ich habe mir mal schnell nen Script in PHP geschrieben.
Benutzt habe ich readMultipleRegisters() aus folgender Library https://github.com/adduc/phpmodbus
-
Ich muss ehrlich sagen, ich verstehe es jetzt wenig.
Wenn ich 65535 als Signed LE Int16 behandle, dann kommt -1 raus.
65535 => 0xFFFF => -1(signed) oder 65535 (Unsigned)
65280 => 0xFF00 => -255(signed) oder 65280 (unsigned)
Ich habe trotzdem noch (u)int8 eingebaut. Dein fall sollte Uint8(Big endian) sein
-
Hi, auf dem ersten Blick ändert sich leider nichts. :?
Die Werte bleiben gleich dem 16 Bit. Habe auch die anderen 8Bit Möglichkeiten ohne Erfolg durchgetestet.
Konntest du die LIB einmal anschauen, was die anders macht, wie dein Adapter?
-
Wie hast du deine Werte konfiguriert?
Bei mir geht es.
-
Auch so, wie bei dir
EDIT: Wenn ich den Host Neustarte, dann nimmt er es auch und ich sehe bei 8Bit Big Endian den richtigen Wert.
Nichts desto trotz ist es ja in der Wago ein und der gleiche Datentyp und man muss aktuell immer testen, welchen Typ man in ioBroker nimmt. Denn endweder geht es mit 8Bit oder 16Bit.
In meinem PHP Script kann ich es doch auch sauber auslesen und vor einigen Tagen klappte es auch in ioBroker noch einwandfrei. Meines Erachtens ist noch irgendwo im Adapter ein Bug. Leider steige ich nicht hinter denen Code und kann es auch nicht sauber debuggen
EDIT2: Was anderes wie den Wert 255 kennt er bei 8Bit bei mir aber auch nicht :lol: Unabhängig was in der Wago auf der Adresse hinterlegt ist.
1534_bild001.png -
Hilft das hier vielleicht?
Links der Simulator - kennst du ja
Rechts die in der Wago hinterlegten Werte in der LIVE Ansicht.
1534_bild001.png -
Ich habe jetzt so gemacht wie bei dir. Slave Simulator liest gleiche Werte.
Bei mir GEHT alles.Ich habe nichts geändert, aber update mal vom git noch mal und starte Adapter neu.
Irgendwo muss doch der Fehler liegen.
-
Hallo,
hat schonmal jemand versucht den Energiezähler SDM630 über modbus RTU anzubinden?
Ich habe da so meine Probleme mit. Siehe hier: http://forum.iobroker.net/viewtopic.php?f=8&t=3994
Wenn da jemand eine idee hat wäre das toll.. momentan gehe ich über den umweg der umsetzunf von Modbus RTU nach Modbus TCP mittels http://mbus.sourceforge.net/index.html würde das mir aber lieber sparen.
-
ich komme einfach nicht dahinter.
Nun sieht es bei mir so aus. Das verwunderliche ist eben, dass es in meinen Testscripten immer funktioniert. Es werden die korrekten Werte angezeigt.
Habe die Daten aus Radzio mal in Ananas eingegeben und eine neue Modbus Instanz auf den Ananas Server eröffnet. Dort bekomme ich das gleiche Ergebnis. Kann man also nachstellen.
1534_bild001.png
1534_bild002.png -
So, ich glaube ich habs:
https://github.com/ioBroker/ioBroker.mo … in.js#L355
an dern in:
if( (offset * 2 + 1)%2 == 1) return buffer.readUInt8(offset * 2); else return buffer.readUInt8(offset * 2 + 1);
Ergebnis:
Habe einfach mal den 8Bit Datentyp dafür missbraucht, auch wenn er dafür nicht gedacht ist, aber mir ging es erstmal darum, den Fehler zu finden. 8-)
Das ganze müsste auch noch aufs schreiben portiert werden. Der Akku vom Notebook ist nur jetzt leider leer und das Netzteil nicht vor Ort :?
-
(X * 2 +1) % 2 = 1
Immer.
D.h du hast dann falsches Typ benutzt.
Es ist Little endian. 8 bit.
-
Nein, die anderen Typen funktionieren auch nicht. Es klappt NUR mit meinem Script.
-
Du verstehst aber dass
(X * 2 +1) % 2 = 1 % 2 = 1
oder?
D.h es wird immer diese Zeile aktiv:
buffer.readUInt8(offset * 2);
Und genau so eine Zeile steht bei uint8le
Das kann man sogar auf deinem Bild sehen.
D.h. dass uint8le nicht geht, oder … k. A.
-
Eben nicht. Er prüft ja erst, ob offset*2+1 Durch 2 Teilbar ist.
Wenn ja, dann
return buffer.readUInt8(offset * 2);
wenn nicht, dann
return buffer.readUInt8(offset * 2 + 1);
ich könnte natürlich bei jeder zweiten Adresse den Typ ändern (zwischen LE und BE), aber das ist ja nicht Sinn der Sache
-
Eben nicht. Er prüft ja erst, ob offset*2+1 Durch 2 Teilbar ist. `
Offset =0, 1%2 =1Offset =1, 3%2 =1
Offset =2, 5%2 =1
Offset =3, 7%2 =1
…
Muss ich weiter machen?
-
Moin Bluefox - jetzt wo ich es auf nem Blatt Papier gegenrechne hast du recht :?
Und ich habs getestet - was soll ich sagen - es klappte natürlich.
Und ich schwöre, das Szenario hatte ich vorher bestimmt schon 5x durchgehabt. Wieso sonst hätte ich mir 5-6 Stunden Zeit nehmen sollen, um meine oben präsentierte Lösung zu erarbeiten :lol:
Ich vermute das Problem in der Objektansicht im ioBroker Backend. Ich habe das Gefühl, dass sich hier die Werte manchmal einfach nicht aktualisieren. Gerade dann oder nur dann, wenn ich eben an den Typen rumspiele. Ich sehe zwar schön, wie Sie beim Neustart des Adapters grün werden, der Wert aber bleibt manchmal der gleiche. Dann muss man nen Seitenreload machen oder den Browser komplett neu starten.
Momentan passt es jedenfalls, wie du sagtest uint8le.