Modbus RTU Float 32 bit schreiben

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Freitag 8. März 2013, 14:21

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Freitag 8. März 2013, 16:36

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
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Freitag 8. März 2013, 17:05

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Freitag 8. März 2013, 18:22

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
Curiousity makes us progress !

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Freitag 8. März 2013, 18:57

Hi,

irgendwie so meine ich das; dieser schnelle Vorschlag soll keine Lösung darstellen, aber den Weg andeuten.
Gruss Thomas
Dateianhänge
MSW_LSW_fragmentierung.prj
(5.75 KiB) 257-mal heruntergeladen
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Samstag 9. März 2013, 15:12

Super Tom. Mir reichen 2 Nachkommastellen. Aber das hilft mir sehr weiter. Werde das morgen fruh mal testen. Danke für dein Engagement :)

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Sonntag 10. März 2013, 20:24

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Sonntag 10. März 2013, 21:56

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
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Montag 11. März 2013, 10:54

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Montag 11. März 2013, 22:07

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
Dateianhänge
float_2_bytes.dll
(144 KiB) 279-mal heruntergeladen
IEC_float32_bidir_conversion.prj
(4.73 KiB) 262-mal heruntergeladen
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Dienstag 12. März 2013, 14:02

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Dienstag 12. März 2013, 14:39

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
Dateianhänge
IEC_float32_bidir_conversion_1.prj
(5.94 KiB) 226-mal heruntergeladen
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Dienstag 12. März 2013, 14:41

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 ! :)
Dateianhänge
IEEE754F.mak
(2.45 KiB) 210-mal heruntergeladen

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Dienstag 12. März 2013, 14:44

AHH OK. mom das muss ich testen :) gib mir 10 Minuten :)

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Dienstag 12. März 2013, 14:50

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

tom_g
Beiträge: 215
Registriert: Freitag 31. Oktober 2008, 14:59

Re: Modbus RTU Float 32 bit schreiben

Beitrag von tom_g » Dienstag 12. März 2013, 14:59

Hi,

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

Viele Grüsse von Thomas
Curiousity makes us progress !

Joergschen
Beiträge: 16
Registriert: Donnerstag 7. März 2013, 07:03

Re: Modbus RTU Float 32 bit schreiben

Beitrag von Joergschen » Dienstag 12. März 2013, 18:43

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
Dateianhänge
IEEE754W.mak
Dieses Makro Rechnet den Dezimal-Wert von der Numerischen Eingabe in einen 32 Bit IEEE 754 Befehl für MODBUS RTU
(2.34 KiB) 224-mal heruntergeladen

simon24j
Beiträge: 31
Registriert: Sonntag 15. Mai 2011, 14:36

Re: Modbus RTU Float 32 bit schreiben

Beitrag von simon24j » Samstag 4. Februar 2017, 11:48

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?

IKT
Beiträge: 526
Registriert: Mittwoch 4. November 2009, 18:32

Re: Modbus RTU Float 32 bit schreiben

Beitrag von IKT » Samstag 4. Februar 2017, 14:06

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!
++++++
Gruss/regards IKT

simon24j
Beiträge: 31
Registriert: Sonntag 15. Mai 2011, 14:36

Re: Modbus RTU Float 32 bit schreiben

Beitrag von simon24j » Sonntag 5. Februar 2017, 11:06

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

Antworten

Zurück zu „Thema Modbus“