Hallo!
Ich habe ein merkwürdiges Problem. Ich rufe per TCP Daten von einem Wechselrichter ab. Die Bytefolgen zerlege ich in die entsprechenden Teile und gebe die Werte dann aus. Format ist little Endian.
Ich habe den Code gekürzt.
Es funktioniert eigentlich alles, aber wenn der Code in der produktiven Umgebung läuft, erscheint bei manchen Ausgaben der Wert "63" und ändert sich für ca. 30min nicht ... dann wird wieder der passende Wert ausgegeben.
Für mich ein Rätsel, da ich weder einen Fehler bekomme noch beim Testen ich es reproduzieren kann. Jedoch läuft die Testumgebung auch nur einige Stunden.
Und vor allem, wenn der Wert sich nicht ändert, ist die Zahl 63 ausgegeben. Wat hat die 63 zu bedeuten?
Die Methode "oniTrigger" wird über einen Timer alle 3sek aufgerufen. Ist da ein Problem zu erkennen?
Danke!
Ich habe ein merkwürdiges Problem. Ich rufe per TCP Daten von einem Wechselrichter ab. Die Bytefolgen zerlege ich in die entsprechenden Teile und gebe die Werte dann aus. Format ist little Endian.
Code:
public void oniTrigger() {
try {
if (clientSocket == null) {
clientSocket = new Socket(IP, Port);
}
if (clientSocket.isClosed()) {
clientSocket = new Socket(IP, Port);
}
outToServer = new DataOutputStream(clientSocket.getOutputStream());
inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
// // 2.2.1 Request package for voltage/current/output
byte[] value = new byte[8];
value[0] = 0x62;
value[1] = (byte) rs485Id;
value[2] = 0x03;
value[3] = (byte) rs485Id;
value[4] = 0x00;
value[5] = 0x43;
value[6] = (byte) (0 - (0xA8 + 2 * rs485Id));
value[7] = 0x00;
outToServer.write(value);
char[] buffer = new char[73];
int anzahlZeichen = inFromServer.read(buffer, 0, 73);
byte[] answer = new String(buffer, 0, anzahlZeichen).getBytes();
ByteBuffer bb = ByteBuffer.wrap(answer);
bb.order(ByteOrder.LITTLE_ENDIAN);
if (voltageString1 != bb.getShort(5)) {
voltageString1 = bb.getShort(5);
sendOutString("oVoltage1", "value",
String.valueOf(voltageString1 * 0.1));
}
if (currentString1 != bb.getShort(7)) {
currentString1 = bb.getShort(7);
sendOutString("oCurrent1", "value",
String.valueOf(currentString1 * 0.01));
}
if (outputString1 != bb.getShort(9)) {
outputString1 = bb.getShort(9);
sendOutString("oOutput1", "value",
String.valueOf(outputString1));
}
................................
// // 2.2.3 Request package for total energy
value = new byte[8];
value[0] = 0x62;
value[1] = (byte) rs485Id;
value[2] = 0x03;
value[3] = (byte) rs485Id;
value[4] = 0x00;
value[5] = 0x45;
value[6] = (byte) (0 - (0xAA + 2 * rs485Id));
value[7] = 0x00;
outToServer.write(value);
buffer = new char[11];
anzahlZeichen = inFromServer.read(buffer, 0, 11);
answer = new String(buffer, 0, anzahlZeichen).getBytes();
bb = ByteBuffer.wrap(answer);
bb.order(ByteOrder.LITTLE_ENDIAN);
if (totalEnergy != bb.getInt(5)) {
totalEnergy = bb.getInt(5);
sendOutString("oTotalEnergy", "value",
String.valueOf(totalEnergy));
}
// // 2.2.5 Request package for inverter status
value = new byte[8];
value[0] = 0x62;
value[1] = (byte) rs485Id;
value[2] = 0x03;
value[3] = (byte) rs485Id;
value[4] = 0x00;
value[5] = 0x57;
value[6] = (byte) (0 - (0xBC + 2 * rs485Id));
value[7] = 0x00;
outToServer.write(value);
buffer = new char[15];
anzahlZeichen = inFromServer.read(buffer, 0, 15);
answer = new String(buffer, 0, anzahlZeichen).getBytes();
bb = ByteBuffer.wrap(answer);
bb.order(ByteOrder.LITTLE_ENDIAN);
if (status != bb.get(5)) {
status = bb.get(5);
sendOutString("oStatus", "value", String.valueOf(status));
}
if (fault != bb.get(6)) {
fault = bb.get(6);
sendOutString("oFault", "value", String.valueOf(fault));
}
if (faultCode != bb.getShort(7)) {
faultCode = bb.getShort(7);
sendOutString("oFaultCode", "value", String.valueOf(faultCode));
}
...........................
// // Total Output
if (TotalOutput != (OutputPhase1 + OutputPhase2 + OutputPhase3)) {
TotalOutput = (OutputPhase1 + OutputPhase2 + OutputPhase3);
sendOutString("oTotalOutput", "value",
String.valueOf(TotalOutput));
}
} catch (IOException e) {
sendOutString("oError", "value", e.getMessage());
} catch (Exception e) {
sendOutString("oError", "value", e.getMessage());
}
Ich habe den Code gekürzt.
Es funktioniert eigentlich alles, aber wenn der Code in der produktiven Umgebung läuft, erscheint bei manchen Ausgaben der Wert "63" und ändert sich für ca. 30min nicht ... dann wird wieder der passende Wert ausgegeben.
Für mich ein Rätsel, da ich weder einen Fehler bekomme noch beim Testen ich es reproduzieren kann. Jedoch läuft die Testumgebung auch nur einige Stunden.
Und vor allem, wenn der Wert sich nicht ändert, ist die Zahl 63 ausgegeben. Wat hat die 63 zu bedeuten?
Die Methode "oniTrigger" wird über einen Timer alle 3sek aufgerufen. Ist da ein Problem zu erkennen?
Danke!
Zuletzt bearbeitet: