Register Bit-Reihenfolge einlesen, Doppelregister auslesen

Für Themen rund um das Prozessabbild des RevPi Core
Post Reply
MichaelK
Posts: 12
Joined: 02 Apr 2020, 14:51

Register Bit-Reihenfolge einlesen, Doppelregister auslesen

Post by MichaelK »

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
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen

Post by dirk »

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:

Code: Select all

import struct
print struct.pack('>I', your_int)
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
Kann das auslesen vielleicht in einer eigens für das Sentron angelegten RAP-Datei eingestellt werden?
Wäre natürlich denkbar. Doch auch dort kommst Du um diese Applikationslogik nicht herum.
Du kannst jedoch eine Variable definieren z.B. int32 und diese dann z.B. mit Python befüllen.
MichaelK
Posts: 12
Joined: 02 Apr 2020, 14:51

Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen

Post by MichaelK »

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:

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;
Grüße Michael
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Register Bit-Reihenfolge einlesen, Doppelregister auslesen

Post by dirk »

Hi Michael, vielen Dank für Dein positives Feedback und die ausführliche Dokumentation. Das hilft allen anderen, klasse.
Post Reply