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

Getting Integer Value from a Modbus RTU Slave using Python Code

我正在读取 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创建的,但有什么简单的方法吗)

这可以用于倍数寄存器,也可以用于大数。

.