How to ... ein REAL am Gruppeneingang korrekt in eine REAL-Variable schreiben

  • Moin,


    ich hab hier im Forum nichts dazu gefunden, kann mir aber vorstellen, daß das ab und an mal jemand brauchen könnte. Deswegen wollte ich Euch das nicht vorenthalten. Das Problem ist folgendes:


    Die SPS, in diesem Fall eine TwinCAT 3 von Beckhoff, schickt ein REAL via Schnittstelle zu einem Gruppeneingang des Roboters. Die Bits kommen auch korrekt am Gruppeneingang an. Wenn man aber den Gruppeneingang einer REAL-Variablen zuweist, steht in der Variable die REAL-Schreibweise der INT-Repräsentation des Wertes im Gruppeneingang. Am konkreten Beispiel:


    Code
    SIGNAL  GI_Signalname $in[...] TO $in[...]
    REAL    R_realname


    Die SPS schickt 18.4 über die Schnittstelle,

    Als IEEE-Fließkomma in Binärschreibweise ist das 01000001100100110011001100110011

    In GI_Signalname kommt 01000001100100110011001100110011 an

    Als INT interpretiert ist 01000001100100110011001100110011 der Wert 1100165939


    Wenn ich den Gruppeneingang nun einer REAL-Variable zuweise...


    Code
    R_realname = GI_Signalname


    ... steht im R_realname 1.1006589E+09 statt 18.4, wie man es erwarten würde. Ein Techniker von KUKA, der gerade im Haus ist, hat dann ein kleines Kaninchen aus dem Hut gezaubert:





    Wenn man die Zuweisung nun statt mit ...


    Code
    R_realname = GI_Signalname


    ... mit diesen kleinen Funktion macht ...


    Code
    R_realname = stream2real(GI_Signalname)


    ... dann steht in der REAL-Variable, wie es sein soll, die gewünschte 18.4 drin. :)


    Gruß

    Jörn

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

    Einmal editiert, zuletzt von halbesYoyo () aus folgendem Grund: Der Verständlichkeit wegen etwas umformuliert

  • Schritt für Schritt zum Roboterprofi!
  • Kann ich Dir nicht sagen, ich habs ohne detailliertes Studium der Funktionsweise so übernommen. Aber ich kann den Techniker von KUKA morgen mal fragen, ob das einen bestimmten Grund hat. ;)

    In der Theorie sind Theorie und Praxis identisch. In der Praxis nicht.

  • Das ist eigentlich kein Kaninchen sonder eine relativ einfache Funktion.


    Die Größe von tmpStream ist eigentlich recht beliebig. Wichtig dabei ist zu wissen das CAST_TO und CAST_FROM nur eine begrenzte Anzahl an Blöcken portieren kann. Dabei steht die Zahl für tmpStream für jeweils 1 Byte.

    Damit kann man ganze Positonsdaten per Feldbus und Realzahlen übergeben und portieren, und das in beide Richtungen.


    offset = 0 gibt dabei eine art Pointer an ab welcher Positon in tmpStream die Daten geschrieben bzw. gelesen werden, da wie gesagt Cast nur eine begrenzte Zahl an Bytes bei einem Aufruf bearbeiten kann.


    Mit offset hat mann dann die Möglichkeit die Funtkion zu erweitern.


    Als Beispiel so:


    GLOBAL DEFFCT E6POS fConvertINT_E6POS(nX:in,nY:in,nZ:in,nRotA:in,nRotB:in,nRotC:in,nStatus:in,nTurn:in,nExt1:in,nExt2:in,nExt3:in,nExt4:in,nExt5:in,nExt6:in )

    DECL INT nX,nY,nZ,nRotA,nRotB,nRotC,nStatus,nTurn,nExt1,nExt2,nExt3,nExt4,nExt5,nExt6,nOffset

    DECL CHAR chBuffer[56]

    DECL E6POS pE6Pos


    nOffset=0

    CAST_TO(chBuffer[],nOffset,nX,nY,nZ,nRotA,nRotB,nRotC,nStatus,nTurn)

    nOffset=32

    CAST_TO(chBuffer[],nOffset,nExt1,nExt2,nExt3,nExt4,nExt5,nExt6)


    nOffset=0

    CAST_FROM(chBuffer[],nOffset,pE6Pos)


    RETURN pE6Pos

    ENDFCT


    GLOBAL DEF fConvertE6POS_INT(pE6Pos:in,nX:OUT,nY:OUT,nZ:OUT,nRotA:OUT,nRotB:OUT,nRotC:OUT,nStatus:OUT,nTurn:OUT,nExt1:OUT,nExt2:OUT,nExt3:OUT,nExt4:OUT,nExt5:OUT,nExt6:OUT)

    DECL INT nX,nY,nZ,nRotA,nRotB,nRotC,nStatus,nTurn,nExt1,nExt2,nExt3,nExt4,nExt5,nExt6,nOffset

    DECL CHAR chBuffer[56]

    DECL E6POS pE6Pos


    rLocalPosInit()


    nOffset=0

    CAST_TO(chBuffer[],nOffset,pE6Pos)


    nOffset=0

    CAST_FROM(chBuffer[],nOffset,nX,nY,nZ,nRotA,nRotB,nRotC,nStatus,nTurn)

    nOffset=32

    CAST_FROM(chBuffer[],nOffset,nExt1,nExt2,nExt3,nExt4,nExt5,nExt6)


    END


    kann aber beliebeg erweitert und verändert werden in seiner Funktion.


    gruß


    Sven

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Achso, das geht übrigens mit ABB auch so ähnlich mit der Funktion RawBytes

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden