Entwickler-Ecke

Basistechnologien - 2 UInt16 zu einer Single


Steve90211 - Do 29.04.10 16:42
Titel: 2 UInt16 zu einer Single
Hallo

Ich habe das Problem über einen Modbus einen Real auszulesen.
Da der Modbus keine Real mag habe ich einfach die Gleitkommazahl (32bit) in 2 Words (a 16bit) Zerlegt und übertrage einfach diese.

Nun ist mein Problem, das ich die in C Sharp nicht wieder zusammen und dann in eine real/float/Single bekomme. :(

Einfach mal das 2te Word nach links schieben (<< 16) und dann das Erste dazuaddieren und mit (Single)MyUInt32 zu einer Single machen klappt ja schon aber dann habe ich nur eine sehr große Ganzzahl und nicht meine real ... *gruebel*


Habt ihr da ne idee wie das klappen könnte?

Evtl. die real bitweise setzen!? (und wenn ja dann wie?)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    //TestZahlen für 12,34 

    UInt16 word1 = 28836//16bit
    UInt16 word2 = 16709//16bit

    //UInt32 erg = Convert.ToUInt32(( word2 << 16)+word1 ); 
    UInt32 erg = (UInt32)((word2 << 16) + word1); // 1095069860  (Stimmt mit SPS überein :)
        
    Single erg2 = (Single)erg;   //<--- macht "natürlich" 1,09507 E9 und nicht 12,34


Kha - Do 29.04.10 17:07

:welcome: !

Die Daten kommen doch sicher aus einem Stream, dann würde ich BinaryReader.ReadSingle vorschlagen.

Ansonsten: Die ushorts in bytes aufteilen und damit BitConverter.ToSingle füttern.

Wie hast du die Werte überhaupt zerlegt?


Steve90211 - Fr 30.04.10 09:13

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
:welcome: !


Danke :)

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Die Daten kommen doch sicher aus einem Stream, dann würde ich BinaryReader.ReadSingle vorschlagen.

Ansonsten: Die ushorts in bytes aufteilen und damit BitConverter.ToSingle füttern.

Wie hast du die Werte überhaupt zerlegt?

Und auch danke für die Antwort. :)

Die Daten kommen je nachdem wie ich mich noch entscheide per OPC-Server zum PC oder ich nutze die MBT.dll (Modbus TCP).
In der DLL bekomme ich meine Daten als Array of Byte ...
Da könnte ich mir dann evtl ne Function ääähh Methode machen, die mit BitConverter gleich Single ausspuckt ... (oder später mit GetBytes zerlegen ...)


Zerlegen war recht einfach. Ich habe in meiner Steuerung (Wago SPS) einen Merker (real 32) z.b. auf Adresse 100 angelegt. Und dann 2 Merker (UINT mit 16 bit) auf Adresse 200 & 201 Abgefragt.


Wenn man bedenkt, dass im Speicher eh schon alles richtig steht und nur anders interpretiert werden muss, is das ganz schön viel Gefummel bis das passt. ^^


EDIT:
Wie nicht anders zu erwarten KLAPPT alles :)