Java在Modbus TCP上进行编程以将4个整数寄存器转换为Double值

时间:2018-11-14 06:48:20

标签: java modbus-tcp

使用Java编程并借助Modbusutill(Jmod)jar,我开发了一个代码,它将通过Modbus TCP连接到PLC。在这种情况下,我需要将4个输入寄存器转换为双精度值。说寄存器是(16870,24900,1588,30492),如果我将其转换,则应获得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个整数以获得双精度值。

谢谢。

1 个答案:

答案 0 :(得分:0)

根据docs

  

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

它明确指定了一个长度为8的字节数组。您的数组只有4个字节。

似乎每个电话号码实际上都不是一个字节。它们不在-127〜128范围内。您的每个数字可能是两个字节的总和。您可能需要先将它们每个分成两个字节,而不是盲目地将它们强制转换为byte

给出一个数字x占用2个字节,这是如何使用移位和掩码分隔这些字节的方法:

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

对所有数字执行此操作,以获取总共8个字节。