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:
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...
... 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:
; SPS -> Roboter
; Wandelt einen Stream, z.B. aus einem Gruppeneingang, in ein REAL um
GLOBAL DEFFCT REAL stream2real(iSignal :IN)
DECL INT iSignal
DECL REAL rValue
DECL INT offset
DECL CHAR tmpStream[4]
offset = 0
CAST_TO(tmpStream[], offset, iSignal)
offset = 0
CAST_FROM(tmpStream[], offset, rValue)
RETURN rValue
ENDFCT
; Roboter -> SPS
; Wandelt ein REAL in einen stream um, z.B. auf einen Gruppenausgang
GLOBAL DEFFCT INT real2stream(rValue :IN)
DECL INT iSignal
DECL REAL rValue
DECL INT offset
DECL CHAR tmpStream[4]
offset = 0
CAST_TO(tmpStream[], offset, rValue)
offset = 0
CAST_FROM(tmpStream[], offset, iSignal)
RETURN iSignal
ENDFCT
Alles anzeigen
Wenn man die Zuweisung nun statt mit ...
... mit diesen kleinen Funktion macht ...
... dann steht in der REAL-Variable, wie es sein soll, die gewünschte 18.4 drin.
Gruß
Jörn