当前位置: 首页 > 知识库问答 >
问题:

如何组合三个连续的Modbus寄存器以得到一个整数值?

公西姚石
2023-03-14

我必须使用Modbus协议读取设备的值。它有一个6字节长的值,由三个连续的保持寄存器表示。这是有符号类型和无符号类型的图形表示。

我可以使用Java中的Modbus库读取三个寄存器。每个寄存器作为一个2字节的短值读取。现在我需要知道如何组合这三个值来形成一个有符号和无符号格式的整数值?

共有1个答案

顾烨磊
2023-03-14

请记住,我已经很久没有写java了,所以我的java已经生疏了。因为Java中没有无符号值,所以这有点难。尝试如下所示:

class ModbusConvert
{
    public static long toUnsigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = (((long)register0) & 0x0FFFF) << 32;
        return v0 | v1 | v2;
    }

    public static long toSigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        if ((register0 & 0x8000) != 0) register0 |= 0xFFFF0000; // Sign extend

        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = ((long)register0) << 32;
        return v0 | v1 | v2;
    }

    public static void main(String args[])
    {
        // Example Register Values (value = 0xFEDC76543210)
        int register0 = 0xFEDC;
        int register1 = 0x7654;
        int register2 = 0x3210;

        long unsigned = toUnsigned(register0, register1, register2);
        long signed = toSigned(register0, register1, register2);

        System.out.println(String.format("UNSIGNED: 0x%016X", unsigned));
        System.out.println(String.format("SIGNED  : 0x%016X", signed));
    }
}

The output is:
UNSIGNED: 0x0000FEDC76543210
SIGNED  : 0xFFFFFEDC76543210
 类似资料:
  • 我想要这样的结果。依靠这个数组,我想在其中得到一个随机值。

  • 我正在努力学习组装,这在一定程度上是有意义的,但我有一个问题。我有以下源文件: 很好用。我只是不明白为什么在不同的情况下需要使用特定的整数寄存器。 例如,通过反复试验,我发现当说我想要哪个系统调用时,例如。 我将值放入整数寄存器,但也可以使用整数寄存器、、或。 编辑:我的问题不是这个问题的重复,因为这个问题问的是在哪里使用更小的整数寄存器,我问的是一种决定使用哪个整数寄存器的方法。

  • 给定一些数组数和一个正整数k,确定是否可能将这个数组分成k个连续数组。 示例: 自[1,2],[3,4]后输出为真

  • 问题内容: 我正在尝试将javascript中的2个数组合并为一个。 这是一个简单的示例,我希望能够将它们组合起来,以便当读取第二行时,数组中的第4个元素将返回“ d” 我该怎么办? 问题答案:

  • 我有两个双数组: 我的循环结构如下所示: 我要做的是连续获取项目LatArr[0]和LonArr[0]<这样我就可以在lat1中使用LatArr[0],在lon1中使用LonArr[0]。此外,LatArr[1]应位于lat2,LonArr[1]应位于lon2 但此代码获取LatArr[0]。。[1] 。。和LonArr[0]。。[1] 。。两次每个元素打印两次 任何人都请纠正我的错误,我完全不希

  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?