Реклама / ООО «ИЗОЛПРОЕКТ» / ИНН: 7725566484 | ERID: 2Vtzqx6kV7S
IPB IPB
Проектирование, монтаж, наладка, сервис


Здравствуйте, гость ( Вход | Регистрация )

- Стандарт НП «АВОК» 7.11-2024
«Рекомендации по проектированию инженерных систем
дошкольных образовательных организаций»

АВОК в соц. сетях
ИНН: 7714824045 | erid: 2VtzqwzKQiU
 
Добавить ответ в эту темуОткрыть тему
> weintek+ взлет ТСРВ, чтение данных long+float
All_Ex81
сообщение 17.2.2023, 8:22
Сообщение #1





Группа: Участники форума
Сообщений: 324
Регистрация: 8.7.2009
Из: Челябинск
Пользователь №: 35787



Коллеги прошу помощи, есть панель weintek, есть взлет ТСРВ, соединены по RS485, протокол modbus
текущие данные со взлета считываются (у них формат float)

у ТСРВ есть накопленные регистры в формате long+float, вот описание этого типа данных с сайта производителя:
Значение находится в 0х8030 0х8031 0х8032 0х8033. Переменная, состоящая из 4 регистров, число повышенной точности. Запрашивать надо сразу 4 регистра в одном запросе.
Первые два регистра 0х8030 0х8031 это целая часть числа в формате signed long,
вторые два 0х8032 0х8033 это дробь в формате float. Обе части имеют одинаковый знак, float находиться в пределах от -1 < float < 1.
Их надо сложить в одно 8 байтовое число типа double после прочтения


пробую читать скриптом:

short a[4]
int b
float c

GetData(a[0], "MODBUS RTU (Zero-based Addressing)", 4x, 32817, 4)
b=a[0]
c=a[2]
SetData(b, "Local HMI", LW, 0, 1)
SetData(c, "Local HMI", LW, 2, 1)


в ответ ноль,
подскажите как прочитать этот формат
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
kosmos440o
сообщение 17.2.2023, 19:10
Сообщение #2





Группа: Участники форума
Сообщений: 3050
Регистрация: 30.9.2010
Из: Иркутск
Пользователь №: 74376



С ноутбука сначала попробуйте, опс-сервером.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
LordN
сообщение 17.2.2023, 19:31
Сообщение #3


МОДЕРАТОР


Группа: Модераторы
Сообщений: 10896
Регистрация: 3.7.2004
Пользователь №: 32



флоат в модбасе имеет четыре байта
в том же модбасе никак не оговаривается в каком порядке их надо передавать
поэтому, если сходу ничего не получилось, принимаем каждый регистр отдельно, как инт, потом ищем в инете формулу, как из четырех байт можно сложить один флоат
и, меняя последовательность байт, пытаемся соорудить искомое.
всего четыре варианта.
тут правда может случиться страшное, какой-нить утырок может и сам байт задом наперед развернуть, да еще и каждый по-своему, это конечно добавит вариантов, но не сильно.
удачи.
хм, как-то встречалось что и тетрады в байтах как попало развёрнуты, но это было один раз, да и то не правда, потому что было давно.

и возьмите себе за правило - первый раз в первый класс всегда ходить с таким набором декодеров.
у меня что ни новый слейв - то пляска с бубном по лонгам, флоатам и даже иногда по интам.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
All_Ex81
сообщение 2.3.2023, 17:25
Сообщение #4





Группа: Участники форума
Сообщений: 324
Регистрация: 8.7.2009
Из: Челябинск
Пользователь №: 35787



Цитата(LordN @ 17.2.2023, 19:31) *
и возьмите себе за правило - первый раз в первый класс всегда ходить с таким набором декодеров.
у меня что ни новый слейв - то пляска с бубном по лонгам, флоатам и даже иногда по интам.


Спасибо, это уже много лет основное правило), не идут данные:
сдвиг плюс минус регистр
изменение формата
изменение порядка слов/байт

Решение по ТСРВ (и всех изделий взлет для long+float),чтение регистра Q ТС1:

short a[4]={0,0,0,0}
int b=0
float c=0
float x=0

GetData(a[0], "TSRV", 3x, 32816, 4)
SetData(a[1], "HMI", LW, 500, 1)
SetData(a[0], "HMI", LW, 501, 1)
SetData(a[3], "HMI", LW, 502, 1)
SetData(a[2], "HMI", LW, 503, 1)
GetData(b, "HMI", LW, 500, 1)
GetData(c, "HMI", LW, 502, 1)

x=b+c

SetData(x, "HMI", LW, 0, 1)

в регистре LW0 панели будет лежать нормальный float (real, число с плавающей точкой и т.д.)
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
manjey73
сообщение 3.3.2023, 11:07
Сообщение #5





Группа: Участники форума
Сообщений: 2132
Регистрация: 1.8.2014
Пользователь №: 240922



в случае, когда long целая часть, а float дробная часть, то есть вариант переполнения выходного float.... столкнулся с этим на ПЛК, когда во float пытался счетчик электроэнергии запихнуть...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
All_Ex81
сообщение 3.3.2023, 13:25
Сообщение #6





Группа: Участники форума
Сообщений: 324
Регистрация: 8.7.2009
Из: Челябинск
Пользователь №: 35787



Цитата(manjey73 @ 3.3.2023, 11:07) *
в случае, когда long целая часть, а float дробная часть, то есть вариант переполнения выходного float.... столкнулся с этим на ПЛК, когда во float пытался счетчик электроэнергии запихнуть...


Интересно, есть ли здесь представители Взлет? Какой ответ на такой извращенный формат?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Добавить ответ в эту темуОткрыть тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Реклама
ООО «Арктика групп» ИНН: 7713634274



ООО "Русич" ИНН 9721068883 / ЕРИД 2VtzqvMjLF8


ООО «УНИСПЛИТ» ИНН: 6453155081 erid:2VtzqxXgvJi

Реклама: ООО «СибСтронг» | ИНН 6670013662 | ERID: 2VtzqwyM2dc
Реклама: ООО «СЛ-ЛАЗЕР» ИНН 7727447267 | erid: 2VtzquvhFWx

Последние сообщения Форума






RSS Текстовая версия Сейчас: 1.8.2025, 3:29
Политика ООО ИИП «АВОК-ПРЕСС» в отношении обработки персональных данных