使用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个整数以获得双精度值。
谢谢。
答案 0 :(得分:0)
根据docs
将byte [8]二进制双精度值转换为双精度基元。
它明确指定了一个长度为8的字节数组。您的数组只有4个字节。
似乎每个电话号码实际上都不是一个字节。它们不在-127〜128范围内。您的每个数字可能是两个字节的总和。您可能需要先将它们每个分成两个字节,而不是盲目地将它们强制转换为byte
。
给出一个数字x
占用2个字节,这是如何使用移位和掩码分隔这些字节的方法:
byte firstByte = (byte)(x >> 8);
byte secondByte = (byte)(x & 0xff);
对所有数字执行此操作,以获取总共8个字节。