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 个字节。
使用 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 个字节。