Запись шестнадцатеричных значений в регистр с начальными нулями

#java #hex #byte #ascii #modbus

#java #шестнадцатеричное #байт #ascii #modbus

Вопрос:

У меня есть массив строк, который содержит 16 шестнадцатеричных значений. Мне нужно преобразовать их в байты, чтобы записать их в регистр устройства Modbus (размер каждого регистра 16 бит). У нас есть 8 регистров для записи 16 шестнадцатеричных значений. Итак, я преобразую их в короткие и из коротких в байтовые для записи их в регистр устройства.

Вот мой код —

         String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
        short[] hexToShort = new short[16];
        for (int i = 0; i < 16; i  ) {
            hexToShort[i] = Short.parseShort(advanceByte[i], 16);
        }
        //  Converting Integer to Byte
        byte[] byteData = new byte[16];
        for (int i = 0; i < advanceByte.length; i  ) {
            byteData`[i] = (byte) hexToShort[i];
        }
        for (int i = 0; i < byteData.length - 1;) {
        byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i   1]};
        try {
            trans = new ModbusSerialTransaction(serialConnection);
            SimpleRegister myregister;
            myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
            writeSingleRegisterRequest = new WriteSingleRegisterRequest();
            writeSingleRegisterRequest.setUnitID(slave_Address);
            writeSingleRegisterRequest.setHeadless();
            writeSingleRegisterRequest.setReference(ref2); //register number 
            myregister.setValue(byteArr1);
            Register[] register = {myregister};
            writeSingleRegisterRequest.setRegister(myregister);
            trans.setRequest(writeSingleRegisterRequest);
            trans.execute();
            i = i   2;
            ref2  ;
        } catch (com.ghgande.j2mod.modbus.ModbusException exception) {
            advancedStatus = false;
            System.out.println("Table 4x4 data Writing Exception");
            System.out.println("Exception Occured ----"   exception);
        }
        serialConnection.close();

    }
    
  

Всякий раз, когда я считываю записанные данные из регистра через QModMaster, начальные нули отсутствуют.

Нужна помощь для решения этой проблемы.

Это результат, когда я читаю их из другого приложения. В этом результате начальный ноль отсутствует. Результирующее значение, которое я получаю после записи в регистр.Это ожидаемый результат. Ожидаемый результат должен выглядеть следующим образом.

Ответ №1:

Единственная неправильная вещь, которую я вижу в вашем коде, — это преобразование. Я думаю, вам следовало избегать String to Short преобразования, особенно когда вы можете напрямую конвертировать hex to byte . Вы должны были сделать это примерно так —

 String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
    byte[] byteData = new byte[16];
    for (int i = 0; i < advanceByte.length; i  ) {
        byteData[i] = Byte.parseByte(advanceByte[i],16);
    }
    for (int i = 0; i < byteData.length - 1;) {
    byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i   1]};
    try {
        trans = new ModbusSerialTransaction(serialConnection);
        SimpleRegister myregister;
        myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
        writeSingleRegisterRequest = new WriteSingleRegisterRequest();
        writeSingleRegisterRequest.setUnitID(slave_Address);
        writeSingleRegisterRequest.setHeadless();
        writeSingleRegisterRequest.setReference(ref2); //register number 
        myregister.setValue(byteArr1);
        Register[] register = {myregister};
        writeSingleRegisterRequest.setRegister(myregister);
        trans.setRequest(writeSingleRegisterRequest);
        trans.execute();
        i = i   2;
        ref2  ;
    } catch (com.ghgande.j2mod.modbus.ModbusException exception) {
        advancedStatus = false;
        System.out.println("Table 4x4 data Writing Exception");
        System.out.println("Exception Occured ----"   exception);
    }
    serialConnection.close();

}
  

Ответ №2:

Единственное, что я вижу, это то, что программа QModMaster не показывает начальные нули, но значения передаются правильно

Не путайте значения с их строковым представлением, Modbus передает значения, а не представления, тогда эти значения могут быть показаны в шестнадцатеричном, десятичном, двоичном и т.д. и автор QModMaster решил не показывать начальные нули.

Ваш вопрос должен был начинаться с «У меня есть массив строк, который содержит шестнадцатеричное представление 16-байтовых значений».