Programmierhilfe Perl, WORDs nach FLOAT

Gast #4150194
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
#4150213
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.
Gast #4150269
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
#4151609
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.