Hintereinander ausgeführte Scale-Faktoren bei Sunspec

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!

Hi tsicking

Did you ever solved this issue?

I had the same issue and introduced the two attached files to allow me to read a float from a 16 bit register on the modbus. I introduced these two files in package io.openems.edge.bridge.modbus.api.element; to enable reading of integers as float (particular useful when combined with a scale).

UnsignedWordElementFloat.java (829 Bytes)
SignedWordElementFloat.java (851 Bytes)

I have not tested if they work for writing values.

Hi Jens,

We solved it exactly as I wrote above, and it didn’t cause issues. It’s a long time ago though, and the Modbus bridge has changed since then, so I can’t guarantee that it still works (though I think it will).

Best regards,
Thomas

Yes, sorry my German is a bit rusty.

Thank you for replying.