TIA INT LOW- und HIGHWORD verknüpfen und wandeln nach REAL

gochtel

Level-1
Beiträge
100
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,
für die SCL Fachgemeinde sicher eine einfache Übung. Für mich als Anfänger im SCL etwas schwierig. Darum bitte ich euch um Hilfe. Ich habe 2 INT Variablen. 2 Werte LOW und HIGH Word, welche ich zusammenbringen muss und als REAL-Wert darstellen möchte. Ich dachte da an sowas wie ich schieb das HI_WORD 16 Stellen und verknüpfe dann bitweise mit dem LO_WORD. Das Ergebnis dann wandeln nach REAL.
Ist das der richtige Ansatz? Oder gibt es gar eine Funktion dafür? Wie kann sowas aussehen?

Vielen Dank
Ich nutze TIA V16
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe 2 INT Variablen. 2 Werte LOW und HIGH Word
Warum schreibst Du "2 INT Variablen"?

Wo kommen die Words her? War das vielleicht schon ein 32-Bit-REAL, der einfach nur in 2x 16-Bit-Words zerschnitten wurde? Dann darf da auch nichts gewandelt werden, sondern die beiden Teil-Words müssen einfach nur wieder zusammengebastelt werden.

Möglicherweise gibt es tatsächlich schon irgendwo etwas fertiges dafür, doch für einen Fachmann dauert die Suche danach bestimmt länger als schnell eine Einzeiler-Formel zu schreiben.
Welche CPU hast Du? Danach richtet sich, welche Lösungen möglich sind.

Code:
#temp_DWord.%W1 := #Word_1;
#temp_DWord.%W0 := #Word_2;
#MyReal := DWORD_TO_REAL(#temp_DWord);

//oder
#MyReal := DWORD_TO_REAL( SHL(IN:=WORD_TO_DWORD(#Word_1),N:=16) OR #Word_2);

//oder
#MyReal := DWORD_TO_REAL( DINT_TO_DWORD(#Int_1 * 65536 + #Int_2) );

//...

Harald
 
Bitweises Verküpfen ist nicht nötig.
In SCL reicht ein simples "OR LO_WORD".
Ach Dieter, das byteweise, wortweise, doppelwortweise, u.s.w. Verknüpfen per AND, OR, XOR, u.s.w. wird doch allgemeinüblich als bitweises Verknüpfen bezeichnet! Irreführenderweise, wie ich allerdings auch finde. Du hast Recht, ein simples OR reicht und klingt vor allem lange nicht so schweisstreibend. ;)
 
Danke, die Bsp. haben mir sehr geholfen. Ich hatte mir mit der Bitschieberei schon was gebastelt nur etwas umständlicher. ansonsten kläre ich gerade wie sich der Realwert zusammensetzt. Sprich ob der 32Bit Wert in die zwei INT werte zerschnitten wurde. CPU ist eine 1500er
 
Vermutlich keine INTs sondern eher WORDs, sonst ...
Ja, die Aufgabenstellung ist vermutlich irreführend bis falsch formuliert. Wenn tatsächlich aus zwei INT-Zahlen eine REAL-Zahl gemacht werden soll, so kann das eigentlich nur bedeuten, dass die eine INT-Zahl die Mantisse und die andere den Exponenten enthält. Glaskugel, bleib wachsam! ;)

PS:
Hatten wir nicht kürzlich erst einen Thread, in dem es auch darum ging, zwei Worte (oder 4 Byte?) in der richtigen Reihenfolge zusammenzusetzen und das so entstandene DoppelWort als REAL-Zahl zu interpretieren?
 
Zuletzt bearbeitet:
Danke, die Bsp. haben mir sehr geholfen. Ich hatte mir mit der Bitschieberei schon was gebastelt nur etwas umständlicher. ansonsten kläre ich gerade wie sich der Realwert zusammensetzt. Sprich ob der 32Bit Wert in die zwei INT werte zerschnitten wurde. CPU ist eine 1500er

Woher bekommst du die Werte.
Das Aufteilen einer Real gibt es bei div. Modbus-Geräten
 
nein, lt. telegrammbeschreibung des herstellers handelt es sich tatsächlich um zwei INTs.
Na ja, auch Hersteller(Angaben) sind nicht unfehlbar. Die Beschreibungen/Datenblätter werden oft erst dann verständlich, wenn man durch Experimente etwas Licht ins Dunkel bringen konnte.
Oft ist es "nur" Unbeholfenheit, Unwissenheit, Nachlässigkeit der Übersetzer.
Wenn man mehrere Sprachen "halbwegs" versteht, sollte man sich auch mal Beschreibungen in anderen Sprachen ansehen.
Wir haben damals sehr schnell die für uns bestellten, deutschen Exemplare der Handbücher zur Seite gelegt, als wir zufällig entdeckt hatten, dass die für den Kunden bestellten, englischen Exemplare bei weitem nicht so rätselhaft waren ...
Könnte mir auch vorstellen, das für einen HardwareHersteller die Bezeichnungen INT und WORD gleichbedeutend sind, weil mit beiden Bezeichnungen 16-Bit-Einheiten gemeint sind.

Langer Vorrede kurzer Sinn: hast Du eine oder mehrere pdfs, die Du hier hochladen könntest? Oder einen Link auf die entsprechenden Infos?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da hast du durchaus recht. Ich habe jetzt die Erläuterung vom Hersteller erhalten. Es handelt sich am Ende um ein DINT, welches in 2 INT geteilt übertragen wird. Anbei zwei Bilder zur Erklärung.
TG_Zusammensetzung_01.jpg
TG_Zusammensetzung_02.jpg

Ich komm also mit der Variante, ich schieb das HI-INT 16Bit und addiere das LO-INT dazu zum Ziel. Dann sollte doch auch mit DINT_TO_REAL eine Wandlung nach REAL drin sein.
 
Es handelt sich am Ende um ein DINT, welches in 2 INT geteilt übertragen wird.
Klares jain. Es ist ein DINT, welches in zwei Worte aufgespalten wird. Für das höherwertige Wort kann man durchaus die Bezeichnung INT durchgehen lassen. Für das niederwertige Wort jedoch nicht, weil es für sich betrachtet nicht als Zahl in der ZweierkomplementDarstellung interpretiert werden kann.
 
Ich habe jetzt die Erläuterung vom Hersteller erhalten. Es handelt sich am Ende um ein DINT, welches in 2 INT geteilt übertragen wird. Anbei zwei Bilder zur Erklärung.
Anhang anzeigen 50829
Anhang anzeigen 50830
Das ist so nicht korrekt. Der DINT wird nicht in 2 INT geteilt sondern in 2 WORD (typfreie Bitfolgen!)
(wenn der "LO-INT" ein INT wäre, dann würde das höchste Bit des LO-INT dem Vorzeichen entsprechen - tut es aber gar nicht :cool: )

Ich komm also mit der Variante, ich schieb das HI-INT 16Bit und addiere das LO-INT dazu zum Ziel. Dann sollte doch auch mit DINT_TO_REAL eine Wandlung nach REAL drin sein.
Nein, so kannst Du das nicht machen. Der SCL-Compiler würde das LO-INT falsch addieren wenn da das höchste Bit gesetzt ist.
Du musst zuerst die 2x 16-Bit-Bitfolgen (WORD!) zur 32-Bit-Bitfolge (DWORD!) zusammensetzen, das Ergebnis als DINT erklären und dann das DINT in REAL umwandeln.
Code:
#MyReal := DINT_TO_REAL(DWORD_TO_DINT( SHL(IN:=WORD_TO_DWORD(#HI_Word),N:=16) OR #LO_Word ));

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
echt krass :cool: ja ihr habt recht. man oh mann, kann man das nicht einfach als realwert übertragen, dann hört diese zusammenbastelei auf. :p nochmal danke für eure ausdauer! :s12:
 
Man muß nicht unbedingt basteln.
Ich hatte Dich gleich in Beitrag #3 gefragt, wo Deine beiden "INT"/Words herkommen.
In Modbus werden Mehrbit-Datentypen als 16-Bit-Register (Word!) übertragen. 32-Bit-Datentypen (oder noch größere) werden als mehrere aufeinanderfolgende Register/Words übertragen. Eine Übertragung direkt als REAL geht so nicht. Irgendwie erscheinen doch die beiden Words in Deinem Programm (vom Modbus-Client-Baustein). Weil die Byte-Reihenfolge (endianness) von Modbus und S7 übereinstimmt, sollte man auch mittels AT (oder durch passende Deklaration) direkt die 4 zusammenhängenden Bytes der 2 Words "am Stück" aus der Modbus-Empfangsnachricht/Struktur lesen können ohne zusammenbasteln zu müssen.

Harald
 
Zurück
Oben