Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: weintek+ взлет ТСРВ
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Автоматизация систем
All_Ex81
Коллеги прошу помощи, есть панель 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
С ноутбука сначала попробуйте, опс-сервером.
LordN
флоат в модбасе имеет четыре байта
в том же модбасе никак не оговаривается в каком порядке их надо передавать
поэтому, если сходу ничего не получилось, принимаем каждый регистр отдельно, как инт, потом ищем в инете формулу, как из четырех байт можно сложить один флоат
и, меняя последовательность байт, пытаемся соорудить искомое.
всего четыре варианта.
тут правда может случиться страшное, какой-нить утырок может и сам байт задом наперед развернуть, да еще и каждый по-своему, это конечно добавит вариантов, но не сильно.
удачи.
хм, как-то встречалось что и тетрады в байтах как попало развёрнуты, но это было один раз, да и то не правда, потому что было давно.

и возьмите себе за правило - первый раз в первый класс всегда ходить с таким набором декодеров.
у меня что ни новый слейв - то пляска с бубном по лонгам, флоатам и даже иногда по интам.
All_Ex81
Цитата(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
в случае, когда long целая часть, а float дробная часть, то есть вариант переполнения выходного float.... столкнулся с этим на ПЛК, когда во float пытался счетчик электроэнергии запихнуть...
All_Ex81
Цитата(manjey73 @ 3.3.2023, 11:07) *
в случае, когда long целая часть, а float дробная часть, то есть вариант переполнения выходного float.... столкнулся с этим на ПЛК, когда во float пытался счетчик электроэнергии запихнуть...


Интересно, есть ли здесь представители Взлет? Какой ответ на такой извращенный формат?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.