-> 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:
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:
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
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
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 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