【问题标题】:Write hexadecimal values into register with leading zeros将十六进制值写入带有前导零的寄存器
【发布时间】:2020-10-20 12:47:09
【问题描述】:

我有一个包含 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 从寄存器读取写入的数据时,都会缺少前导零。

需要帮助来解决这个问题。

这是我从其他应用程序中读取它们时的结果。在此结果中,缺少前导零。 这是预期的结果。

【问题讨论】:

    标签: java hex byte ascii modbus


    【解决方案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 字节值的十六进制表示的字符串数组”开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        • 2013-08-05
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        相关资源
        最近更新 更多