Java-программирование на Modbus TCP для преобразования 4-х целочисленных регистров в двойное значение - PullRequest
0 голосов
/ 14 ноября 2018

Используя Java-программирование и с помощью Modbusutill (Jmod) jar, я разработал код, который будет подключаться к ПЛК через Modbus TCP.Здесь я получил ситуацию, в которой мне нужно преобразовать 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 голосов
/ 14 ноября 2018

Согласно документам

Преобразует двоичное [8] двоичное двойное значение в двойной примитив.

В нем явно указан байтовый массив длины 8. В вашем массиве всего 4 байта.

Кажется, что каждое из ваших чисел на самом деле не является одним байтом. Они находятся за пределами диапазона -127 ~ 128. Каждое из ваших чисел может состоять из двух байтов. Возможно, вам придется сначала разделить каждый из них на два байта, а не слепо приводить их к byte.

Учитывая, что число x занимает 2 байта, вот как разделить эти байты с помощью сдвигов и масок:

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

Сделайте это для всех своих номеров, чтобы получить в общей сложности 8 байтов.

...