MODBUS-tk从主站中的从站读取浮点值

时间:2017-06-19 11:03:49

标签: python-3.x tk modbus modbus-tcp

我创建了modbus slave来将数据写入寄存器。 我能够从从属端写入浮点值和整数值。

在modbus主站中,我只能访问整数值,但无法读取浮点值。

我经历了这个https://github.com/ljean/modbus-tk/issues/72,但这并没有解决我的问题。

对于读取的整数值,我可以使用下面的代码并读取值。

master = modbus_tcp.TcpMaster()
master.set_timeout(time_out_period)
result = master.execute(slave = 100, function_code = 3 , starting_address = 0, quantity_of_x = 25) 

但是对于浮点值,我使用了上面和下面的代码。

master = modbus_tcp.TcpMaster()
master.set_timeout(time_out_period)
result = master.execute(slave = 100, function_code = 3 , starting_address = 0, quantity_of_x = 25 , data_format='>f') 

我在读取浮动时遇到错误,

  

unpack需要一个长度为4的字节对象

3 个答案:

答案 0 :(得分:0)

x的数量应该是2的倍数。因为浮点数需要两个16位寄存器或字,所以如果你想要25则应该是50。

答案 1 :(得分:0)

您还需要提供正确的数据格式,以反映试图解压缩的 float值(以下是大端字节);

1个浮动

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 2, data_format='>f'))

2个浮动

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 4, data_format='>ff'))

3个浮动

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 6, data_format='>fff'))

答案 2 :(得分:0)

使用Numpy很简单。 例如:

import numpy as np

# Sample registers to read
start_address = 0
items = 10
# Get the reply from slave
reply = master.execute(1, cst.READ_HOLDING_REGISTERS, start_address, items*2)
# Convert the reply to Numpy array of type int16
d16 = np.array(reply, dtype=np.int16)
# Convert to an array of type float32
f32 = d16.view(dtype = np.float32)