Просмотр полной версии : ПР-200 переменные с плавающей точкой Float32 и Home assistant
sergkovalev
28.01.2022, 17:23
Подскажите как считать значение сетевой переменной с плавающей точкой
необходимо считать температуру с сенсора Pt100 и передать её в сеть для дальнейшей обработки
данные с сенсора считал а вот передать их в home assistant не могу
уже неделю воюю все форумы перечитал
для включения света все получилось но там целочисленная переменная
- type: rtuovertcp
host: 192.168.43.45
port: 502
name: "hub1"
close_comm_on_error: true
delay: 5
timeout: 5
lights:
- name: "Гостевая"
slave: 16
address: 521
verify:
а вот для сетевых переменных с плавающей запятой засада выдает постоянно рандомные числа
- type: rtuovertcp
host: 192.168.43.45
port: 502
name: "hub1"
close_comm_on_error: true
delay: 5
timeout: 5
sensors:
- name: sensor1
slave: 16
address: 528
data_type: float32
keysansa
28.01.2022, 17:32
Вы по какому протоколу обмениваетесь?
sergkovalev
28.01.2022, 17:59
modbus rtu over tcp
keysansa
28.01.2022, 20:33
modbus rtu over tcp
Интересно. Home Assistant щупаю давно, но Modbus на нем ни разу не использовал.
Попробую числа 1-2.
Есть Owen, B&R, Siemens. Поэкспериментирую.
а вот для сетевых переменных с плавающей запятой засада выдает постоянно рандомные числа
У Owen это похоже в целом проблема, только недавно тема была.
sergkovalev
28.01.2022, 22:27
буду ждать ибо у самого уже мозгов не хватает
У ПР200 порядок байт 2301 (3412 если хотите) для float. Ищите в своем Асистансе как переставлять байты или регистры. Все.
Проблема не в Овен, проблема в головах (с) :)
Ревака Юрий
29.01.2022, 11:58
Подскажите как считать значение сетевой переменной с плавающей точкой
необходимо считать температуру с сенсора Pt100 и передать её в сеть для дальнейшей обработки
данные с сенсора считал а вот передать их в home assistant не могу
уже неделю воюю все форумы перечитал
для включения света все получилось но там целочисленная переменная
Самый простой способ настроить передачу float, задать в логике константу, например 10.0, а дальше в настройках HA искать где настраивается режим передачи порядка байт/регистров, и подобрать настройки чтоб значение передавалось корректно.
А что для освещения использовалось, как данные передаются?, я делал для ПР через HomeKit в HA, тут есть демонстрация: https://www.youtube.com/watch?v=Sv_1fKA8-IU, там же через режим датчиков можно и температуру заводить, работает пока только по отдельности либо выключатели либо датчики.
У ПР200 порядок байт 2301 (3412 если хотите) для float. Ищите в своем Асистансе как переставлять байты или регистры. Все.
Проблема не в Овен, проблема в головах (с) :)
+100500
т.к стандарт модбас ничего не говорит о порядке регистров для каких-то там float и даже не знает о их существовании.
И каждый производитель ПЛК, использующий протокол модбас, волен интерпретировать набор регистров(байтов) и их порядок следования как ему больше нравиться.
petera я думаю тут не воля интерпретации, а прямая зависимость от типа примененного процессора в устройстве, зачем заставлять маломощное устройство делать постоянно лишнюю работу, когда на верхнем уровне можно разобрать так, как требуется верхнему уровню.
Валенок фигню несете, просто регистры переставлены местами а не байты еще.
sergkovalev
29.01.2022, 15:49
Так а по теме то что нибудь дельное есть ???
Для большей детализации в :
В щите два модуля пр-200 с расширениями прм 220.1 оба пр имеют аналоговые входы и аналоговые выходы. Работа обоих приборов происходит в режиме slave. В хоме ассистант в протоколе modbus перестановку бит и регистров вроде нашел значение value
Доберусь до сервера попробую поменять
https://www.home-assistant.io/integrations/modbus/
sergkovalev
29.01.2022, 20:46
Про биты все понятно но засада в том как передать правильный порядок битового ригистра либо как его принять со стороны хомяка значение value не прокатило оно на запись
sergkovalev
29.01.2022, 20:49
Осталось попробовать перевести одно из устройств в мастер просто не знаю как будет проходить опрос в мастере
Про биты все понятно но засада в том как передать правильный порядок битового ригистра либо как его принять со стороны хомяка значение value не прокатило оно на запись
Так вот же параметр swap
58998
начинать со значения word
Валенок мы работаем с сетью Modbus, а не непосредственно с процессором, если в прошивке переставили байты для простоты но не переставляли регистры, то какая в разница. МЫ ПО СЕТИ MODBUS получаем от ПР200 3412 - ВСЕ на этом.
И не надо еще больше запутывать человека :) в данном конкретном случае ему надо просто поменять слова (WORD) местами.
keysansa
30.01.2022, 11:15
)) 32-битное от ПР-200(который 4321) ПО СЕТИ MODBUS получаем в том же 4321.
А от обработчика сеть-приложение МЫ, на НАШЕЙ машине(1234), с учетом модбас(21), получаем 3412.
Согласен, какой порядок на мастер передаст, такой порядок и будет.
Валенок что значит надеемся? у меня в котельной висит ПР200 и я его float читаю в порядке байт 3412 и так же записываю. Но не асистансем а Scada системой с Little Endian (соответственно в ПК у меня 1234), что сейчас для ПК вполне норма если там x86 процессор. То есть никакие байты в слове я не переставляю
keysansa
30.01.2022, 12:44
Валенок что значит надеемся? у меня в котельной висит ПР200 и я его float читаю в порядке байт 3412 и так же записываю. Но не асистансем а Scada системой с Little Endian (соответственно в ПК у меня 1234), что сейчас для ПК вполне норма если там x86 процессор. То есть никакие байты в слове я не переставляю
Всего-то значит, что конкретный контроллер в конкретное время отдает байты в этом порядке.
keysansa боже, да разные контроллеры выдают по разному, как отдает ПР200 написал в самом первом посте и не надо больше ничего выдумывать.
И на форуме уже давно определили, что положения галочек для слейва не действуют, а только для мастера, чтобы правильно выставлять порядок байт из других устройств...
Не в конкретное время, а в режиме слейв ВСЕГДА
Ну где вы в моем пакете увидели еще переставленные байты в слове?????
99 9A 41 F1
# -- Raw -- Float
0 -- 41 F1 99 9A -- 30.2
Валенок вчера было вчера, просто взял опять из лога ПР200, а RAW это из калькулятора в нете, как видно по нему, байты не переставляются. 99 9A - это одно слово, 41 F1 это второе слово, замена их местами дает правильный результат.
Валенок простите, а какая разница с какого регистра оно в ПР ? если вторым регистром передается следующий ? Это вам не ПЛК, тут пофигу четным его сделаешь или нечетным.
В моем случае регистры всех float начинаются с нечетных, потому что первым стоит у меня ushort (2 байта) а потом уже пошли float-ы
В ПР нет выравнивания как в ПЛК Овен
sergkovalev
31.01.2022, 10:28
спасибо за помощь все получилось
конечный код
- type: rtuovertcp
host: 192.168.43.45 # ip шлюза через который подключен прибор к home assistant
port: 502 # порт шлюза
name: "hub1"
close_comm_on_error: true
delay: 5
timeout: 5
sensors:
- name: sensor1
slave: 17 #(номер устройства в сети)
address: 528 #(адресс переменной)
swap: word #(смена порядка чтения бит на 3412)
precision: 2 #(число знаков после запятой)
data_type: float32
пробелы не отображаются корректно в форуме но общий вид кода верен
все приборы работают в режиме Slave
подробности и точный код по ссылке https://4pda.to/forum/index.php?showtopic=871505&st=19800#entry112873472
Валенок, неа (00 00 (это 2 байта ushort) 00 00 00 00 (это 4 байта UTC время у меня) 99 9A.. а уже это и далее это float у меня )
Опять же, адрес с 0 то есть 2 байта = 0, 4 байта 1 и 2, далее float. А если сравнивать с ПЛК100 например, то еще бы пару байт образовалось перед float но на ПР нет выравнивания, можно лепить куда и как угодно.
Да не структура это, просто так переменные в ПР расположил. Порядок байт для всех float установлен 2301(3412 для других систем) в общей настройке, по этому тут на скрине нет указания на порядок.
Валенок Не знаю, что тут странного, RAW это отображение числа, как оно должно быть 0х41 (самый старший байт) 0хF1 (младшее) 0х99 (еще младшее) 0х9A (самый младший байт) когда в онлайн калькулятор подставляешь 99 9A 41 F1 - он говорит, что это Float - Mid-Little Endian (CDAB) тут буквенный порядок байт, что соответствует 3412.
Есть масса онлайн калькуляторов, по которым можно проверить, что надо переставить, зная реальное число
Соответственно если вам надо в ПЛК превратить в правильное число то надо правильно расположить, как впрочем и в ПК.
А че, в ST массивы с 1-цы ? ООООО
http://www.binaryconvert.com/result_float.html?hexadecimal=41F1999A ну вот например, так что 9A тут самый младший байт
Валенок честно, никогда не запаривался с Modbus, хватало калькуляторов, чтобы понять, какой порядок прописать для перестановки байт из устройства, просто считав любой float, пока ни разу не ошибался.
Если вы про OSI, можно покопаться в исходниках Modbus драйвера, ну или просто спросить у разработчика.
Факт остается фактом, из ПР200 на Scada, HA достаточно было переставить как я написал и не париться.
Валенок Ну? регистр СТАРШИМ байтом вперед, 99 9A как раз и есть 99 старший байт, 9A младший байт - что не так то? Так же как и 41 старший байт а F1 младший байт. Переставив местами и получаем 0x41F1999A что соответствует нашему числу.
Другое дело, что из массива байт в языках должно быть [9A 99 F1 41] чтобы преобразовать его во float, думаю не только в C#, то есть именно массив байт преобразовать нужно такое расположение если у нас архитектура процессора LittleEndian. Вот именно этим похоже и занимается сам драйвер Modbus.
А нам какое дело лезть в дебри? не на ПЛК же разбор полетов устраиваем, разбирая принятый массив.
Здравствуйте. Нужно было передать значение с аналогового входа ПР200 (температура от PT100) в телемеханикалайт, соответственно возникла та же проблема, что у ТС. Полученное значение (флот32) умножил на 100 и преобразовал в int, передал в скаду и разделил на 100.
Ревака Юрий
01.02.2022, 14:40
Здравствуйте. Нужно было передать значение с аналогового входа ПР200 (температура от PT100) в телемеханикалайт, соответственно возникла та же проблема, что у ТС. Полученное значение (флот32) умножил на 100 и преобразовал в int, передал в скаду и разделил на 100.
Это один из вариантов, когда нужно экономить сетевые регистры, но если у Вас будет отрицательная температура, появятся другие "костыли".
Вычитать правильно float, займет с перебором всех 4 вариантов две минуты, с любого прибора, SCADA, при этом можно даже не задумываться кто и где переворачивает байты/регистры.
Вставляем в slave константу во float, в мастере перебираем варианты до получения правильного значения, все.
Вторая тема за неделю, 10 страниц инфы, но для новичка, полезности 0:D
sergkovalev
01.02.2022, 16:42
проблема в том что в овен лоджик если ставить мастер при одной сетевой плате то все сетевые переменные блокируются от сюда и все тараканы народ не хочет пр загонять в мастер
плюс я так же не понимаю как обратится к мастеру по сети, если со слейвом нужно указать номер устройства славе- то в режиме мастер номер устройства просто отсутствует
по мне так заморочки с переносом сетевых переменных просто сильно усложняют проект и съедают кучу памяти. -поправьте если не прав я сам не разу не переводил устройство в режим мастер как раз из за того что не хочется напасть на другие грабли
плюс конечный итог в режиме славе порядок байт всегда один а с матером при связки большого количества приборов можно запутаться пропадает универсальность .
Ревака Юрий
01.02.2022, 17:03
проблемма в том что в овен лоджик если ставить мастер при одной сетевой плате то все сетевые переменные блокируются от сюда и все тараканы народ не хочет пр загонять в мастер
плюс я так же не понимаю как обратится к мастеру по сети, если со слейвом нужно указать номер устройства славе- то в режиме мастер номер устройства просто отсутствует
по мне так заморочки с переносом сетевых переменных просто сильно усложняют проект и съедают кучу памяти. -поправьте если не прав я сам не разу не переводил устройство в режим мастер как раз из за того что не хочется напасть на другие грабли
В каждом режиме свои + и -, естественно если ПР мастер, то он ко всем обращается и в нем задается адрес слейва, граблей никаких нет, просто в зависимости от задачи нужно сразу определиться с ролями устройств.
плюс я так же не понимаю как обратится к мастеру по сети
В модбас сети мастер только один , основной недостаток мастера ПР200 -отсутствие групповых запросов.
sergkovalev никаких проблем когда один интерфейс мастер а другой слейв у ПР200, у меня так и работает, ПР опрашивает МВ110 и является слейвом для Scada
sergkovalev
02.02.2022, 13:02
В том то и дело вы опрашиваете с помощью мастера другие устройства.
но мастер не может общаться на прямую со сторонним софтом.
то есть мастер понимает всех и принимает все данные но отдать эти данные сам не может.
получается он как немой все понимает а сказать ни чего не может, только через других а другие так и продолжают разговаривать на своем языке-со своей четностью битов и регистров. то есть он по факту может служить проводником но картина не меняется при опросе мв110 он просто понимает его но в сеть для стороннего софта передаются уже данные формата МВ110 либо в противном случае нужно ставить вторую интерфейсную плату чтоб пр-200 работал сразу в режиме славе и мастер
тогда через славе интерфейс он сможет уже передавать свою четность но по факту эта четность будет только 3412 или же тот каким он является для других устройств в сети но не тот который нужен для стороннего софта. это как форд в начале 19 столетия (Генри Форд: "Цвет автомобиля может быть любым, при условии, что он черный" )
P.S:Было бы не плохо если бы в овен лоджик разрешили менять очередность регистров в режиме slave.
sergkovalev
1. у ПР ДВА интерфейса, мастер для модулей, слейв для мастера ВЫШЕ (Scada, HA, иное)
2. Если мастер это SOFT то тут вы не правы, мастер вполне может передать данные из одного устройства в другое, но это возможности софта, если ваш HA так не может, то извините, бананив нема....
P.S. зачем? мастер на то и мастер, чтобы уметь понимать все и вся...
Валенок не надо натягивать теории на заговоры. Производителям маломощных железок не обязательно выдерживать все правила передачи пакетов, кроме необходимого минимума, например CRC Modbus байтом вперед, Адрес, количество считываемых регистров и т.д. То есть те параметры, без которых их устройство не поймет другой Мастер. Дальше дело за более мощным устройством.
Если же производители учитывают OSI, насколько понимаю, там передача должна выполняться старшим байтом вперед для float то опять же на уровне драйверов массив байт выполняет реверс и дается команда на преобразование. В языках есть функции определения типа процессора на ПК, на котором запущен процесс.
Но проблема в том, что не все производители устройств поддерживают правила передачи... По этому и нет смысла особо заморачиваться, тем более для таких протоколов, как Modbus, особенно если в ПО, использующему Modbus, предусмотрены перестановки байт, слов... Определил один раз, как устройство передает, выставил параметры перестановки и забыл...
aleks31031992
22.04.2025, 15:50
добрый день. Нашли решение проблемы?
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot