im从modbusTCP服务器中提取数据,但是当我收到一个负值时,它显示为一个很大的数字。
self.export = self.c.read_holding_registers(37113, 2)[1]
我知道这与它的签署或未签名有关,但我真的很难解决。
print("export: " + "{:02f}W".format(self.inverter.export))
print("exportBytes: " + "{:16b}W".format(self.inverter.export))
print("export: " + "{:02f}W".format(self.inverter.export))
print("export 1: " + "{:16b}W".format(1))
print("export-1: " + "{:16b}W".format(-1))
印出
export: 59142.000000kW
exportBytes: 1110011100000110kW
export: 59142.000000kW
export 1: 1kW
export-1: -1kW
有什么猜测吗?
发布于 2022-10-16 20:13:51
接收到的字节被隐式转换为无符号int。
要转换为签名的int,我们将
varBytes = theInteger.to_bytes(2, 'big') # getting raw bytes
signedInt = int.from_bytes(varBytes , byteorder='big', signed = True) # getting signet int vale
复制到作为unsigned.The的int的" int“是由python隐式转换到int的。
发布于 2022-10-25 19:04:33
我认为麦德斯的解决方案是可行的,但这也许更能说明目前的情况:
def int16_decode(uint16_val):
if uint16_val > 0x8000:
uint16_val -= 0x10000
return uint16_val
这就是如何将签名的in存储在内存中。int16类似于uint16,但最重要的位被保留为符号位。所以,如果你把负int16读成一个uint16,它会非常大,因为最重要的16位是1。
https://stackoverflow.com/questions/74087534
复制相似问题