Hallo,ie
mit meinem Revolution Pi Connect möchte ich verschiedene Daten aus einem Siemens Sentron PAC 4200 via Modbus TCP auslesen. Soweit so gut, die Verbindung steht, mit PiCtory konnte ich auch den Modbus MAster anlegen und über PiTest die Register einzeln auslesen.
Zu meiner ersten Frage, wie kann man ein Doppelregister auslesen? Wenn ich in PiCtory bei den erweiterten Einstellungen des Modbus Masters 2 Register in die Anzahl schreibe, und über PiTest auslese, wird mir nur in 2 Byte langer Wert angegeben.
Und zweitens kommen jedoch ganz abstruse Werte bei den Messungen heraus, welche nicht stimmen können. Deshalb telefonierte ich mit der Firma Siemens, diese sagten mir, dass es sein kann, das mein Revolution Pi die Bytes dcba liest, das Siemens Sentron sie jedoch abcd schickt.
Kann das auslesen vielleicht in einer eigens für das Sentron angelegten RAP-Datei eingestellt werden?
Vielen Dank im Vorraus und freundliche Grüße
MichaelK
Register Bit-Reihenfolge einlesen, Doppelregister auslesen
Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen
Hallo MichaelK, Modbus verwendet 16Bit Register im Format Big Endian.
Wenn Deine Daten mehr als ein Register umfassen, dann musst Du diese in Deiner Anwendung richtig zu interpretieren.
Mit Python funktioniert die Konvertierung eines Int in das Big Endian Format so:
Hier ist die Quelle.
Eine Idee ist dass Du erstmal mit der Software QModMaster die Register z.B. mit Read Multiple Registers ausließt und schaust,
wie die Daten zu interpretieren sind.
Hier gibt es ein Video, das beschreibt wie Du das machen kannst
Tutorial 20 – Modbus TCP Master
Du kannst jedoch eine Variable definieren z.B. int32 und diese dann z.B. mit Python befüllen.
Wenn Deine Daten mehr als ein Register umfassen, dann musst Du diese in Deiner Anwendung richtig zu interpretieren.
Mit Python funktioniert die Konvertierung eines Int in das Big Endian Format so:
Code: Select all
import struct
print struct.pack('>I', your_int)
Eine Idee ist dass Du erstmal mit der Software QModMaster die Register z.B. mit Read Multiple Registers ausließt und schaust,
wie die Daten zu interpretieren sind.
Hier gibt es ein Video, das beschreibt wie Du das machen kannst
Tutorial 20 – Modbus TCP Master
Wäre natürlich denkbar. Doch auch dort kommst Du um diese Applikationslogik nicht herum.Kann das auslesen vielleicht in einer eigens für das Sentron angelegten RAP-Datei eingestellt werden?
Du kannst jedoch eine Variable definieren z.B. int32 und diese dann z.B. mit Python befüllen.
Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen
Hallo dirk,
das Problem ist genauso aufgetreten, wie du es beschrieben hast. Nachdem ich die beiden 16bit UInt zu einem 32bit single precision Float zusammengeführt habe, hat alles ohne Probleme funktioniert.
Falls noch jemand das selbe Problem haben sollte, der Code lautete bei mir wie folgt:
Grüße Michael
das Problem ist genauso aufgetreten, wie du es beschrieben hast. Nachdem ich die beiden 16bit UInt zu einem 32bit single precision Float zusammengeführt habe, hat alles ohne Probleme funktioniert.
Falls noch jemand das selbe Problem haben sollte, der Code lautete bei mir wie folgt:
Code: Select all
// Create a buffer
var buf = new ArrayBuffer(4);
// Create a data view of it
var view = new DataView(buf);
// Write the ints to it
view.setUint16(0, msg.payload.data[0]);
view.setUint16(2, msg.payload.data[1]);
// Read the bits as a float; note that by doing this, we're implicitly
// converting it from a 32-bit float into JavaScript's native 64-bit double
msg.payload.Float = view.getFloat32(0);
// Done
return msg;
Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen
Hi Michael, vielen Dank für Dein positives Feedback und die ausführliche Dokumentation. Das hilft allen anderen, klasse.