我正在读取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))`
以数字形式而不是以字符串形式对待寄存器。
fin = int(unconcatenateSensorConsumptionValues[i]) * 1000 + int(unconcatenateSensorConsumptionValues[i+1]) * 1
第一个寄存器是1000,第二个寄存器是1。
我不知道这是否是最好的方法,我有两种解决方法:
第一个解决方案:将一个寄存器填充到65535,然后将剩余的添加到另一个寄存器。因此,实际值将是第一和第二寄存器的和。但是这里我们的最大值为131070(65535 + 65535)。
第二个解决方案:将值转换为十六进制,然后将两个八位字节相除,然后转换为十进制。现在将那些十进制数存储在modbus寄存器中。获得原始价值。读取两个modbus寄存器,将它们转换为十六进制,将两个十六进制值组合为十进制值。此十进制值为实际值。这样,可以用两个寄存器存储的最大值是4294967295。
为了容易理解,我附加了一个图像(我使用MS Paint创建了图像,但是有任何简单的方法)
可以用于多个寄存器,也可以用于大数。