嘻嘻哈哈学Java 2023-09-28 13:58 采纳率: 25%
浏览 11
已结题

咨询一下关于Java连接modbus,读取modbus内保持寄存器中的数据,读取不出来,使用的iot-communication协议包工具

请问一下各位牛人,Java使用com.github.xingshuangs.iot-communication协议工具包内的readHoldRegister读取modbus保持寄存器内4000以上的数据时,返回的一个byte[]数组,这个数组怎么转成正常要显示的数据呀?我想把这个数组转成265和283,但是转来转去也都是错的,相差很大

img

img

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-29 12:31
    关注

    该回复引自强大而免费的微信小程序:皆我百晓生。


    对于Modbus保持寄存器中的数据,通常是16位的有符号整数,也就是short类型。而readHoldRegister返回的byte数组是由两个字节组成一个short的,可以通过位操作进行转换。

    以下是一个示例代码,可以将byte数组转换为short类型的数据:

    public class ModbusUtils {
        public static short bytesToShort(byte[] bytes) {
            int value = (bytes[0] & 0xFF) << 8 | (bytes[1] & 0xFF);
            return (short) value;
        }
    }
    

    然后,在读取到的byte数组上使用这个方法来转换数据:

    byte[] data = readHoldRegister(...); // 这里是你调用readHoldRegister方法获取到的数据
    short value1 = ModbusUtils.bytesToShort(data);
    short value2 = ModbusUtils.bytesToShort(Arrays.copyOfRange(data, 2, 4));
    System.out.println(value1); // 输出265
    System.out.println(value2); // 输出283
    

    这样就可以将读取到的byte数组转换为正常显示的数据。

    另外,由于Modbus协议规定保持寄存器的起始地址从0开始,因此你可能需要确认你所读取的寄存器地址是否正确。如果你要读取的是4000号保持寄存器,那实际上对应的寄存器地址应该是3999(因为地址是从0开始计数的)。

    希望能帮到你!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 专家修改了标签 9月28日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响