为什么在Python中无法通过Modbus读取正确数据?
我正在尝试从一个电力网络计量器获取数据,具体的设备说明书可以在这里找到:https://www.lumel.com.pl/resources/Pliki%20do%20pobrania/ND25/ND25_service_manual_Interface.pdf。但是我得到的数据对我来说并不“好理解”。我在wireshark中查看到了一些UINT16的值,但这些值似乎不正确。
这是我的代码:
import time
from pyModbusTCP.client import ModbusClient
slave_adress = '192.168.1.10'
port = 502
unit_id = 2
modbus_clinet = ModbusClient(host=slave_adress, port=port, unit_id=unit_id, auto_open=True)
if __name__ == '__main__':
while True:
regs = modbus_clinet.read_holding_registers(reg_addr=0x1772, reg_nb=16)
if regs:
print(regs)
else:
print("baj van")
time.sleep(2)
这是我打印出来的值:
[16640, 0, 16384, 0, 17359, 32768, 16544, 0, 16448, 0, 17096, 0, 0, 0, 16384, 0]
而说明书上写的内容却不一样。
我尝试了不同的Python modbus模块。
1 个回答
3
其实这些值是正确的。你可能忽略了一点,这些是单精度浮点数,它们以一对16位整数的形式发送给你,而这正是ModBus所支持的。前两个值的十六进制表示是0x4100和0,而0x41000000就是浮点数8.0,这也是你请求的46003号寄存器的默认值。
试试这个:
>>> x = [16640, 0, 16384, 0, 17359, 32768, 16544, 0, 16448, 0, 17096, 0, 0, 0, 16384, 0]
>>> import struct
>>> print(struct.unpack('>8f',struct.pack('>16H',*x)))
(8.0, 2.0, 415.0, 5.0, 3.0, 100.0, 0.0, 2.0)
>>>
这些值和文档上的一致。需要注意的是,编码和解码都需要使用大端格式。