Извлечение полезной нагрузки из ведомого в минимальном пите
Я использую минимальную шину для связи с микрометром, использующим протокол RS485, и использую конвертер USB-RS485. Документация по микродвижению Modbus приведена здесь.
когда я читаю число с плавающей запятой из 2 регистров, используя этот код
import minimalmodbus
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
import serial
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
instrument.serial.baudrate = 9600
instrument.serial.timeout = 1
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 0.05
instrument.mode = minimalmodbus.MODE_RTU
instrument.debug = True
try:
values = instrument.read_float(250, 3, 2)
print (values)
except IOError:
print("Failed")
это дает мне этот ответ:
MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00ú\x00\x02ä:' (01 03 00 FA 00 02 E4 3A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1502310315020.7 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x03\x04\x9f3Aâ\x941' (01 03 04 9F 33 41 E2 94 31) (9 bytes), roundtrip time: 28.8 ms. Timeout setting: 50.0 ms.
-3.7959221374830406e-20
который должен быть как 29,879 или 29,78687 что-то в этом роде. это связано с порядком bytestring. Здесь есть обходной путь. https://minimalmodbus.readthedocs.io/en/master/advancedusage.html
как там написано с использованием этого кода
values = read_registers(3924, numberOfRegisters=2)
registerstring = chr(values[2]) + chr(values[3]) + chr(values[0]) + chr(values[1])
floatvalue = minimalmodbus._bytestringToFloat(registerstring)
или что-то подобное, мы можем поставить порядок байтов правильно, чтобы получить нормальный вывод. Но я застрял здесь, используя
values = read_registers(3924, numberOfRegisters=2)
верните singed int, и если вы прочитаете 2 регистра, он выдаст 2 значения в списке.
[61552, 16865]
Как я должен сделать так, чтобы быстрая строка установила правильный порядок. Теперь мой вопрос, как я могу сохранить полезную нагрузку от подчиненного. Я хочу сохранить эту байтовую строку в переменной "\x01\x03\x04\x9f3Aâ\x941", чтобы я мог изменить порядок байтов. и передать его _bytestringToFloat(), чтобы я мог получить фактическое значение. Я новичок, поэтому, пожалуйста, помогите.
1 ответ
Использование struct.pack
а также struct.unpack
конвертировать целые числа в bytestring для плавания.
import struct
r=[61552, 16865]
b=struct.pack('HH',r[0],r[1])
>>> b'p\xf0\xe1A'
struct.unpack('f',b)[0]
>>> 28.242401123046875