TIA 4Bytes in Real zusammenführen

Michael J.

Level-1
Beiträge
60
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

ich möchte gerne 4Bytes zu einem Real Wert zusammenführen.

Ich habe schon mehrer Wege versucht aber bekomme aktuell nur ein Weg hin in dem ich das über Merker Bytes durchführe.

Welche alternativen Weg gibt es das ich das das nicht über Merker machen muss? Ich will eine FB entwickeln den ich mehrfach verwenden will und da muss ich unabhängig von Merker sein.

Bei einen Real Datentyp kann ich nicht indirekt mit .%B0 zugreiffen und wenn ich einen DINT (wo der inderekte Zugriff möglich ist) verwende und diesen nach Real umwandele bekomme ich falsche Werte.


4Bytestoreal.jpg


Ich verwende TIA Potal V15.1 und eine S7/1215 mit Firmware 4.3

gruß
 
Ich denke das der Slice Zugriff auch bei Real möglich sein sollte.

Aber warum deklarierst du nicht einfach einen Real dort wo du ihn erwartest? Du kannst statt dem Bytearray Daten auch einen UDT mit bereits richtigen Inhalt deklarieren. Und statt Get_IO würde ich direkt einen UDT im Prozessabbild deklarieren.
 
Programmieren in der Krabbelkiste.

Code:
Zieldatum_Real         :=  DWORD_TO_REAL(BYTE_TO_DWORD(BYTE4) OR 
                                    SHL (IN := BYTE_TO_DWORD(BYTE3), N := 8) OR 
                                    SHL (IN := BYTE_TO_DWORD(BYTE2), N := 16) OR 
                                    SHL (IN := BYTE_TO_DWORD(BYTE1), N := 24));
 
Muss mich korrigieren, REAL kann doch keinen SLICE Zugriff. Was aber geht ist ein ARRAY_OF_BYTE als AT-Sicht auf den REAL, und dort auf die einzelnen Bytes eine Zuweisung machen.

Und zu den komischen werten mit den DINT:
myDINT.B%0 ist nicht das gleiche wie MB300 im MD300. Sieh dir das mal in der Beobachtungstabelle an.

Du könntest hier vor der Umwandlung von DINT_TO_REAL noch ein SWAP hinschreiben, dann müssten die Werte auch passen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
REAL aus 4 Bytes zusammenbauen

Achtung! Beim Zusammenfügen der Bytes darf man keine Konvertierfunktion benutzen, insbesondere nicht DINT_TO_REAL. Die Bitstrings der Bytes müssen so genommen werden wie sie sind.

So ist recht effizient jede beliebige Byte-Reihenfolge möglich:
Code:
#tmpDword.%B3 := #Byte_1;
#tmpDword.%B2 := #Byte_2;
#tmpDword.%B1 := #Byte_3;
#tmpDword.%B0 := #Byte_4;
#MyReal := DWORD_TO_REAL(#tmpDword);

Harald
 
Ich denke das der Slice Zugriff auch bei Real möglich sein sollte.

Aber warum deklarierst du nicht einfach einen Real dort wo du ihn erwartest? Du kannst statt dem Bytearray Daten auch einen UDT mit bereits richtigen Inhalt deklarieren. Und statt Get_IO würde ich direkt einen UDT im Prozessabbild deklarieren.
Danke für die Antworten!

Ich habe jetzt diese Variante genommen. Ich arbeite schon lange mit UDT's aber noch nie im direkten Zusammenhang mit dem Prozessabbild. Die anderen Lösungen hätten mir auch geholfen, aber diese Variante bedarf kein unnötiges gefrickel und macht es übersichtlicher.

Gesendet von meinem SM-G960F mit Tapatalk
 
Das Byte Array kann man auch direkt mit READ_BIG oder READ_LITTLE eingelesen, und auf den Typen Konvertieren der am Parameter DEST_VARIABLE vorhanden ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Programmieren in der Krabbelkiste.

Code:
Zieldatum_Real         :=  DWORD_TO_REAL(BYTE_TO_DWORD(BYTE4) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE3), N := 8) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE2), N := 16) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE1), N := 24));
Sehr hilfreich. Funktioniert ganz gut.
Danke schön!
 
Programmieren in der Krabbelkiste.

Code:
Zieldatum_Real         :=  DWORD_TO_REAL(BYTE_TO_DWORD(BYTE4) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE3), N := 8) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE2), N := 16) OR
                                    SHL (IN := BYTE_TO_DWORD(BYTE1), N := 24));

Sehr hilfreich. Funktioniert ganz gut.
Danke schön!
Kannst Du mal bitte den Code umschreiben, wie man tun kann, wenn man eine Reale-Wert zu 4 Byte umwandeln kann.
Danke vorab!
 
Kannst Du mal bitte den Code umschreiben, wie man tun kann, wenn man eine Reale-Wert zu 4 Byte umwandeln kann.
Echt jetzt? Scheint ja so, als ob du von dem Code, den du hier abschreibst, nichts verstanden hast...
Ich glaube nicht, dass der Kollege Draco Malfoy hier nochmal Code postet. Er war am 14 November 2021 das letzte Mal im Forum eingeloggt...

Für das Zerlegen eines REAL in 4 Byte gibt es sooo viele simple und auch umständliche Möglichkeiten, dass es sinnvoll ist, wenn du zuerst mal mitteilst, für welche CPU du den Code verwenden willst, und mit welcher Programmiersoftware du arbeitest. Am effizientesten in SCL ist die Verwendung einer AT-Sicht (Überlagerung einer REAL-Variable mit einer Struktur von 4 Bytes).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Echt jetzt? Scheint ja so, als ob du von dem Code, den du hier abschreibst, nichts verstanden hast...
Ich glaube nicht, dass der Kollege Draco Malfoy hier nochmal Code postet. Er war am 14 November 2021 das letzte Mal im Forum eingeloggt...

Für das Zerlegen eines REAL in 4 Byte gibt es sooo viele simple und auch umständliche Möglichkeiten, dass es sinnvoll ist, wenn du zuerst mal mitteilst, für welche CPU du den Code verwenden willst, und mit welcher Programmiersoftware du arbeitest. Am effizientesten in SCL ist die Verwendung einer AT-Sicht (Überlagerung einer REAL-Variable mit einer Struktur von 4 Bytes).
Ich wollte eigentlich diese Methode verwenden, aber leider hat es nicht funktioniert und mit dem Code durch Shift to left läuft.
Ich habe es versucht, andersrum mit SCL umzuprogrammieren, also. statt Byte to Dword kommt Dword to Byte, funktioniert leider nicht.

X := REAL_TO_DWORD(DWORD_TO_BYTE(Byte[0]) OR
SHL(IN := DWORD_TO_BYTE(Byte[1]), N := 8) OR
SHL(IN := DWORD_TO_BYTE(Byte[2]), N := 16) OR
SHL(IN := DWORD_TO_BYTE(Byte[3]), N := 24));
Real-Werte := X;
 
Zuletzt bearbeitet:
Da du die Nachfragen nicht beantwortest, hier eine relativ umständliche Variante der Zerlegung eines REAL in 4 Bytes:
Code:
  Byte1 := DWORD_TO_BYTE(SHR(IN:=REAL_TO_DWORD(MyRealVar), N:= 24));
  Byte2 := DWORD_TO_BYTE(SHR(IN:=REAL_TO_DWORD(MyRealVar), N:= 16));
  Byte3 := DWORD_TO_BYTE(SHR(IN:=REAL_TO_DWORD(MyRealVar), N:= 8));
  Byte4 := DWORD_TO_BYTE(REAL_TO_DWORD(MyRealVar));
 
Edit: ich kann nicht (zu ende) lesen

In der LGF Bibliothek gibts noch eine Funktion für Bytes to Dword, dann könntest du Dword zu Real konvertieren
Screenshot 2024-03-05 110357.png
 
Zurück
Oben