Write hexadecimal values into register with leading zeros

时光怂恿深爱的人放手 提交于 2020-12-13 03:04:02

问题


I have an string array which contains 16 hexadecimal values. I need to convert them into byte to write them at Modbus's device register(size of each register is 16-bit). We have 8 registers to write 16 hexadecimal values. So, I'm converting them into the short and from short to byte for write them at device's register.

Here is my code --

        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();

    }
    

Whenever, I am reading the written data from the register through QModMaster , leading zeros are missing.

Need help to solve this Issue.

This is the result, when I read them from other application. In this result, leading zero are missing. This is the expected result.


回答1:


The only wrong thing I can see in your code is conversion. I think you should have avoided the String to Short conversion especially when, you can directly convert hex to byte. You should have done it something like this -

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:


The only thing I see is that the QModMaster program does not show the leading zeros but values are transmitted correctly

Do not confuse values with their string representation, Modbus transmits values, not representations, then those values can be shown in hexadecimal, decimal, binary etc. and QModMaster author decided to don't show leading zeros.

Your question should have started with "I have an string array which contains the hexadecimal representation of 16 byte values".



来源:https://stackoverflow.com/questions/64352018/write-hexadecimal-values-into-register-with-leading-zeros

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!