TIA Problem mit der Konvertierung von Sensordaten aus einem IO-Link Sensor

TomyReini

Level-2
Beiträge
7
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community,

ich stehe vor einem Problem beim Versuch, Sensordaten aus einem IO-Link Sensor zu kombinieren und die Messdaten in eine Variable zu schreiben. Ich verwende dazu das TIA Portal V16, eine Siemens S7-1500 Steuerung und einen Balluff IO-Link Master.

Gemäß den Angaben des Sensorherstellers werden die aktuellen Daten des Sensors über die IO-Link-Schnittstelle zyklisch in 20 Bytes übertragen. Diese Bytes sind in fünf Slots mit jeweils 4 Bytes unterteilt, wobei jedes Byte eine Zahl vom Typ float32 enthält. Das Zahlenformat für Gleitkommazahlen mit 32-Bit-Auflösung ist in der Norm IEEE 754 definiert.

Die Daten werden erfolgreich an der Eingangsadresse des IO-Link Masters empfangen und dort als Byte definiert (z.B. %IB92). Um die 4 Bytes zusammenzusetzen und in eine Realzahl umzuwandeln, verwende ich im SCL folgenden Code:

Temperature := REAL_TO_INT(DINT_TO_REAL(BYTE_TO_DINT(InputBytes0) + BYTE_TO_DINT(InputBytes1 * 256 + BYTE_TO_DINT(InputBytes2) * 65536 + BYTE_TO_DINT(InputBytes3) * 16777216));

Ich habe die Reihenfolge der Bytes überprüft und sie scheint korrekt zu sein. Jedoch erhalte ich als Ergebnis nicht die erwarteten 25,456°C, sondern -25678. Obwohl ich die Skalierung möglicherweise mit einem Faktor korrigieren könnte, bleibt ein kleiner Abweichungsfehler und das negative Vorzeichen bestehen.

Ich vermute, dass ich bei der Konvertierung der Bytes in eine Realzahl einen Fehler gemacht habe. Leider komme ich nicht mehr weiter und wäre über jede Hilfe oder Anregung sehr dankbar.

Vielen Dank im Voraus!
 
Hi,
Dein Zahlenformat leigt ja bereits als Real vor (4Byte) da nochmal wandeln zu wollen ist demnach falsch.

Du musst die 4 Byte nur zusammenführen.

z.B.:
Temperature.%b0 := InputBytes0;
Temperature.%b1 := InputBytes1;
Temperature.%b2 := InputBytes2;
Temperature.%b3 := InputBytes3;
ggf. müssen die Bytes vertauscht zugeortnet werden

oder einfach die Eingangsvariable direkt als real deklarieren
 
Wie sieht dass denn aus wenn man einfach eine Eingangsvariable als REAL anlegt und diese dann auf das erste Byte setzt? Oder würde sich da irgendwo ein Byteverdreher mit einbauen?
 
Danke für eure Antworten. Habe es mit dem Vorschlag
Temperature.%b0 := InputBytes0;
Temperature.%b1 := InputBytes1;
Temperature.%b2 := InputBytes2;
Temperature.%b3 := InputBytes3;

hinbekommen. Musste nur noch von einem DWord in Real konvertieren um die Richtigen Werte zu erhalten.
 
Musste nur noch von einem DWord in Real konvertieren um die Richtigen Werte zu erhalten.
Das wird so eher nicht richtig sein. Vermutlich drückst du dich nur nicht exakt aus. Der Witz an der Sache ist, dass eben nicht konvertiert werden darf, weil der Wert schon ein REAL ist. Es muss das Bitmuster, das in dem DWORD ist, 1:1 in eine REAL-Variable kopiert/übernommen werden. Dazu musstest du vermutlich in deinem Programmcode dem Compiler explizit mitteilen, dass das DWORD nicht konvertiert werden soll. Wie sieht dein Programmcode mit dem "DWord in Real konvertieren" aus?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich nicht konvertiere erhalte ich den von HEX in Dezimal umgewandelten Wert und nicht eine Dezimalzahl.
Mit der Funktion DWORD_TO_REAL der Variable Temperature erhalte ich die gleichen Werte wie aus dem Webbrowser des IO-Link Master.
 
Wenn ich nicht konvertiere erhalte ich den von HEX in Dezimal umgewandelten Wert und nicht eine Dezimalzahl.
Hexadezimal und Dezimal sind nur verschiedene Anzeigeformate eines Wertes. Bei der Umschaltung der Anzeige zwischen Hex. und Dez. wird der Wert nicht geändert/umgewandelt/konvertiert.

Mit der Funktion DWORD_TO_REAL der Variable Temperature erhalte ich die gleichen Werte wie aus dem Webbrowser des IO-Link Master.
DWORD_TO_REAL ist genau die Funktion, die dem SCL-Compiler mitteilt, dass NICHT konvertiert werden soll, sondern der Wert (das Bitmuster) im DWORD als REAL interpretiert werden soll. Siehe TIA Hilfe:
Explizite Konvertierung von DWORD
Quelle: DWORD
Ziel: REAL
Erläuterung: Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den Zieldatentyp übertragen.
 
Zurück
Oben