如何从Modbus寄存器读取并转换Long(Swapped)类型值?
解决方法与Long(Swapped)的定义
首先给你直接的Java代码解决方案,再慢慢解释术语细节:
代码实现
你只需要把读取到的两个short值按「高字左移16位,再和低字做按位或」的方式组合,注意要先把short转成无符号的16位整数(避免符号位扩展导致的错误),代码如下:
short register42002 = 1192; // 从目标寄存器42002读取的short值 short register42003 = 27877; // 紧随其后的42003寄存器读取值 // 转换为无符号16位后组合成32位整数 int targetValue = ((register42002 & 0xFFFF) << 16) | (register42003 & 0xFFFF); System.out.println(targetValue); // 输出结果:78146789
Long(Swapped)的具体含义
结合Modbus工业协议的常见术语和你的场景,这里的「Long(Swapped)」要拆解为两层意思:
- Long:这里指的是32位整数(很多工业设备会把32位整数称为"Long",用来和16位的"Short"寄存器区分,和Java里的64位
long不是同一个概念)。 - Swapped:指的是每个16位寄存器内部的字节是按小端序存储的(也就是字节顺序被交换)。举个直观的例子:
- 目标值78146789的十六进制是
0x04A86CD5,拆分为两个16位字是0x04A8(高16位)和0x6CD5(低16位)。 - 如果是普通大端存储,
0x04A8会以0x04、0xA8的顺序存在寄存器中;但这里的"Swapped"意味着寄存器里存储的是0xA8、0x04,当你用Java读取为short时,Java会自动按本地字节序(通常是小端)转换为0x04A8(即十进制1192),同理0x6CD5对应的寄存器字节是0xD5、0x6C,读取后得到27877。
- 目标值78146789的十六进制是
简单来说,你读取到的short已经是字节交换后的结果,只需要把第一个寄存器的short作为32位整数的高16位,第二个作为低16位,组合起来就得到目标值了。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

