Modbus Formatierung Little Endian

Jango86sn

Level-1
Beiträge
17
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes SPS-Forum,

ich brauche mal eure Hilfe bezüglich Modbus.
Ich habe Modbus Sensoren von NTI die verschiedene Temperaturen ausgeben. Das Format ist: 32 Bit Float, Little Endian.
Ausgelesen habe ich das mit ModBus Poll (siehe Anhang).
Die Kommunikation zu dem Sensor funktioniert.
Jetzt habe ich versucht die Werte in "REAL", "WORD", "DWORD" oder als Array einzulesen aber ich scheitere an der Formatierung.
Über die WagoSysPlainMem habe ich versucht die "WORD" oder "DWORD" in Byte's aufzuteilen und die Reihenfolge zu ändern aber es kommt einfach nichts sinnvolles raus.

Habt ihr vielleicht eine Lösung oder einen Tip wie ich dieses Problem gelöst bekomme?

Vielen Dank schon mal für eure Hilfe.
 

Anhänge

  • Bildschirm­foto 2023-06-05 um 09.43.36.png
    Bildschirm­foto 2023-06-05 um 09.43.36.png
    229,8 KB · Aufrufe: 26
Hallo Jango86sn,
ich habe hier mal ein Beispielprojekt angehängt, bei dem mehrere Möglichkeiten gezeigt werden, wie du zwei Register in ein Real umwandeln
kannst. Vielleicht hilft das schon weiter.
 

Anhänge

  • 2 Worte zusammensetzen_ST+CFC.zip
    476,2 KB · Aufrufe: 21
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Wert 3527492854 -> 16#d2 41 44 f6
passt nicht zu 27,1 -> 16#41 d8 cc cd

Bist du sicher das du die richtigen Register ausliest.
Vielleicht um eins verrutscht?

Ich habe die Register im Modbus-Slave wie oben im Modbus Poll zu sehen zugewiesen. Ich habe aber auch schon verschiedene Register durchprobiert.
Mit welchem Variablentyp muss ich denn die Werte einlesen? REAL, weil es ein Float ist?

Im Datenblatt steht folgendes: The values of all sensors are in IEEE 32-bit Floating Point Little Endian format. For this reason, two 16-bit registers are used torepresent the value of each sensor. The format is IEEE 32-bit Floating Point Little Endian (the order of bytes is 1,2,3,4).

Das heißt ja eigentlich, das die Byte Reihenfolge nicht gedreht werden muss.
 
Zuletzt bearbeitet:
REAL, weil es ein Float ist?
In deinem Fall ist ein REAL das gleiche wie ein Float.

Das heißt ja eigentlich, das die Byte Reihenfolge nicht gedreht werden muss.
Der Wert 3527492854 -> 16#d2 41 44 f6
passt nicht zu 27,1 -> 16#41 d8 cc cd
Anhand deiner Beispiel Daten siehst du das es (zumindest momentan) nicht an der Byte Reihenfolge liegt.
Du kannst die Bytes in 16#d24144f6 vertauschen wie du willst, da kann kein real mit 27,1 rauskommen.


EDIT:
16#41 d2 f6 44 wäre als Real 26,370246887207.
Wäre der Wert plausibel?

D.h. 1. mit 2. Byte tauschen und 3. mit 4. Byte tauschen.
 
In deinem Fall ist ein REAL das gleiche wie ein Float.



Anhand deiner Beispiel Daten siehst du das es (zumindest momentan) nicht an der Byte Reihenfolge liegt.
Du kannst die Bytes in 16#d24144f6 vertauschen wie du willst, da kann kein real mit 27,1 rauskommen.


EDIT:
16#41 d2 f6 44 wäre als Real 26,370246887207.
Wäre der Wert plausibel?

D.h. 1. mit 2. Byte tauschen und 3. mit 4. Byte tauschen.
Wie rechnest du denn nach Real um? Sorry falls die Frage dumm sein sollte.

Das werde ich am Mittwoch nochmal testen. Ich werde mal ein Testprogramm machen, wo ich mir einfach mal Register 0-30 auslese und versuche einen plausiblen Wert zu bekommen.

Vielen Dank für deine Mühe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie rechnest du denn nach Real um?
Da wird nichts umgerechnet. Es wird einfach das Bitmuster genommen und als real interpretiert.
Ich weiß nicht ob es dafür in codesys eine Funktion gibt?
Ich denke aber es wird so sein wie in twincat. Dort kann man es mit memcpy machen.
Vorsicht: dword_to_real macht in twincat aus dem Wert des dwords einen real. Das möchtest du in deinem Fall aber nicht. Du willst das Bitmuster in einen real kopieren und nicht den Wert übernehmen.

Als Anmerkung noch:
Bei Siemens übernimmt dword_to_real das Bitmuster und nicht den Wert...
 
Da wird nichts umgerechnet. Es wird einfach das Bitmuster genommen und als real interpretiert.
Ich weiß nicht ob es dafür in codesys eine Funktion gibt?
Ich denke aber es wird so sein wie in twincat. Dort kann man es mit memcpy machen.
Vorsicht: dword_to_real macht in twincat aus dem Wert des dwords einen real. Das möchtest du in deinem Fall aber nicht. Du willst das Bitmuster in einen real kopieren und nicht den Wert übernehmen.

Als Anmerkung noch:
Bei Siemens übernimmt dword_to_real das Bitmuster und nicht den Wert...

Ich habe jetzt eine Funktion in der OSCAT Bibliothek gefunden (DW_TO_REAL) die das Bitmuster kopiert. Das werde ich morgen testen und berichten.
 
Ja, die OSCAT Function DW_TO_REAL kannst Du verwenden, um das Bitmuster aus einer DWORD-Variable in eine REAL-Variable zu kopieren. Das kann man mit einem Pointer machen oder aufwendiger mit MEMCPY oder ab Codesys 3 auch mit einer UNION. Das Problem wurde hier im Forum schon so oft angefragt, daß man auch hier einfache Lösungen finden kann. Einfach mit der Forumssuche nach "codesys dword real" suchen. z.B.:
Function MB_DW_TO_REAL (mit Word-Tausch)
UNION und Pointer-Variante

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, die OSCAT Function DW_TO_REAL kannst Du verwenden, um das Bitmuster aus einer DWORD-Variable in eine REAL-Variable zu kopieren. Das kann man mit einem Pointer machen oder aufwendiger mit MEMCPY oder ab Codesys 3 auch mit einer UNION. Das Problem wurde hier im Forum schon so oft angefragt, daß man auch hier einfache Lösungen finden kann. Einfach mit der Forumssuche nach "codesys dword real" suchen. z.B.:
Function MB_DW_TO_REAL (mit Word-Tausch)
UNION und Pointer-Variante

Harald
Ja, da hast du bestimmt recht, nur fehlte mir ein Ansatz zu Lösung.
 
In deinem Fall ist ein REAL das gleiche wie ein Float.



Anhand deiner Beispiel Daten siehst du das es (zumindest momentan) nicht an der Byte Reihenfolge liegt.
Du kannst die Bytes in 16#d24144f6 vertauschen wie du willst, da kann kein real mit 27,1 rauskommen.


EDIT:
16#41 d2 f6 44 wäre als Real 26,370246887207.
Wäre der Wert plausibel?

D.h. 1. mit 2. Byte tauschen und 3. mit 4. Byte tauschen.
Vielen Dank für deine Hilfe.

Das Problem ist gelöst, ich habe jetzt die Bit Reihenfolgen so getauscht wie du geschrieben hast und das Bitmuster in einen REAL kopiert.

Da wäre ich nie drauf gekommen, das DWORD_TO_REAL und DW_TO_REAL (aus der OSCAT) NICHT das selbe ist.

Vielen Dank auch nochmal an die anderen Helfer.
 
Zurück
Oben