Показано с 1 по 7 из 7

Тема: Чтение данных с ОВЕН МВ110

  1. #1

    Question Чтение данных с ОВЕН МВ110

    Использую библиотеку для 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? Или может быть посоветуете что-то лучше?

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

  2. #2

    По умолчанию

    Давайте разберемся!
    Значение типа float - читаем число одинарной точности
    от куда становиться ясно, что float занимает 4-е байта или два регистра по 2-байта (для Modbus) и всегда signed
    в инструкции на Ваш модуль МВ110-224.8A на стр. 43 в примечании к таблице регистров сказано, что старшее слово передается в регистре с меньшим номером (т.е. старшим словом вперед), что соответствует порядку big-endian
    Этой библиотекой не пользовался, но думаю, что необходимо все-таки читать по 4 байта в режиме BYTEORDER_BIG.
    Для меня горячая линия - всегда Google и wikipedia.

  3. #3

    По умолчанию

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

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

  4. #4

    По умолчанию

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

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

    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)
    Последний раз редактировалось kondor3000; 27.05.2023 в 21:15.

  5. #5

    По умолчанию

    Цитата Сообщение от Luna Посмотреть сообщение
    Методом перебора оказалось, что правильное значение удается получить только командой
    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)

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

  6. #6

    По умолчанию

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

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Цитата Сообщение от Luna Посмотреть сообщение
    ...А вот почему так, объяснения нет.
    Какого ? - см. пост #4 + в этом конкретном случае в РЭ все правильно.
    Канешно 2. EFrol видимо опечатался.

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

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 14.12.2019, 11:07
  2. ЧТЕНИЕ ДАННЫХ ИЗ ПОРТА RS-232
    от deniska13 в разделе ПЛК1хх
    Ответов: 12
    Последнее сообщение: 14.04.2017, 09:58
  3. Чтение данных с СПК110 по RS 232
    от GoodLuck в разделе СПК1хх
    Ответов: 3
    Последнее сообщение: 24.11.2015, 21:46
  4. Чтение данных СИ8
    от Sevel в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 14.11.2014, 17:46
  5. Чтение данных с ТРМ 138 в паскале
    от Дмитрий Щаднев в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 03.03.2011, 13:36

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •