You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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)」要拆解为两层意思:

  1. Long:这里指的是32位整数(很多工业设备会把32位整数称为"Long",用来和16位的"Short"寄存器区分,和Java里的64位long不是同一个概念)。
  2. Swapped:指的是每个16位寄存器内部的字节是按小端序存储的(也就是字节顺序被交换)。举个直观的例子:
    • 目标值78146789的十六进制是0x04A86CD5,拆分为两个16位字是0x04A8(高16位)和0x6CD5(低16位)。
    • 如果是普通大端存储,0x04A8会以0x04、0xA8的顺序存在寄存器中;但这里的"Swapped"意味着寄存器里存储的是0xA8、0x04,当你用Java读取为short时,Java会自动按本地字节序(通常是小端)转换为0x04A8(即十进制1192),同理0x6CD5对应的寄存器字节是0xD5、0x6C,读取后得到27877。

简单来说,你读取到的short已经是字节交换后的结果,只需要把第一个寄存器的short作为32位整数的高16位,第二个作为低16位,组合起来就得到目标值了。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:30:04