Modbus读写32位(Int 32)整数

Modbus读写型寄存器用到03功能码,每个寄存器是双字节的,也就是16位整数(Int16),它的取值范围是-32768到32767,如果我们用Modbus Slave测试读写一个寄存器,超出这个范围是写不进去的,会弹出下面提示:

那么,如果我们要写入一个大的数字,比如十万,要怎么做呢?

我们知道一个寄存器是16位,那两个寄存器就是32位,32位整型数字是可以满足我们的需求的,那我们就需要占用两个寄存器的地址,比如起始地址是2,那32位的数字就写在2-3这两个寄存器里面。 

我们看到,写入十万,在Modbus Slave的2和3寄存器分别写入了1和-31072,这是什么意思呢?

 -32768到32767总共是65536个数字,32位写入数字第一个寄存器是65536的倍数,如果写入值在 -32768到32767这个范围内,则为0,第二个寄存器就是 -32768到32767的取值范围内的数字,于是我们得出下面公式:

int a = int.Parse(list[0].ToString());//第一个寄存器
int b = int.Parse(list[1].ToString());//第二个寄存器

if (b < 0)
{
    b = 65536 + b;
}

int value = a * 65536 + b;//最终得出32位整数

套以上公式计算的话就是:1*65536+65536-31072=100000

这里需要注意的是,比如数字是32768,它是在0~65536范围的,所以它存在寄存器里面的值是-32768,就是从负值开始写,直到消耗完65536个数字。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值