MODBUS-tk Чтение значений с плавающей точкой из ведомого в мастере

Я создал ведомый Modbus для записи данных в регистры. Я могу написать как значения с плавающей запятой, так и целочисленные значения со стороны ведомого устройства.

В мастере 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') 

Я получаю ошибку при чтении с плавающей точкой,

для распаковки требуется байтовый объект длиной 4

1 ответ

Значение x должно быть кратным 2. Поскольку для числа с плавающей запятой требуется два 16-битных регистра или слова, поэтому, если вы хотите 25, это должно быть 50.

Вам также необходимо предоставить правильный формат данных, отражающий количество отдельных 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'))

Это просто, используя 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)
Другие вопросы по тегам