Валенок вчера было вчера, просто взял опять из лога ПР200, а RAW это из калькулятора в нете, как видно по нему, байты не переставляются. 99 9A - это одно слово, 41 F1 это второе слово, замена их местами дает правильный результат.
Валенок вчера было вчера, просто взял опять из лога ПР200, а RAW это из калькулятора в нете, как видно по нему, байты не переставляются. 99 9A - это одно слово, 41 F1 это второе слово, замена их местами дает правильный результат.
Последний раз редактировалось melky; 31.01.2022 в 10:05.
Валенок простите, а какая разница с какого регистра оно в ПР ? если вторым регистром передается следующий ? Это вам не ПЛК, тут пофигу четным его сделаешь или нечетным.
В моем случае регистры всех float начинаются с нечетных, потому что первым стоит у меня ushort (2 байта) а потом уже пошли float-ы
В ПР нет выравнивания как в ПЛК Овен
Последний раз редактировалось melky; 31.01.2022 в 10:15.
спасибо за помощь все получилось
конечный код
- 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?show...entry112873472
Последний раз редактировалось sergkovalev; 31.01.2022 в 11:01.
Валенок, неа (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 для других систем) в общей настройке, по этому тут на скрине нет указания на порядок.
Последний раз редактировалось melky; 31.01.2022 в 12:06.
Валенок Не знаю, что тут странного, 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_...cimal=41F1999A ну вот например, так что 9A тут самый младший байт
Последний раз редактировалось melky; 31.01.2022 в 22:41.
Валенок честно, никогда не запаривался с 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.
Это один из вариантов, когда нужно экономить сетевые регистры, но если у Вас будет отрицательная температура, появятся другие "костыли".
Вычитать правильно float, займет с перебором всех 4 вариантов две минуты, с любого прибора, SCADA, при этом можно даже не задумываться кто и где переворачивает байты/регистры.
Вставляем в slave константу во float, в мастере перебираем варианты до получения правильного значения, все.
Вторая тема за неделю, 10 страниц инфы, но для новичка, полезности 0
С уважением, Ревака Юрий.
Инженер группы технической поддержки компании "ОВЕН"
e-mail: yu.revaka@owen.ru
Шаблон описания ошибки ПР или OL http://ftp-ow.owen.ru/softupdate/OWE...s/Shablon.docx
Видео уроки по ПР200 и OWEN Logic http://edu.owen.ru/series/pr200_rev/
Другие видеоролики по тематике ПР https://www.youtube.com/channel/UCj4...H5H3d_t6iDlQOQ
проблема в том что в овен лоджик если ставить мастер при одной сетевой плате то все сетевые переменные блокируются от сюда и все тараканы народ не хочет пр загонять в мастер
плюс я так же не понимаю как обратится к мастеру по сети, если со слейвом нужно указать номер устройства славе- то в режиме мастер номер устройства просто отсутствует
по мне так заморочки с переносом сетевых переменных просто сильно усложняют проект и съедают кучу памяти. -поправьте если не прав я сам не разу не переводил устройство в режим мастер как раз из за того что не хочется напасть на другие грабли
плюс конечный итог в режиме славе порядок байт всегда один а с матером при связки большого количества приборов можно запутаться пропадает универсальность .
Последний раз редактировалось sergkovalev; 01.02.2022 в 16:48.