Forum: PC-Programmierung Programmierhilfe Perl, WORDs nach FLOAT


von mark (Gast)


Lesenswert?

Hallo zusammen,

Ich hab ein kleines Dilemma: Ich möchte eine Lib verwenden welche es nur 
für Perl gibt (bzw. diese funktioniert eben auf Anhieb ohne großes 
drumherum). Nun kenne ich mich mit Perl mal überhaupt nicht aus.
Mein Skript (OK... das Beispiel aus der Lib) spuckt mir schon Daten auf 
der Standardausgabe aus, nur sind das 2 Wörter. Ich hätte jetzt aber 
gerne aus diesen beiden Wörtern eine Fließkommazahl gemacht.

Also dieser Teil:
1
..
2
foreach my $word (@$words) {
3
  print $word."\n";
4
}
5
..

soll eben so umgebogen werden dass die beiden Wörter kombiniert werden 
und als Fließkommazahl auf der Ausgabe landen.

Kann mir jemand dabei helfen? Google hab ich zwar bemüht, aber ich komme 
da nicht wirklich weiter wenn ich überhaupt kein Plan von Perl habe :-S

von Georg A. (georga)


Lesenswert?

Noch mal als Zusammenfassung: Du bekommst ein Array mit zwei Elementen 
zurück, das erste ist der ganzzahlige Teil, der zweite der Teil nach dem 
Komma? Also "1234" und "42" soll also 1234.42 ergeben?

Dann geht das hier:

$wert=($word[0].'.'.$word[1])+0;

Der Kram in der Klammer macht erst mal einen String mit dem Punkt drin, 
das +0 erzwingt eine Konvertierung des Strings nach Float.

von mark (Gast)


Lesenswert?

Es waren zu wenige Infos, Sorry.

Ich bekomme ein Array mit zwei Elementen, Datentyp Word.
Wenn ich jetzt eine SPS hätte (da kenne ich mich etwas besser aus), 
würde ich die beiden Wörter zu einem Doppelwort zusammenfügen und danach 
das Doppelwort in eine 32bit Fließkommazahl wandeln. Genau so 
funktioniert das auch schon auf der SPS.
Nun soll es aber auf einer Linuxkiste laufen. Das drumherum, also die 
Datenverarbeitung gibt es schon. Die ganze Zeit wurden Daten per curl 
geholt und weiterverarbeitet. nun soll das über Modbus laufen und ich 
will nur den curl Befehl ersetzen. Der Rest funktioniert ja.

Zurück zum Thema: über Modbus kommt Hexadezimal z.B.:
0x436516b7

Das Perlskript, bzw die Lib (MBclient) spuckt mir auf der Ausgabe aus:
17253
5815

Also ist die Ausgabe Dezimal

Dass eine Fließkommazahl als 2 separate Wörter ausgegeben wird liegt 
vermutlich an der 16bit Organisation von Modbus.
Als Ergebnis sollte am Ende aus obigem Beispiel ~229.09 rauskommen

von Thomas (Gast)


Lesenswert?

Hallo Mark,

so ganz auf die schnelle:

$d = 17253 * 65536 + 5815;
$hex = sprintf("%x", $d);
print unpack "f", reverse pack "H*", $hex ;
print unpack "f", reverse pack "H*", $hex ;

Gruss

Thomas

von Ralf D. (doeblitz)


Lesenswert?

mark schrieb:
> Dass eine Fließkommazahl als 2 separate Wörter ausgegeben wird liegt
> vermutlich an der 16bit Organisation von Modbus.
> Als Ergebnis sollte am Ende aus obigem Beispiel ~229.09 rauskommen

Dann probier es mal mit
  my $float = unpack('f', pack('s2', @words[1,0]));
aus. Das packt zuerst die beiden Wörter wieder zu einem 32bit-String 
zusammen und wertet diesen dann als Bitmuster eines Floats aus.

von mark (Gast)


Lesenswert?

Ralf, das hat (fast) gepasst! Vielen dank!
Lediglich ein $ hat gefehlt:
my $float = unpack('f', pack('s2', @$words[1,0]));

:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.