使用Python代码从Modbus RTU从站获取整数值

问题描述 投票:0回答:2

我正在读取Modbus从站的寄存器中的值。但是存储在寄存器中的值是两个寄存器的组合。也就是说,如果寄存器3有72,而寄存器4有489。实际值为72489。我能够做到这一点。

但是问题出现了,当第二个寄存器中的值以0开头时。也就是说,如果寄存器2的值为72,而寄存器4的值为012。实际值应该是72012,但我得到7212。有没有办法防止这个。

执行此操作的代码部分,

`rr = client.read_holding_registers(2, 22, unit=1)
 unconcatenateSensorConsumptionValues = rr.registers
 sensorsConsumptionValues = []
 for i in range(0, 10, 2):
    ftemp = ""+str(unconcatenateSensorConsumptionValues[i])
    stemp = ""+str(unconcatenateSensorConsumptionValues[i+1])
    fin = ftemp+stemp
    sensorsConsumptionValues.append(int(fin))`
python python-3.x modbus pymodbus
2个回答
0
投票

以数字形式而不是以字符串形式对待寄存器。

fin = int(unconcatenateSensorConsumptionValues[i]) * 1000 + int(unconcatenateSensorConsumptionValues[i+1]) * 1

第一个寄存器是1000,第二个寄存器是1。


0
投票

我不知道这是否是最好的方法,我有两种解决方法:

第一个解决方案:将一个寄存器填充到65535,然后将剩余的添加到另一个寄存器。因此,实际值将是第一和第二寄存器的和。但是这里我们的最大值为131070(65535 + 65535)。

第二个解决方案:将值转换为十六进制,然后将两个八位字节相除,然后转换为十进制。现在将那些十进制数存储在modbus寄存器中。获得原始价值。读取两个modbus寄存器,将它们转换为十六进制,将两个十六进制值组合为十进制值。此十进制值为实际值。这样,可以用两个寄存器存储的最大值是4294967295。

为了容易理解,我附加了一个图像(我使用MS Paint创建了图像,但是有任何简单的方法)

可以用于多个寄存器,也可以用于大数。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.