Bibliothek: floatingpointutils

2024-10-17
2024-11-21
  • SebastianRaPi - 2024-10-17

    Hallo Zusammen,

    ich versuche die Bibliothek FloatingPointUtils.compiled-library-v3 zu benutzen. leider kommt dabei folgende Fehlermeldung:

    Kein Quellcode für dieses Objekt... (siehe Anhang)

    Wie kann ich diese Bib einbinden? Kann ich diese irgendwo herunterladen?

    Mein Ziel ist es ein DWORD (float) in ein REAL umzuwandeln. ICh hoffe, dass ich dies mit der Funktion HexStrToReal machen kann.

    So wie hier:
    https://gregstoll.com/~gregstoll/floattohex/
    convert to float...

    Oder gibt es bei Codesys einen anderen Weg?

    Ich verwende v3.5 SP20 Patch 1 + (32Bit)

    Grüße
    Sebastian

     

    Last edit: SebastianRaPi 2024-10-17
  • SebastianRaPi - 2024-10-18

    Ich habe nun auch versucht durch die Installation von Codesys Version 3.5.17.0 an die Bib zu kommen... Leider auch ohne Erfolg...

     
  • eschwellinger

    eschwellinger - 2024-10-18

    naja die compiled library hast du ja - du hast halt eine exception - und dann wirst du gefragt ob du das ganze Debuggen willst.
    Die offene Bibliothek wirst du nicht bekommen - daher würde ich so vorgehen:
    Dein Projekt hier mal anhängen so das man mal draufschauen was du genau aufrufst und wie.

     
    👍
    1
  • SebastianRaPi - 2024-10-22

    danke für deine Antwort. Ich habe nun einfach ein Projekt erstellt inklusive der Bib "FloatingPointUtils, 3.5.17.0 (System)"

    Beim Auswählen einer Funktion, z.B. HexStrToReal kommt die besagt Fehlermeldung...

     
  • SebastianRaPi - 2024-11-05

    Hi, ich wollte mal freundlich nachfragen, ob es eine Lösung zu dem Problem mit der Bib gibt...

    Vielleicht weiß ja jemand, was zu tun oder zu beachten ist.

    Oder kann mir jemand sagen, ob die Bib bei ihm verwendbar ist?!?

    Danke

     
  • SebastianRaPi - 2024-11-18

    Hallo Herr Schwellinger,

    können Sie mir bitte noch einen Tip geben, wie ich eine korrekte Umrechnung von Codesys herausbekommen...

    Es geht nach wie vor um die Geschichte mit der Konvertierung einer Gleitkommazahl (lesend mit CANopen bei einem Microprozessor)

    Aus dem Input (hex value): 0x402e45a2
    würde ich nach der Konvertierung die Zahl: 2.723 erwarten...

    => Über ein Beispiel wäre ich dankbar...

    Ich hoffe sie können mir sagen, wie das funktioniert...

    Freundliche Grüße
    Sebastian

     
  • Strucc.c

    Strucc.c - 2024-11-19

    The issue s the byte order typically in this case. Can be especially problematic with floating point numbers - even more tricky if transferred with a word based protocol.

    It is a peasant way to try out the alternatives, dword order can be a-b-c-d, b-a-d-c, c-d-a-b, d-c-b-a where a is the most significant, d is the least significant byte.
    So all you need is to swap the bytes in your dword, until you get the expected result. If you don't want to mess writing code for this, I'd recommend CAA_Memory library for that:

    MEM.ReverseBYTEsInDWORD and MEM.ReverseWORDsInDWORD functions would definitively do the trick.

    Otherwise, can do like this:

    VAR
        dwIn    : DWORD := 16#11223344;
        dwOut   : DWORD;
        rOut    : REAL;
    
        pIN     : POINTER TO BYTE;
        pOUT    : POINTER TO BYTE;
    END_VAR
    
    pIN := ADR(dwIn);
    //pOUt := ADR(dwOut);
    pOUt := ADR(rOut);
    
    pOut[0] := pIN[3];
    pOut[1] := pIN[2];
    pOut[2] := pIN[1];
    pOut[3] := pIN[0];
    

    Ugly, but does the job...

     
    👍
    1

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3

  • SebastianRaPi - 2024-11-21

    @Strucc.c: thanks very mutch. Yes, I think that was the problem.

    I tried yesterday a similar function, i have found:

    IEEE32 in REAL
    
    FUNCTION IEEE32_TO_REAL : REAL
    VAR_INPUT
        IN:DWORD;
    END_VAR
    VAR
        PTREAL:POINTER TO REAL;
    END_VAR
    
    PTREAL:=ADR(IN);
    IEEE32_TO_REAL:=PTREAL^;
    END_FUNCTION
    
    
    REAL in IEEE32
    
    FUNCTION REAL_TO_IEEE32 : DWORD
    VAR_INPUT
        IN:REAL;
    END_VAR
    VAR
        PTDWORD:POINTER TO DWORD;
    END_VAR
    
    PTDWORD:=ADR(IN);
    REAL_TO_IEEE32:=PTDWORD^;
    
    END_FUNCTION
    

    http://www.oscat.de/community/index.php/topic,357.0.html

    And this works perfect.

    Now, the only thing that isn't clear is the libary "FloatingPointUtils, 3.5.17.0 (System)"... For me, the libary doesn't work.

    But the problem is now solved.

    Thanks a lot.

     

    Last edit: SebastianRaPi 2024-11-21

Log in to post a comment.