Просмотр полной версии : Обнуление значений после 65535
Доброго времени суток, товарищи пользователи продукции ОВЕН. Имеется проблема,
что уже несколько переменных в облачном сервисе сбрасываются в 0 после преодоления числа 65535.
Конкретно: блок счетчика импульсов в OL (Хотя в руководстве по софту написано, что у int максимальное значение с немалой степенью)
И переменная времени наработки расходомера(просто интовая переменная, передается по модбас).
Проблема в блоке или это уже замашки облака?
Королев Кирилл
05.09.2023, 14:16
Доброго времени суток, товарищи пользователи продукции ОВЕН. Имеется проблема,
что уже несколько переменных в облачном сервисе сбрасываются в 0 после преодоления числа 65535.
Конкретно: блок счетчика импульсов в OL (Хотя в руководстве по софту написано, что у int максимальное значение с немалой степенью)
И переменная времени наработки расходомера(просто интовая переменная, передается по модбас).
Проблема в блоке или это уже замашки облака?
Добрый день!
Как понимаю, используете стандартный счетчик CTN в Owen Logic? Значение на его выходе действительно сбрасывается при достижении 65535 импульсов. Для того, чтобы обойти эту проблему можете использовать макрос 32-разрядного счетчика CTN32 из менеджера компонентов.
Сергей0308
05.09.2023, 14:21
Насколько понимаю, это не решит его проблему, в смысле, для него ничего не изменится, наверняка он передаёт в облако значение одним регистром!
Ему тогда потребуется разбить 32 битную переменную на два регистра, а в облаке назначить тип переменой как 32 битная беззнаковая целочисленная, короче, UDINT.
Сергей, счетчик делает мне мгновенный расход в 2-ух регистровую (вроде бы) float переменную.
Вам не будет тяжело расжевать момент с двухрегистровой переменной? :)
Королев Кирилл
05.09.2023, 17:07
Сергей, счетчик делает мне мгновенный расход в 2-ух регистровую (вроде бы) float переменную.
Вам не будет тяжело расжевать момент с двухрегистровой переменной? :)
Вам нужно будет использовать конструкцию из этого поста (https://owen.ru/forum/showthread.php?t=29262&p=285329&viewfull=1#post285329).
В облаке нужно будет задать тип переменной uint32 и опрашивать, соответственно, два регистра. Не забудьте поставить галочку "младшим регистром вперед".
float тоже ограничен диапазоном значений, но если вы в него вписываетесь, то нормально...
Думаю переменной с плавающей точкой будет достаточно для передачи показаний счетчика (выше оговорился, счетчик показывает накопительные данные, а не расход). Всем спасибо за помощь, буду пробовать переделывать программы
Думаю переменной с плавающей точкой будет достаточно для передачи показаний счетчика (выше оговорился, счетчик показывает накопительные данные, а не расход). Всем спасибо за помощь, буду пробовать переделывать программы
Ха, точность переменной с плавающей точкой всего лишь 7 цифр, даже неважно где будет стоять запятая, т.е.
0.ххххххх
х.хххххх
хх.ххххх
ххх.хххх
хххх.ххх
ххххх.хх
хххххх.х
ххххххх
таким образом всего 9 999 999, а это пшик по сравнению с целочисленной 32-битной переменной (4 294 967 295)
А занимают обе по два регистра.
Какой здесь выигрыш?
Думаю переменной с плавающей точкой будет достаточно для передачи показаний счетчика (выше оговорился, счетчик показывает накопительные данные, а не расход). Всем спасибо за помощь, буду пробовать переделывать программы
Ну, 4294967295 минут - это почти 8 тысяч лет. Думаю, должно хватить и целочисленной переменной
Сергей0308
05.09.2023, 22:14
Так наработку, надо было и делать в часах, тогда бы всё нормально было, в смысле, хватило бы почти на 7,5 лет, практически на весь срок службы! Кстати и в технике стоят счётчики моточесов не бесконечные(по кругу гоняет, как в механическом электросчётчике), в смысле, на миллиарды лет не хватит, но этого и не надо, в смысле, в электросчётчике Вы же не переживаете, что однажды показания "сбросятся" и начнутся с нуля?!
в 4 байта можно закинуть дату до скончания 9999 и время с дискретностью 5 минут :)
Сергей0308
05.09.2023, 23:09
в 4 байта можно закинуть дату до скончания 9999 и время с дискретностью 5 минут :)
В смысле, Вы предлагаете товарищу вместо наработки дату выводить, на случай если он дату забудет? Хорошо, выведет он дату, как Вы предлагаете, в смысле, как он по дате узнает время наработки(моточасы)?
Думаю переменной с плавающей точкой будет достаточно для передачи показаний счетчика
Использование для счетчика переменной Float не очень хорошая идея. Из-за особенностей округления чем больше будет число, тем большая ошибка будет в младших разрядах.
Исходя из ответов буду пробовать использовать все же int32, всем спасибо за помощь :)
Изначальная мысль про Float обусловлена задачей передачи показаний импульсного счетчика расхода воды (у которого 1 имп - 0.1 м3),
а фото с 65535 - пример, это ретрансляция переменной с акрона по MB
Сергей0308 не, я про то, что в программе можно в int упаковать время старта, потом время останова, потом посчитать разницу и вывести в виде 4-х байт время работы. Но придется колдовать со стороны scada как это потом все складывать и раскладывать.
для моточасов конечно проще простой int32 без заморочек. Упаковка времени в 4 байта это больше для отображения событий, аварий и т.д. то есть Дата + Время
Исходя из ответов буду пробовать использовать все же int32, всем спасибо за помощь :)
Изначальная мысль про Float обусловлена задачей передачи показаний импульсного счетчика расхода воды (у которого 1 имп - 0.1 м3),
Целочисленные переменные можно интерпретировать как числа с фиксированной точкой - это нормальная практика,
например для вывода на панель СП есть такой формат
70061
Здесь полученное по сети число 65535 отобразится на экране как 655.35
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot