问题描述
需要帮助将存储寄存器解码为二进制格式。读取时,我得到一个 8 到 15 位的值。我无法读取 0 到 7 位的值,我想将 0-15 位计算为请求,但是 8-15 进来了。我做错了什么? 我尝试了不同的寄存器轮询组合:
(res5.registers,Endian.Big,Endian.Big).decode_bits
(res5.registers,Endian.Little,Endian.Little).decode_bits
Modbus 从站:ID:1 F:03 0: -47,2 (float32) 1: 2:-7565(整数) 3:-3(整数) 4:4581(单位) 5:5555(单位) 6:67(单位) 7:76(单位) 8:0000 0001 0101 1001(布尔值) 9:0000 0100 0110 0011(布尔)
版本 蟒蛇:3.9.1 操作系统:Windows 10 专业版 2004 Pymodbus:2.5.1,客户端:RTU
# code
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
client = ModbusSerialClient(method='rtu',port='COM5',baudrate=19200,timeout=3,parity='N',stopbits=1,bytesize=8)
if client.connect():
res1 = client.read_holding_registers(0,10,unit=1)
res2 = client.read_holding_registers(0,2,unit=1)
res3 = client.read_holding_registers(2,1,unit=1)
res4 = client.read_holding_registers(3,unit=1)
res5 = client.read_holding_registers(8,unit=1)
if not res3.isError():
print(res1)
print(res1.registers)
print("-" * 60)
print(BinaryPayloadDecoder.fromregisters(res2.registers,Endian.Big).decode_32bit_float())
print(BinaryPayloadDecoder.fromregisters(res3.registers,Endian.Little).decode_16bit_int())
print(BinaryPayloadDecoder.fromregisters(res4.registers,Endian.Little).decode_16bit_int())
print(BinaryPayloadDecoder.fromregisters(res5.registers,Endian.Little).decode_bits())
else:
print(res3,'Error')
# print('\n')
print("-" * 60)
else:
print('Cannot connect Modbus Server/Slave')
日志
ReadHoldingRegistersResponse (10) [49724,52429,57971,65533,4581,5555,67,76,345,1123]
-47.20000076293945 -7565 -3 [真假假假假假假假假假假]
解决方法
正如我在评论中所说,我不完全确定我理解您的问题所在。
但重点关注如何使用 decode_bits()
获取整个 16 位寄存器,您可以执行以下操作:
# First read the register:
reg = client.read_holding_registers(8,1,unit=1)
# Then instantiate your decoder with the right configuration
decoder = BinaryPayloadDecoder.fromRegisters(reg,Endian.Big,Endian.Little)
# And now do the decoding,first 8 bits:
bits_in_reg = decoder.decode_bits()
# And 8 bits more,note the += to keep and shift the bits you just read
bits_in_reg += decoder.decode_bits()
您尝试这样做的方式是否更有意义?我猜……但是 decode_bits()
函数被实现为读取字(8 位块)而不是寄存器
为了完整起见,我在这里添加了一个示例。如果我定义 regs=[128,129]
这就是运行上面的代码后得到的结果:
[False,False,True]
如果我再调用 decoder.decode_bits()
两次,我会得到这个:
[False,True,True]