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

标签 java modbus-tcp

使用java编程并在Modbusutil(Jmod) jar的帮助下我开发了一个代码,它将通过Modbus TCP连接到PLC。这里我遇到了需要将 4 个输入寄存器转换为 double 值的情况。假设寄存器是(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 个整数转换为 double 值。

提前致谢。

最佳答案

根据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 个字节。

关于Modbus TCP 上的 Java 编程将 4 个整数寄存器转换为 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294539/

相关文章:

modbus - 如何使用libmodbus计算出 'read/write'函数?(c代码)

tcp - Pymodbus 无法连接 PLC Slave 和 Raspberry Pi Master

c# - 嵌入式 C 中的 Modbus RTU 实现

java - 将 JSON 数据存储到 MySQL 数据库中

simulator - Modbus TCP 模拟器 Windows/Linux

java - 在运行时提升 Java 应用程序

java - 如何在 JUnit 测试中初始化数据

java - spark checkpoint ".bk"和 ".crc"文件的功能是什么?

java - Spring Boot 2.2,JPA > 如果第二个字母大写,则无法定位属性