使用 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创建的,但有什么简单的方法吗)
这可以用于倍数寄存器,也可以用于大数。
.
我正在读取 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创建的,但有什么简单的方法吗)
这可以用于倍数寄存器,也可以用于大数。
.