我被分配执行任务而没有任何文档。我从MODBUS读取数据时遇到问题。这是我能够创建的脚本:
从pymodbus.constants导入Endian来自……
我改进了你的代码如下:
from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymodbus.client.sync import ModbusTcpClient def validator(instance): if not instance.isError(): '''.isError() implemented in pymodbus 1.4.0 and above.''' decoder = BinaryPayloadDecoder.fromRegisters( instance.registers, byteorder=Endian.Big, wordorder=Endian.Little ) return float('{0:.2f}'.format(decoder.decode_32bit_float())) else: # Error handling. print("There isn't the registers, Try again.") return None client = ModbusTcpClient('X.X.X.X', port=502) # Specify the port. connection = client.connect() if connection: request = client.read_holding_registers(12606, 2, unit=1) # Specify the unit. data = validator(request) print(data) request = client.read_holding_registers(12482, 2, unit=1) # Specify the unit. data = validator(request) print(data) client.close() else: print('Connection lost, Try again')
[ 的 注意 强> ]:
你确定所需的float32解码吗?
byteorder=Endian.Big, wordorder=Endian.Big
byteorder=Endian.Big, wordorder=Endian.Little
byteorder=Endian.Little, wordorder=Endian.Big
byteorder=Endian.Little, wordorder=Endian.Little
设置 UNIT_ID :
unit
1
[ 的 UPDATE 强> ]:
也许你需要阅读和解码 双/ float64 在...的价值 12482 寄存器地址,因为我认为当doc中所需的寄存器是 12482 而下一个寄存器是 12846 因此我们需要阅读 的 4regs 强> ( float64 /双 ):
12482
12846
request = client.read_holding_registers(12482, 4, unit=1)
和
return float('{0:.2f}'.format(decoder.decode_64bit_float()))
我很确定39558853.30的值很大,可以存储在IEEE单精度浮点数中。精度为7.22位,该数字需要9位数。我做了一些实验,将值赋给float,C#中的double值证实了这一点。
这让我相信:
1)像Benyamin Jafari建议的那样,你需要阅读四个寄存器。但是,十六进制的那个数字(作为一个双精度型)是0x4182dcf62a666666,它似乎不对应您正在读取的任何数据。
要么
2)它也可能作为UINT32返回,必须按(1/100)缩放才能显示计数器显示的内容。 0xE54D4765 = 3847047013 =>按1 / 100.0 = 38470470.13缩放,这与您在柜台上看到的很接近。根据我的经验,这是Modbus的常见做法。
3)他们使用其他(非标准)格式来表示数据。
你能告诉我们产品名称,型号等吗?