PDA

Просмотр полной версии : Как посчитать остаток от деления числа с плавающей запитой?



ProRus
07.10.2022, 12:12
Здравствуйте!

Есть число более 10 знаков (Целочисленный тип не подходит).
Значит использую тип с плавающей запятой.

Мне необходимо узнать последние четыре знака перед запятой.
Подскажите как это сделать?

Например в python это выглядит так (значение % 10000).
Как реализовать в Owen Logic?

Godlike_S
07.10.2022, 13:11
Не понятно что нужно сделать. Узнать результат дробной части деления или просто узнать последние 4 знака после запятой?

kondor3000
07.10.2022, 13:15
Здравствуйте!

Есть число более 10 знаков (Целочисленный тип не подходит).
Значит использую тип с плавающей запятой.

Мне необходимо узнать последние четыре знака перед запятой.
Подскажите как это сделать?

Например в python это выглядит так (значение % 10000).
Как реализовать в Owen Logic?

И в Лоджике и в Кодесис точно также можно умножить Float на 10000 и конвертировать в целочисленное но только до 10 знаков и не больше 4294967295.

1exan
07.10.2022, 13:16
udResult := real_to_udint(input) - (real_to_udint (input / 10000) * 10000);
если в диапазон udint влезаете

Godlike_S
07.10.2022, 13:23
udResult := real_to_udint(input) - (real_to_udint (input / 10000) * 10000);
если в диапазон udint влезаете

Если исходить из условий задачи то вряд ли влезет

ProRus
07.10.2022, 13:38
То что нужно, но если значение real больше 10-ти символов, выдает погоду.
А real_to_lint не работает.
63017
Похоже нужно алгоритм полностью менять. :(

Godlike_S
07.10.2022, 13:45
То что нужно, но если значение real больше 10-ти символов, выдает погоду.
А real_to_lint не работает.
63017
Похоже нужно алгоритм полностью менять. :(
В лоджике нет 32-х разрядного целого...
Пардон, 64-х разрядного целого :) После ковида башка вообще не але...

ProRus
07.10.2022, 13:50
Я уже понял.
Значит задачка невыполнима. :confused:

Godlike_S
07.10.2022, 13:59
Я уже понял.
Значит задачка невыполнима. :confused:
Сейчас проверю одну идею... Был бы кодесис, там со строками это на раз-два :)

ProRus
07.10.2022, 14:00
Идея была следующей.
Хотел передавать через сетевую переменную (для экономии переменных) длинное число и вычленять из него необходимые данные, записывая в переменные. Возможно подскажите другой вариант?
Например:
ccmmssddmmyyyytthhll
cc - время
mm - месяц
ss - секунды
dd - день
mm - месяц
yyyy - год
tt - температура
hh - влажность
ll - освещенность

petera
07.10.2022, 14:06
Здравствуйте!

Есть число более 10 знаков (Целочисленный тип не подходит).
Значит использую тип с плавающей запятой.

Мне необходимо узнать последние четыре знака перед запятой.
Подскажите как это сделать?

Например в python это выглядит так (значение % 10000).
Как реализовать в Owen Logic?

Не дурите голову, в ОЛ используется Float (IEEE754)
Для таких чисел точность 6..7 цифр, и даже не после запятой, а ВСЕГО - 6..7 цифр!

О каких более 10 знаков может идти речь?

ЗЫ.
Для тех, кто в танке...
Float (IEEE754).
Для мантиссы отводится всего 23 бита из 32. В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.

63018

Godlike_S
07.10.2022, 14:29
Идея была следующей.
Хотел передавать через сетевую переменную (для экономии переменных) длинное число и вычленять из него необходимые данные, записывая в переменные. Возможно подскажите другой вариант?
Например:
ccmmssddmmyyyytthhll
cc - время
mm - месяц
ss - секунды
dd - день
mm - месяц
yyyy - год
tt - температура
hh - влажность
ll - освещенность

А мастером кто будет?

ProRus
07.10.2022, 14:40
Ох, точно.
Мастер не сможет передать такое число. :cool:
Запарился, бывает. :o
Значит вопрос сам собою отпал.

petera
07.10.2022, 14:42
Идея была следующей.
Хотел передавать через сетевую переменную (для экономии переменных) длинное число и вычленять из него необходимые данные, записывая в переменные. Возможно подскажите другой вариант?
Например:
ccmmssddmmyyyytthhll
cc - время
mm - месяц
ss - секунды
dd - день
mm - месяц
yyyy - год
tt - температура
hh - влажность
ll - освещенность

Для упаковки ccmmssddmmyyyy в одну переменную не нужно изобретать велосипед - есть стандартное представление UNIX time (число секунд с 0 часов 1 января 1970г)
Макросы для работы с UNIX time - https://owen.ru/forum/showthread.php?t=25068&p=219991&viewfull=1#post219991

ЗЫ
tthhll - легко упаковываются во вторую переменную

Godlike_S
07.10.2022, 14:51
Ох, точно.
Мастер не сможет передать такое число. :cool:
Запарился, бывает. :o
Значит вопрос сам собою отпал.

Осталось только дать пример, ув. petera все остальное уже сказал...
63019

ProRus
07.10.2022, 15:13
Для упаковки ccmmssddmmyyyy в одну переменную не нужно изобретать велосипед - есть стандартное представление UNIX time (число секунд с 0 часов 1 января 1970г)
Макросы для работы с UNIX time - https://owen.ru/forum/showthread.php?t=25068&p=219991&viewfull=1#post219991

ЗЫ
tthhll - легко упаковываются во вторую переменную

Спасибо!
Посмотрю в эту сторону.

ProRus
07.10.2022, 15:13
Осталось только дать пример, ув. petera все остальное уже сказал...
63019
Спасибо за пример!

Сергей0308
07.10.2022, 17:10
Многократно подобные вопросы по плотной упаковке переменных рассматривались на форуме, откуда такое абсолютное непонимание процесса берётся просто не нахожу разумного объяснения!
Например имеется две целочисленные переменные диапазона 0-255, каждая занимает по 8 бит, можно упаковать в одну переменную и передать одним регистром!
Кроме того, в зависимости от необходимой точности, можно и сам диапазон сжать!
Надеюсь, доходчиво написал?!

63021

Кроме того обсуждали вопрос как одним регистром(16 бит) передавать по сети до 128 переменных, это когда спешить некуда, в смысле период обновления не критичен(может занимать несколько секунд)!

Валенок
07.10.2022, 17:32
А какая цель этого кроилова? Надо jpeg-фотку сжать, а то ПР долго ее передает?

Сергей0308
07.10.2022, 17:48
А какая цель этого кроилова? Надо jpeg-фотку сжать, а то ПР долго ее передает?

Я же уже в какой-то теме объяснял, из-за ограниченности(нехватки) ресурсов, например одна булева переменная занимает один байт, если их собрать в одну целочисленную переменную потребуется в 8 раз меньше энергонезависимой памяти или в 8 раз больше таких переменных сможем использовать! Аналогично и с сетевыми переменными их количество в режиме слейв ограничено(64 штуки).

63023

melky
08.10.2022, 09:25
Какая цель делать макрос на 32 бита, если при организации сети придется опять делить на 2 по 16 ? Вот где непонимание...

Валенок
09.10.2022, 00:32
Я же уже в какой-то теме объяснял, из-за ограниченности(нехватки) ресурсов ...
если технология зависит от ограничености ресурсов - меняйте железо.


...в режиме слейв ограничено(64 штуки)
ТС пока не показал занятых 64 регистра. Пока упаковка ради упаковки.

ProRus
10.10.2022, 06:15
откуда такое абсолютное непонимание процесса берётся просто не нахожу разумного объяснения!
Все просто.
Есть те, кто только начинает погружаться в промышленную автоматику и начинать с ПЛК160, ПЛК200 просто нет возможности и средств.
Поэтому изучаем на том, что есть под рукой из более менее доступного с возможностью дальнейшего расширения. Для меня, OwenLogic более доступен на сегодняшний день, чем CodeSys.


Надеюсь, доходчиво написал?!
Наверное да, но для меня на данное время байты, биты, регистры только на стадии теории.
Я как раз и ждал подобного сообщения, что бы подтолкнули в каком направлении двигаться. Спасибо!


Кроме того обсуждали вопрос как одним регистром(16 бит) передавать по сети до 128 переменных, это когда спешить некуда, в смысле период обновления не критичен(может занимать несколько секунд)!
Совершенно некуда.

ProRus
10.10.2022, 06:18
если технология зависит от ограничености ресурсов - меняйте железо.


ТС пока не показал занятых 64 регистра. Пока упаковка ради упаковки.

Это очень легкий путь, который не всегда оправдан. Ну и мы не ищем легких путей.


ТС пока не показал занятых 64 регистра. Пока упаковка ради упаковки.
Предыдущее я показал как пример.
А на самом деле пользователь должен передать с HMI в ПР102 порядка 200 переменных, 32 из которых с плавающей точкой.
Я думаю, что подобная задача даже для профи будет не самой легкой, для меня тем более.
Но я не остановлюсь и найду решение без замены устройства.

1exan
10.10.2022, 07:35
Это очень легкий путь, который не всегда оправдан. Ну и мы не ищем легких путей.


Предыдущее я показал как пример.
А на самом деле пользователь должен передать с HMI в ПР102 порядка 200 переменных, 32 из которых с плавающей точкой.
Я думаю, что подобная задача даже для профи будет не самой легкой, для меня тем более.
Но я не остановлюсь и найду решение без замены устройства.

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

melky
10.10.2022, 09:10
А на самом деле пользователь должен передать с HMI в ПР102 порядка 200 переменных, 32 из которых с плавающей точкой.
не пытайтесь изнасиловать железо, ничего у вас не получится.

Валенок
10.10.2022, 10:04
Это очень легкий путь, который не всегда оправдан. .....найду решение без замены устройства.
Цена_этого_ПР + Время_найду * цена_вашего_времени значительно меньше цены другого девайтса ? Если вписываетесь (быстро найдете и/или работаете за еду) - то удачи ))


порядка 200 переменных, 32 из которых с плавающей точкой.

Индексация предложена выше 1exan'ом. Снимает ограничения в принципе. Вопросы только в синхронизации.

melky
10.10.2022, 10:06
Кроме индексации в ПР еще тому же придется научить панель HMI, что будет невозможным без скриптов. Сильно сомневаюсь, что там панель настолько умная....

ProRus
10.10.2022, 12:46
Цена_этого_ПР + Время_найду * цена_вашего_времени значительно меньше цены другого девайтса ? Если вписываетесь (быстро найдете и/или работаете за еду) - то удачи ))
Индексация предложена выше 1exan'ом. Снимает ограничения в принципе. Вопросы только в синхронизации.
Это концепт и эксперименты, поэтому время не имеет особого значения.
Но я все равно этот эксперимент пока отложу до момента накопления знаний и опыта.
А пока решил передавать партиями по 24-ре переменных.

ProRus
10.10.2022, 12:47
Кроме индексации в ПР еще тому же придется научить панель HMI, что будет невозможным без скриптов. Сильно сомневаюсь, что там панель настолько умная....
Об этом я еще не думал... ;) Решаем проблемы по мере их обнаружения.

melky
10.10.2022, 13:10
Ну так загляните в документацию своей HMI и узбагойтесь :) это вам не 2 ПР связать через .....

1exan
10.10.2022, 13:17
Это концепт и эксперименты, поэтому время не имеет особого значения.
Но я все равно этот эксперимент пока отложу до момента накопления знаний и опыта.
А пока решил передавать партиями по 24-ре переменных.

Опишите задачу - возможно есть и другие пути её решения

Godlike_S
12.10.2022, 10:22
Все просто.
Есть те, кто только начинает погружаться в промышленную автоматику и начинать с ПЛК160, ПЛК200 просто нет возможности и средств.
Поэтому изучаем на том, что есть под рукой из более менее доступного с возможностью дальнейшего расширения. Для меня, OwenLogic более доступен на сегодняшний день, чем CodeSys.


Наверное да, но для меня на данное время байты, биты, регистры только на стадии теории.
Я как раз и ждал подобного сообщения, что бы подтолкнули в каком направлении двигаться. Спасибо!


Совершенно некуда.
Лучше начните с CodeSys, Лоджик очень упрощенная среда программирования, трудно будет перестроиться... А после CodeSys-а Лоджик покажется простым как два пальца ;)

Григорий Чумакин
20.10.2022, 08:55
Ну так загляните в документацию своей HMI и узбагойтесь :) это вам не 2 ПР связать через .....
Добрый день.
Я на СП310 такое использую в своих приложениях - естественно макросом обмен. Индексирую массив из 10 сетевых регистров. При скорости 38400 - чтение или запись массива 3х10 занимает секунд 8, при скорости 9600 - секунд 20 наверное (но у меня порядка 10 устройств на шине и шина более 100 метров - помех достаточно много). Для чтения записи параметров вполне подходит, для отображения текущих значений - только если изменение совсем медленное.

melky
20.10.2022, 14:32
Григорий Чумакин Кто у вас при этом СП310? мастер или слейв