我正在使用pymodbus模块从tcp客户端读取两个16位寄存器。这两个寄存器组成一个32位IEEE 754编码的浮点数。目前,我具有以下代码中所示的寄存器的32位二进制值。
start_address = 0x1112
reg_count = 2
client = ModbusTcpClient(<IP_ADDRESS>)
response = client.read_input_registers(start_address,reg_count)
reg_1 = response.getRegister(0)<<(16 - (response.getRegister(0).bit_length())) #Get in 16 bit format
reg_2 = response.getRegister(1)<<(16 - (response.getRegister(1).bit_length())) #Get in 16 bit format
volts = (reg_1 << 16) | reg_2 #Get the 32 bit format
上面的方法可以很好地获取问题正在解码的编码值。我打算在video中进行类似的编码,但是在struct模块中遇到了用于IEEE 754编码的'f'格式。我尝试使用struct模块中的unpack方法解码上面代码中存储在volts中的32位浮点数,但遇到以下错误。
val = struct.unpack('f',volts)
>>> TypeError: a bytes-like object is required, not 'int'
确定尝试将其转换为32位二进制字符串。
temp = bin(volts)
val = struct.unpack('f',temp)
>>> TypeError: a bytes-like object is required, not 'str'
试图像post中那样将其隐藏为类似对象的字节,并以不同的方式进行格式化。
val = struct.unpack('f',bytes(volts))
>>> TypeError: string argument without an encoding
temp = "{0:b}".format(volts)
val = struct.unpack('f',temp)
>>> ValueError: Unknown format code 'b' for object of type 'str'
val = struct.unpack('f',volts.encode())
>>> struct.error: unpack requires a buffer of 4 bytes
我在哪里添加此缓冲区,在文档中哪里指出需要unpack方法使用此缓冲区?它确实在文档中说]
字符串必须完全包含格式要求的数据量(len(字符串)必须等于calcsize(fmt))。
calcsize(fmt)函数以字节为单位返回值,但是len(string)返回字符串长度的值,不是吗?
欢迎提出任何建议。
我正在使用pymodbus模块从tcp客户端读取两个16位寄存器。这两个寄存器组成一个32位IEEE 754编码的浮点数。目前,我有32位二进制值...
我使用BinaryPayloadDecoder.fromRegisters()模块中的pymodbus而不是struct模块找到了解决问题的方法。请注意此解决方案特定于我正在使用的Modbus智能电表设备