Seite 1 von 2

Modbus RTU Float 32 bit schreiben

Verfasst: Freitag 8. März 2013, 14:21
von Joergschen
Hallo liebe Profilab-Gemeinde,
ich bin ein aktiver nutzer der Hard- und Software von Abacom. Ich muss sagen es läuft bis jetzt alles bestens. Ich habe im Moment ein Projekt wo ich mit dem Modbus RTU arbeite. Auslesen aller Werte ( 16 bit Word ) und auch Analogwerte ( 32 bit float ) klappen, dank diesem Forum super. Jetzt habe ich aber das Problem, das ich gerne Analogwerte schreiben möchte.

Man sollte ja nur das High und Low Byte aus einer Dezimalzahl errechnen und Schwups es würde funktionieren. Doch an dieser Stelle verzweifel ich. Ich habe schon soviel über Ieee 754 gelesen das ich mittlerweile nen Blackout habe :).

Würdet oder könntet ihr mir behilflich sein ? Ein Makro, oder Lösungsansätze wären super.

Zusammenfassung:
Gesucht: Makro / Schaltung in der man Dezimale Zahlen ( Sollwerte für Temperatur Feuchte, etc. ) eingibt und am Ende in IEEE 754 32 bit umrechnen lassen kann. Praktisch ein Gegenstück zu dem Makro ( das hier schon gebastelt wurde ) zum auslesen dieser Werte.

Vielen dank im voraus für euere Mühen :)
MFG Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Freitag 8. März 2013, 16:36
von tom_g
Hallo Jörg,

zunächst ein Hinweis:
PL speichert seine floats als 80bit Werte (extended floats)

Ich bin auch kein Mathematiker, und kann Dir auf Anhieb nicht nennen, wie die Präzision dieser Zahl reduziert dargestellt wird.

Aber ich denke, Du brauchst Zugriff auf Bitebene. Die kann m.M. nach nur durch DLL-Hilfe gelingen.

Ich hatte da mal was programmiert (in Euphoria), was die Umrechnung von extended float in double float und umgekehrt ausführt. Ob es Dir was nützt ? Kannst Du DLLs für ProfiLab programmieren ? Wenn Du Interesse hast, kannst Du es ja sagen, dann kann ich den Code"snippet" mal posten.

Viele Grüsse von Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Freitag 8. März 2013, 17:05
von Joergschen
Hallo Tom,

nee leider kann ich keine DLL programmieren. Ich lese über einen Modbusconverter ( Modbus to Usb ) daten aus. Das funktioniert prima mit dem Makro, was Abacom gebastelt hat. Jetzt will ich einfach eine Dezimalzahl ( Numerische Eingabe ) zurückschicken. Das heisst das Makro müsste jetzt das Gegenteil machen :). Und da hänge ich total fest. Vielleicht gehts auch wirklich nicht ohne DLL, dann hätte ich ein "kleines" Problem :)

Aber vorab schonmal vielen Dank für deine Hilfe und deine Mühe

mfg
Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Freitag 8. März 2013, 18:22
von tom_g
Hoi Jörg,

kannst Du die Auflösung (Nachkommastellen) und den Wertevorrat denn definieren ?
Z.B 99999.999 = 8 Stellen, 3 Nachkommastellen;
dann könntest Du vielleicht mit numerischem Scaling etwas anfangen, d.h

Eingabe * 1000 = Integer, welcher immer noch in den 32bit Wertevorrat passt.

Dann kannst Du die beiden high und low words einfach in PL berechnen. wa meinst Du dazu ?

Schönen Abend und Gruss Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Freitag 8. März 2013, 18:57
von tom_g
Hi,

irgendwie so meine ich das; dieser schnelle Vorschlag soll keine Lösung darstellen, aber den Weg andeuten.
Gruss Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Samstag 9. März 2013, 15:12
von Joergschen
Super Tom. Mir reichen 2 Nachkommastellen. Aber das hilft mir sehr weiter. Werde das morgen fruh mal testen. Danke für dein Engagement :)

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Sonntag 10. März 2013, 20:24
von Joergschen
Soooo. Tom dein Ansatz hat mich etwas näher gebracht, aber ich kriege es nicht hin. Ich denke, ich habe mich total verrannt.

Hier mal ein Link zu dem 32 bit lesen ( IEEE 754 nach Dezimahl ): viewtopic.php?f=21&t=933&hilit=float+lesen

Und genau das Gegenstück davon wollte ich basteln ( Dezimahl nach IEEE 754 ). Falls du mir noch helfen willst/kannst Tom wäre ich sehr dankbar :).

grüsse
Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Sonntag 10. März 2013, 21:56
von tom_g
Hoik Jörg,

mein Vorschlag hilft Dir überhaupt nicht, weil Deine ModBus-Einheiten natürlich das Minifloat (32bit FP-Format erwarten) und nicht einen 32 bit Integer, tut mir leid, für die Irreleitung.

Dann wird es nicht so leicht.
Ich würde es für mich in einer DLL machen, (mit Euphoria, das kenne ich vernünftig gut)

1. Da gibts eine Transformationsroutine float80_to_atom, sie verwandelt die Profilab(Delphi) "extended float" (80bit FP) in eine 64bit FP "atom"
2. mittels der Euphoria-function atom_to_float32 kann eine 4byte-Folge berechnet werden, welche nun Deinem Wunschformat entspricht
3. nun muss eine DLL unter Einhaltung die Konvention für das Erstellen von Profilab-DLLs hergestellt werden, diese kannst Du dann mit Dezimalwerte aus PL füttern.

Ich kann Dir eine DLL "stricken", kann Dir aber keinen festen Termin garantieren.

*Reicht es innert 1AW-Frist ?
*Ich mache es jeweils so, dass die DLLs durch PL getriggert werden müssen: d.h. sie werden zwar aufgerufen, aber die Berechnung wird nur bei steigender Triggertaktflanke ausgeführt. Diese kommt aus dem PL-Projekt, z.B. mit 10Hz Takt oder anders generiert; wäre das OK für Dich ?

Hallo Forum: Gibt es andere Vorschläge ?


Schönen Abend und Gruss Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Montag 11. März 2013, 10:54
von Joergschen
Dafür könnte ich dir nicht genug danken Tom. Zeit spielt keine Rolle. Wenn es ein Monat dauert ist das überhaupt kein Problem. :). Bin leider pragrammiertechnisch ein blutiger Anfänger. :) Danke im voraus fur deine Mühen. Gruss Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Montag 11. März 2013, 22:07
von tom_g
Hoi Jörg,

hier ist was Du brauchst. Ich hoffe, es tut.
Ich habe die Umwandlung gleich bidirektional ausgeführt, und es braucht kein Triggersignal.
Du musst die DLL wohl neu einbinden: den Funktionsblock DLL_1doppelclicken, DLL neu importieren vom Speicherort (das kennst Du ja)

Viele Grüsse:

Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:02
von Joergschen
Hi Tom, die Berechnung sieht super aus.
Vielen Dank für deine Mühen. Wäre es möglich den LSW und HSW als seperaten Ausgang zu machen ? Das heisst ich brauche ja 2 mal 16 bit Word ( HSW und LSW ) um einen Analogwert zu schreiben. In deiner DLL ist ja das LSW und HSW in 4 seperaturen Ein- und Ausgängen vorhanden. Da streikt mein Modbus :P. Aber deine Hilfe in allen Ehren !! Vielen dank das du so hartnäckig dranbleibst um einem Ahnungslosen Anfänger zu helfen :)

grüsse Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:39
von tom_g
Hi,

Die Umrechnung funktioniert simultan in beide Richtungen mit dieser DLL.
1. In_float ist eine PL-FP-Zahl, welche in das IEEE754 32bit Format umgesetzt wird und in 4Bytes rechts ansteht.
2. Wenn die 32Bit Repräsentation vorliegt (nach Auslesen aus einer entsprechenden Datenquelle), kann die FP-PL-Zahl ausgegeben werden (FP_out).
Im Beispiel hatte ich 1 und 2 zur Anschauung gekoppelt :-)

Wenn Du eine Richtung nicht benötigst, so lasse Sie offen.

So ?

Gruss Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:41
von Joergschen
Ja das ist super. Jedoch habe ich das 4 Byte problem :) Schau mal im anhang ist das Makro von PL. Das funktioniert super zum Auslesen. Das gleiche brauche ich umgekehrt. Also ich benötige nur 2 Ausgänge a 16 bit, wenn ich das so richtig interpretiere ! :)

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:44
von Joergschen
AHH OK. mom das muss ich testen :) gib mir 10 Minuten :)

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:50
von Joergschen
Super dickes Lob !!!
Funktioniert Tadelos ! Du bist bei mir ganz hoch gestiegen Thomas :)

Da ist ein Bier fällig oder 10 :)

grüsse
Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 14:59
von tom_g
Hi,

Ich helfe gerne, wenn immer ich kann.
Bleib neugierig !

Viele Grüsse von Thomas

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Dienstag 12. März 2013, 18:43
von Joergschen
So habe mal Toms Programmierkünste zu einem Makro zusammengefasst. Hiermit können alle, 32 bit Float-Daten senden über eine Eingabe als Dezimalzahl.

Danke an TOM

PS: bitte probiert das Makro aus, ob es auch funktioniert mit der DLL. Ansonsten muss sich leider jeder selber ein Makro bastelen.

mfg
Jörg

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Samstag 4. Februar 2017, 11:48
von simon24j
Hallo,
ist zwar schon ziemlich alt das Thema...
wäre es möglich die DLL/Makro so abzuändern das je 2 Register anstelle von 4Bytes eingelesen/ausgegeben werden?

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Samstag 4. Februar 2017, 14:06
von IKT
simon24j hat geschrieben:... das je 2 Register anstelle von 4Bytes eingelesen/ausgegeben werden?
Sorry, ist zum Mindesten unverständlich ... Was soll es, denn nun wirklich sein?
entweder:
2 x Reg. 16bit = 2 x 2 Byte = 32bit total Menge Daten -- eine ganz neue Baustelle!
oder:
2 x Reg. 32bit = 2 x 4 Byte = 64bit total Menge Daten -- das Ganze einfach 2 x in Projekt einbauen!

Re: Modbus RTU Float 32 bit schreiben

Verfasst: Sonntag 5. Februar 2017, 11:06
von simon24j
Hallo,

es sollen schon 32bit sein, vom Modbus liest man ja 16bit ein (2x 16bit Register für Float) wäre eben ned schlecht wenn dann das DLL auch gleich 2x 16bit Eingänge hätte...... sonst muss man wieder die 16bit aufteilen auf byte.....
Ich habs aktuell mit der normalen Float Umrechnung gelöst, da ich aber ca. 30Float werte zum umrechnen habe kommt hierbei PL schon fast an seine Grenzen und hakt dabei ziemlich oft, die Taktfrquenz geht runter auf 100Hz oder auch des öfteren auf 0Hz und steht für ein paar Sekunden.

Grüße
Simon