如何组合三个连续的Modbus寄存器来得到一个整数值?
How to combine three consecutive Modbus registers to get an integer value?
我必须使用 Modbus 协议读取设备的值。它有一个 6 字节长的值,由三个连续的保持寄存器表示。这是有符号和无符号类型的图形表示。
我可以使用 Java 中的 Modbus 库读取三个寄存器。每个寄存器都被读取为一个 2 字节的短值。现在我需要知道如何组合这三个值以形成有符号和无符号格式的整数值?
请记住,我已经很久没有写 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
我必须使用 Modbus 协议读取设备的值。它有一个 6 字节长的值,由三个连续的保持寄存器表示。这是有符号和无符号类型的图形表示。
我可以使用 Java 中的 Modbus 库读取三个寄存器。每个寄存器都被读取为一个 2 字节的短值。现在我需要知道如何组合这三个值以形成有符号和无符号格式的整数值?
请记住,我已经很久没有写 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