Modbus TCP上的Java编程将4个整数寄存器转换为双值



使用java编程,在Modbusutill(Jmod(jar的帮助下,我开发了一个代码,它将通过Modbus TCP连接到PLC。这里我得到的情况是,我需要将4个输入寄存器转换为双值。假设寄存器是(1687024900158830492(,如果我转换它,我应该得到类似3003782.9651476783的值。因此,对于转换,我使用了库提供的方法,这是代码,

byte[] bytes = {(byte) 16870,(byte) 24895,(byte) -32348,(byte) 617};
double value = ModbusUtil.registersToDouble(bytes);
System.out.println(value);

这里我使用了ModbusUtil.registersToDouble(bytearray[])方法,并作为一个参数给出了字节数组。但这不起作用,我得到了例外,

java.lang.ArrayIndexOutOfBoundsException: 4
at net.wimpi.modbus.util.ModbusUtil.registersToDouble(ModbusUtil.java:326)
at modbus.ReadDataFromPLC.realValue(ReadDataFromPLC.java:110)
at modbus.ReadDataFromPLC.main(ReadDataFromPLC.java:11)

这是我得到的例外,任何人都请帮助我如何转换4个整数以获得双倍值。

提前谢谢。

根据文档

将byte[8]二进制双值转换为双基元。

它显式指定长度为8的字节数组。您的数组只有4个字节。

看起来你的每个数字实际上都不是一个字节。它们在-127~128的范围之外。您的每个数字可能是两个字节的总和。您可能需要先将它们中的每一个分隔为两个字节,而不是盲目地将它们强制转换为byte

给定一个数字x占用2个字节,下面是如何用移位和掩码来分隔这些字节:

byte firstByte = (byte)(x >> 8);
byte secondByte = (byte)(x & 0xff);

对你所有的数字都这样做,得到总共8个字节。

最新更新