Валенок вчера было вчера, просто взял опять из лога ПР200, а RAW это из калькулятора в нете, как видно по нему, байты не переставляются. 99 9A - это одно слово, 41 F1 это второе слово, замена их местами дает правильный результат.
Валенок вчера было вчера, просто взял опять из лога ПР200, а RAW это из калькулятора в нете, как видно по нему, байты не переставляются. 99 9A - это одно слово, 41 F1 это второе слово, замена их местами дает правильный результат.
Валенок простите, а какая разница с какого регистра оно в ПР ? если вторым регистром передается следующий ? Это вам не ПЛК, тут пофигу четным его сделаешь или нечетным.
В моем случае регистры всех float начинаются с нечетных, потому что первым стоит у меня ushort (2 байта) а потом уже пошли float-ы
В ПР нет выравнивания как в ПЛК Овен
спасибо за помощь все получилось
конечный код
- 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
Валенок, неа (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_...cimal=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.
Это один из вариантов, когда нужно экономить сетевые регистры, но если у Вас будет отрицательная температура, появятся другие "костыли".
Вычитать правильно float, займет с перебором всех 4 вариантов две минуты, с любого прибора, SCADA, при этом можно даже не задумываться кто и где переворачивает байты/регистры.
Вставляем в slave константу во float, в мастере перебираем варианты до получения правильного значения, все.
Вторая тема за неделю, 10 страниц инфы, но для новичка, полезности 0:D
проблема в том что в овен лоджик если ставить мастер при одной сетевой плате то все сетевые переменные блокируются от сюда и все тараканы народ не хочет пр загонять в мастер
плюс я так же не понимаю как обратится к мастеру по сети, если со слейвом нужно указать номер устройства славе- то в режиме мастер номер устройства просто отсутствует
по мне так заморочки с переносом сетевых переменных просто сильно усложняют проект и съедают кучу памяти. -поправьте если не прав я сам не разу не переводил устройство в режим мастер как раз из за того что не хочется напасть на другие грабли
плюс конечный итог в режиме славе порядок байт всегда один а с матером при связки большого количества приборов можно запутаться пропадает универсальность .