Hallo zusammen,
Mir ist heute folgendes Problem beim Auslesen der Frequenz bei einem Sunspec-Meter (S203) aufgefallen: Der Wert im entsprechenden Modbus-Register ist 4997 beim Scale-Factor -2, Einheit Hertz, sprich eine Frequenz von 49,97 Hz bzw. 49970 mHz. Jetzt wird beim Anwenden des Scale-Factors der Wert 49,97 zu Short konvertiert, also auf 49 abgerundet, und dann mit einem Scale-Factor 3 in den Channel SymmetricMeter.FREQUENCY geschrieben, der dann 49000 mHz beinhaltet, durchaus eine starke Abweichung. Im Code zum ElementToChannelScaleFactorConverter sieht das so aus:
if (value instanceof Short) {
double result = ((Short) value) * factor;
if (result >= Short.MIN_VALUE && result <= Short.MAX_VALUE) {
return Short.valueOf((short) result);
} else if (result > Integer.MIN_VALUE && result < Integer.MAX_VALUE) {
return Integer.valueOf((int) result);
} else {
return Double.valueOf(Math.round(result));
}
}
Die Variable value
hat den Wert 4997, factor
den Wert 0,01, also ist result
= 49,97 und wird zu Short 49 konvertiert.
Wenn ich den Code nun einfach folgendermaßen ändere:
if (value instanceof Short) {
double result = ((Short) value) * factor;
return result;
haut es hin. Da diese Änderung allerdings in so einer zentralen Komponente passiert und der Typ des Return-Wertes sich ändert, habe ich die Befürchtung, dass andere Komponenten nicht mehr richtig funktionieren werden (wobei andererseits im letzten else-Zweig des ursprünglichen Codes auch ein Double zurückgegeben wird). Hat jemand hier den Durchblick und kann meine Befürchtung bestätigen, oder besser noch aus der Welt schaffen?
Vielen Dank im Voraus!