Modbus读写32位(Int 32)整数

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

Modbus读写32位(Int 32)整数_第1张图片

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

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

Modbus读写32位(Int 32)整数_第2张图片

我们看到,写入十万,在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个数字。

你可能感兴趣的:(嵌入式实时数据库)