Autor Beitrag
Steve90211
Hält's aus hier
Beiträge: 15

Win XP, Win 7
Delphi 2007 Prof., Visual Studio 2008 Prof.
BeitragVerfasst: Do 29.04.10 16:42 
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?)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP, Win 7
Delphi 2007 Prof., Visual Studio 2008 Prof.
BeitragVerfasst: 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 :)

_________________
lg Stefan aka TeronG
-CoDeSys OH zu XOR: Entspricht der Norm, jedoch nicht unbedingt der Erwartung.