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

Java Programing on Modbus TCP to Convert 4 Integer Registers to Double value

使用 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 个整数转换为双精度值。

提前致谢。

根据 docs

Converts a byte[8] binary double value into a double primitive.

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

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

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

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

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