Java float --> SPS Real (über CP 343-1 lean)

zealot

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Zur Zeit arbeite ich an meiner Diplomarbeit und muss dabei von einer Java-Applikation aus, SPS Konfigurationsdaten in einem Datenbaustein verändern. Dabei werden die Daten mittels TCP-Packet über eine "CP 343-1 lean" an eine "CPU 315-2 PN/DP" gesendet. Dies funktioniert in meiner Applikation sowohl für Integer (in Java Short) ganz gut. Wenn ich aber einen float (in Java) in der SPS als Real abspeichern möchte, dann erhalte ich bei etwa 25% der gesendeten Werte falsche Resultate. Zum Beispiel erhalte ich anstelle von 4.0 den Wert 5.375, der Wert 5.0 kommt aber wieder korrekt an.

Diese Abweichung stelle ich bei Sollwerten in folgenden Bereichen fest:
Code:
  0.25 <= SollWert <    0.3125 
  1    <= Sollwert <    1.25 
  4    <= Sollwert <    5 
 16    <= Sollwert <   20 
 64    <= Sollwert <   80 
256    <= Sollwert <  320 
1024    <= Sollwert < 1280
Zur Konvertierung der float-Werte zu einem Byte-Array das 4 Elemente hat, welches ich dann in einem TCP-Packet versenden kann, verwende ich folgende Java-Methode:
Code:
public static byte[] floatToByte(float f){ 
       byte[] b = new byte[4]; 
       int i = Float.floatToIntBits(f); 
       b[0] = (byte)(i >>> 24 & 0xFF); 
       b[1] = (byte)(i >>> 16 & 0xFF); 
       b[2] = (byte)(i >>> 8 & 0xFF); 
       b[3] = (byte)(i & 0xFF); 
       return b; 
}
Ich kontrollierte die zurückgegebenen Werte mit denen einer bestehenden VisualBasic Applikation, welche die gleiche Funktionalität (versenden von TCP-Packeten an die SPS) unterstützt. Dabei stellte ich lediglich fest, dass die 4 Bytes umgeformt in 4 Integer in VisualBasic immer Positiv (zwischen 0 und 255) sind und in Java im Bereich von -127 bis 128 dargestellt werden. Dies kann aus meiner Sicht auf die Betrachtung der Byte zurückgeführt werten, denn wenn die Bit's einzeln verglichen werden sind sie in VisualBasic wie auch Java Werte gleich.

Ich wäre froh, wenn mir jemand mir bei diesem Problem helfen könnten, oder zumindest einen Tipp hätte, wo ich weitersuchen muss.

Besten dank schon jetzt
Jürg
 
Das Problem der verschiedenen Zahlenwerte trotz gleicher Bitmuster liegt an den unterschiedlichen Datentypen.

Die erste ist "unsigned" (verwendet kein Vorzeichen), während die zweite Variable eine "signed" Variable ist (verwendet Vorzeichen)

In der Regel wird das erste Bit (nicht das LSB) zur Vorzeichenbildung verwendet.

Wenn die Werte auf beiden Systemen gleich sein sollen, dann müssen die Variablentypen übereinstimmen.


Werden die Variablen nach einem bestimmten Muster falsch eingetragen?
(Exakt jeder 4. Wert stimmt nicht, nur Werte mit Nachkommastellen stimmen nicht, nur Werte größer 10 stimmen nicht)

Wenn diese Information zur Verfügung steht, dann kann man ggf. das Problem etwas eingrenzen.
 
Zurück
Oben