PDA

Просмотр полной версии : Чтение данных с ОВЕН МВ110



Luna
27.05.2023, 14:47
Использую библиотеку для python minimalmodbus

На клемы с 1 по 4 подключены датчики. Мне нужно в программе считать с них информацию.
Использую функцию

read_float(registeraddress=4, functioncode=3, number_of_registers=2 )
read_float(registeraddress=10, functioncode=3, number_of_registers=2 )
read_float(registeraddress=16, functioncode=3, number_of_registers=2 )
read_float(registeraddress=22, functioncode=3, number_of_registers=2 )

Если ставила number_of_registers=4, то получается какая-то ерунда.

использовала метод подбора, вроде читает правильные данные, но совершенно не понятно, почему так. По какому принципу данные хранятся в одном регистре например 4, а не в двух, которые выделены под float значение? И почему с number_of_registers=4 получается неверное значение. Во втором регистре не нулевое значение?
Что значит параметр minimalmodbus.BYTEORDER_BIG, как узнать его верное значение для конкретного устройстваОВЕН МВ110-224.8А

Данные в этих регистрах (4, 10,16,22) в signed формате всегда? Или это где-то может настраиваться?

Правильный ли выбор minimalmodbus? Или может быть посоветуете что-то лучше?

Может быть есть горячая линия, где можно по телефону получить помощь в работе с устройством?

EFrol
27.05.2023, 16:58
Давайте разберемся!
Значение типа float - читаем число одинарной точности (https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8% D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D 1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8)
от куда становиться ясно, что float занимает 4-е байта или два регистра по 2-байта (для Modbus) и всегда signed
в инструкции на Ваш модуль МВ110-224.8A (https://owen.ru/uploads/343/re_mv110-x.8a_m01__1-ru-32147-1.19_a4.pdf) на стр. 43 в примечании к таблице регистров сказано, что старшее слово передается в регистре с меньшим номером (т.е. старшим словом вперед), что соответствует порядку big-endian (https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1% D0%B0%D0%B9%D1%82%D0%BE%D0%B2)
Этой библиотекой не пользовался, но думаю, что необходимо все-таки читать по 4 байта в режиме BYTEORDER_BIG.
Для меня горячая линия - всегда Google и wikipedia.

Luna
27.05.2023, 19:14
Методом перебора оказалось, что правильное значение удается получить только командой
read_float(registeraddress=22, functioncode=3, number_of_registers=2 )

И это противоречит информации из инструкции: 2. Во время передачи четырехбайтовых значений (тип Float32) старшее слово передается в
регистре с меньшим номером.
Получается, что в регистре с меньшим номеров старшее слово и вообще значение датчика только в одном регистре разместилось...

kondor3000
27.05.2023, 19:19
Методом перебора оказалось, что правильное значение удается получить только командой
read_float(registeraddress=22, functioncode=3, number_of_registers=2 )

И это противоречит информации из инструкции: 2. Во время передачи четырехбайтовых значений (тип Float32) старшее слово передается в
регистре с меньшим номером.
Получается, что в регистре с меньшим номеров старшее слово и вообще значение датчика только в одном регистре разместилось...

Float32, это 32 битная переменная, всегда занимает 2 регистра, или 4 байта. Если указан адрес 4, то будет читаться два регистра 4 и 5.
При передаче по модбас могут поменяться местами регистры ( байты),
ваше дело найти правильную комбинацию ( всего 4), одна из них правильная. Чаще всего, достаточно переставить регистры (реже ещё и байты)
На скрине полученная по Модбас переменная, правильное число при перестановке регистров 123.4568 68027

1 регистр или 16 бит (2 байта) могут занимать только целочисленные, типа WORD или INT (INT16)

Если посмотреть на адреса модуля, то там они чередуются
Модули МВ110_8А нужны регистры -
0,6,12,18,24,30,36,42 - смещение десятичной точки,
1,7,13,19,25,31,37,43 - измеренное целое значение без смещения,
2,8,14,20,26,32,38,44 - статус канала,
3,9,15,21,27,33,39,45 - циклическое время,
4-5, 10-11 , 16-17, 22-23, 28-29, 34-35, 40-41, 46-47 - значение REAL (Float)

EFrol
27.05.2023, 20:52
Методом перебора оказалось, что правильное значение удается получить только командой
read_float(registeraddress=22, functioncode=3, number_of_registers=2 )

И это противоречит информации из инструкции: 2. Во время передачи четырехбайтовых значений (тип Float32) старшее слово передается в
регистре с меньшим номером.
Получается, что в регистре с меньшим номеров старшее слово и вообще значение датчика только в одном регистре разместилось...

Предлагаю попробовать так:
read_float(registeraddress=22, functioncode=3, number_of_registers=4, byteorder=BYTEORDER_BIG)
read_float(registeraddress=22, functioncode=3, number_of_registers=4, byteorder=BYTEORDER_LITTLE)
read_float(registeraddress=22, functioncode=3, number_of_registers=4, byteorder=BYTEORDER_BIG_SWAP)
read_float(registeraddress=22, functioncode=3, number_of_registers=4, byteorder=BYTEORDER_LITTLE_SWAP)

В любом случае, какой-то вызов даст верное значение.

Luna
09.06.2023, 22:53
В вашем переборе всегда number_of_register=4, а у меня с таким значением все было неверно, а вот number_of_register=2 сработало. А вот почему так, объяснения нет.

Валенок
10.06.2023, 00:53
...А вот почему так, объяснения нет.
Какого ? - см. пост #4 + в этом конкретном случае в РЭ все правильно.
Канешно 2. EFrol видимо опечатался.


всегда number_of_register=4, а у меня с таким значением все было неверно,
Дык может этот питон переставляет не четверки а восьмерки байт раз указали 4 регистра. Говорят бывают 64-битные данные. Прочитайте эти 8 байт в массив из 2-х флоатов и покажите 2й. Или покажите все 8 байт в hex.