Modbus RTU Float 32 bit schreiben
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Modbus RTU Float 32 bit schreiben
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
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
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
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 !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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
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
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
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 !
Re: Modbus RTU Float 32 bit schreiben
Hi,
irgendwie so meine ich das; dieser schnelle Vorschlag soll keine Lösung darstellen, aber den Weg andeuten.
Gruss Thomas
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) 437-mal heruntergeladen
Curiousity makes us progress !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
Super Tom. Mir reichen 2 Nachkommastellen. Aber das hilft mir sehr weiter. Werde das morgen fruh mal testen. Danke für dein Engagement
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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
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
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
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 !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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
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
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) 453-mal heruntergeladen
-
- IEC_float32_bidir_conversion.prj
- (4.73 KiB) 430-mal heruntergeladen
Curiousity makes us progress !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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 . 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
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 . 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
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
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) 384-mal heruntergeladen
Curiousity makes us progress !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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) 385-mal heruntergeladen
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
AHH OK. mom das muss ich testen gib mir 10 Minuten
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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
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
Hi,
Ich helfe gerne, wenn immer ich kann.
Bleib neugierig !
Viele Grüsse von Thomas
Ich helfe gerne, wenn immer ich kann.
Bleib neugierig !
Viele Grüsse von Thomas
Curiousity makes us progress !
-
- Beiträge: 16
- Registriert: Donnerstag 7. März 2013, 07:03
Re: Modbus RTU Float 32 bit schreiben
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
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) 386-mal heruntergeladen
Re: Modbus RTU Float 32 bit schreiben
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?
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
Sorry, ist zum Mindesten unverständlich ... Was soll es, denn nun wirklich sein?simon24j hat geschrieben:... das je 2 Register anstelle von 4Bytes eingelesen/ausgegeben werden?
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
Gruss/regards IKT
Re: Modbus RTU Float 32 bit schreiben
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
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