1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Числа формата Float.

Обсуждение вопросов, не относящихся ни к одному из других подразделов

Модератор: kirillio

Ответить

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Числа формата Float.

Сообщение ASUTP_PLC »

Всем добрый день.

Есть контроллер на который была возложена функция считать сумматор.
Имеем входной сигнал в формате вещественного числа, допустим качественно он варьируется от 50 до 200. /это положим кубометры в час/

Контроллер каждую секунду берет это число, делит на 3600 /считаем такое количество у нас секунд в часе/.
И кидаем эту часть вещественного числа в другую ячейку, которую иногда сбрасываем на ноль (как обычный ресет сумматора).

И интересная вещь начинается, когда такой процесс протекает не один день, а несколько месяцев подряд.

Получается секундная часть от расхода 50, это число порядка 0,013(8) или говоря проще - 1,3(8) *10^ -2.
К примеру счетчик досчитал до 300000 кубов, а далее эту маленькую песчинку кидаем в кучу (которая треть о миллиона).

В формате вещественного числа имеем обычную ситуацию, в этой куче песчинку мы не видим. Счетчик начнет безбожно врать. И чем больше накоплено, тем больше вранья.

ПЛК обычный и 32 битами вещественного числа мы имеем ограничение разрядов. /типичное значение, два регистра по 16 бит ПЛК/.

Вопрос1: как избежать потери точности, особенно если мы не имеем права сумматор ресетить до поры до времени. (а это может быть и годовой интервал).
Вопрос2: нет ли здесь математиков, дабы просто поделились соображениями как производить оценку точности расчетов, и сколько мы можем просто слить на округления.

Вопросы как я понимаю больше риторические. Если бы были расчеты математических моделей, то конечно есть варианты, взять разрядность побольше и рассчитать
с более длинной сеткой числа. Реально помогает и повышает точность.
А как быть на простом контроллере?

VaBo
частый гость
частый гость
Сообщения: 441
Зарегистрирован: 21 июл 2013, 19:32
Имя: Вадим
город/регион: Северодвинск
Благодарил (а): 12 раз
Поблагодарили: 38 раз

Re: Числа формата Float.

Сообщение VaBo »

Вы можете для сумматора создать искусственный целочисленный регистр с любой разрядностью, положим 64 бита. И складывайте на здоровье туда каждую секунду свои значения, не деля их при этом ни на что, когда нужно будет считать сумматор - тогда и разделите. Реализуется на самом простом контроллере, точность не теряется вообще.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Примерно так и думал сделать. Мне наоборот сказали сделать так чтоб все не доходило до годовых значений. Так даже проще...

Alexander
БАН
БАН
Сообщения: 642
Зарегистрирован: 03 июн 2010, 12:26
Имя: Козин Александр Елисеевич
Страна: Украина
город/регион: Одесса
Поблагодарили: 4 раза
Забанен: Бессрочно

Re: Числа формата Float.

Сообщение Alexander »

А чего вы собственно ожидали? Максимальная точность обычного числа формата float - 6.5 разрядов, если у вас уже это значение достигнуто - прибавляйте сколь угодно - результата не будет. Здесь нужени или формат double, или, как вам правильно подсказывают выше - переводите в целочисленный формат с любой точностью, и суммируйте на здоровье. Еще лучше - анализировать превышение числом float определенного порога, например 1, или 10, и по результатам сравнения использовать уже целочисленный счетчик с 16 (если устороит), или 32 разрядами.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Я могу сделать как угодно. Наоборот я пытаюсь порядок привнести в систему. Написать просто это один вариант (уже и так было до меня), а написать правильно - сами понимаете, надо немного все подкорректировать. Народ хочет чтоб все просто примитивно и чтоб работало. А это так как оно работает и сейчас. По сути это моя инициатива сделать все как надо.
Время конечно же тоже мое. Просто считают поверхностно, не вдаваясь в детали. Обратная связь хромает. Пока что я чувствую что это как бы и надо и не надо...
Количество контроллеров больше 50 штук, соответственно работа не пяти минут.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

Re: Числа формата Float.

Сообщение Михайло »

ASUTP_PLC писал(а):Вопрос1: как избежать потери точности, особенно если мы не имеем права сумматор ресетить до поры до времени. (а это может быть и годовой интервал).
Нужно перейти на целочисленный подсчет с разрядностью 32 или даже 64 бита.
Если этого недостаточно, то использовать комбинацию из двух и более регистров для получения 128, 256-битного регистра....
ASUTP_PLC писал(а):Вопрос2: нет ли здесь математиков, дабы просто поделились соображениями как производить оценку точности расчетов, и сколько мы можем просто слить на округления.
Если перейти на целочисленный подсчет, то потерь не будет. Главное чтобы разрядности хватало.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Я написал програмку, правда количество округлений уменьшил ровно в двадцать раз. Подсчет в реал формате. Деления веду в двадцать раз реже.
Сумматор работает также как и работал, формате real.
Запустил на контрольный прогон. Два сумматора считают одно и тоже, разными методами. Еще заставил контроллер считать разницу в отдельный регистр.
Уже есть осязаемая разница. Завтра количественно будет ясно. А разница есть.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

По сути поменялся размер ошибки в абсолютном значении. Даже в 10 раз выше точность меня устроит. А где-то так навскидку и выходит.
Аватара пользователя

Barsik
не первый раз у нас
не первый раз у нас
Сообщения: 353
Зарегистрирован: 02 фев 2010, 22:28
Имя: Корнеев Дмитрий
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз
Поблагодарили: 7 раз

Re: Числа формата Float.

Сообщение Barsik »

Как я понял, задача ставится интегрировать мгновенные значения расхода и по ним вычислять объем? Если так, то это классический пример из серии "в акваланге, в гамаке и стоя".. Для этого обычно импульсный выход используется.
Запуск и модернизация оборудования без проекта и документации. Дорого.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Barsik писал(а):Как я понял, задача ставится интегрировать мгновенные значения расхода и по ним вычислять объем? Если так, то это классический пример из серии "в акваланге, в гамаке и стоя".. Для этого обычно импульсный выход используется.
На данном объекте был факт экономии абсолютно на всем. Классический пример приводящий к повторяющимся проблемам.
Запустить это одно, обеспечить надежное функционирование - немного другое.
Когда к общему количеству больше чем из 50 контроллеров дал заявку на еще пару (целью было разгрузить на связи критичные точки), мне показали просто дулю.
Был даже разговор с главным инженером предприятия. Так и так, говорю - будет система затыкаться. А каждый контроллер на своем месте. Лишних нет.
Решение - дополнить оборудованием/и суть моего решения/. Что самое интересное и денег не просил. Человек я пришлый, свою работу сделать должен и свободен.
Их социалку не напрягаю.

Все что говорил абсолютно никак не восприняли. И разговор в таком русле: я не могу контроллер для тебя дать. Я же говорю, что не мне контроллер нужен,
я его не домой к себе тащу. Он нужен ВАМ. Просто чтоб было все в порядке.

Когда так все на тормозах спускается, весь проект уже не проект, а так, большая шабашка. Со своего карамана оборудование ставить, - нет уж увольте...

Alexander
БАН
БАН
Сообщения: 642
Зарегистрирован: 03 июн 2010, 12:26
Имя: Козин Александр Елисеевич
Страна: Украина
город/регион: Одесса
Поблагодарили: 4 раза
Забанен: Бессрочно

Re: Числа формата Float.

Сообщение Alexander »

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

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

Re: Числа формата Float.

Сообщение Михайло »

Ага, забудьте тип Real/Float при работе со счетчиками. Этот тип хранит очень большие и очень маленькие числа, но имеет погрешность при арифметических операциях.

Alexander
БАН
БАН
Сообщения: 642
Зарегистрирован: 03 июн 2010, 12:26
Имя: Козин Александр Елисеевич
Страна: Украина
город/регион: Одесса
Поблагодарили: 4 раза
Забанен: Бессрочно

Re: Числа формата Float.

Сообщение Alexander »

Да не имеет он никакой погрешности в пределах до 6.5 знаков (значащих цифр мантиссы). Если соблюдается это условие - никакой погрешности не будет. Отсюда и мои рекомендации. Если складывать числа в пределах до 10-Е6, например, и анализировать переход через 1, прибавляя ее к целочисленному счетчику с коррекцией суммы на -1, то гарантируется абсолютно точная работа.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Я поделился своими измышлениями. Пока изливал проблему, разобрался в ней сам. Решил ее тем способом который меня устроил.

Уж не для этого ли существует этот форум?
Что самое интересное, стоило чуть поглубже поразбираться, так сразу столько негатива... И такая позиция не только здесь.
До того просто тупой код от сих до сих был написан, ни у кого никаких сомнений и мыслей не приходило.
Выяснил особенности и сразу словил на себя негатив.
Да тот кому надо сам придет и возьмет свое. Нет надобности - не возьмет.

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3558
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 253 раза

Re: Числа формата Float.

Сообщение Михайло »

Alexander писал(а):Да не имеет он никакой погрешности в пределах до 6.5 знаков (значащих цифр мантиссы).
Даже если условие 6,5 знаков соблюсти, а потом прибавить очень маленькое число к очень большому, то происходит потеря маленького числа. Независимо от предусмотренного числа знаков после запятой. Важна разница между большим и маленьким числом при сложении, отношение складываемых чисел не должно превышать порядка миллиона.
Это уточнение к Вашим словам, вдруг непонятно.
Аватара пользователя

Barsik
не первый раз у нас
не первый раз у нас
Сообщения: 353
Зарегистрирован: 02 фев 2010, 22:28
Имя: Корнеев Дмитрий
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз
Поблагодарили: 7 раз

Re: Числа формата Float.

Сообщение Barsik »

так сразу столько негатива...
Если это про меня, то о отношении к вопросу вообще не думалось. Но видел, причем не у каких то там колхозников, в в проекте весьма известной швейцарской фирмы описанный тут метод измерения объема. Чем был немало поражен, потому что там использовались расходомеры Е+Н, импульсный выход которых никак не использовался. На вопрос типа "что за фигня?" мне было отвечено что "мы всегда так делаем", но расхождения с показаниями на дисплее расходомера и в SCADе составляли процентов 20, тогда было заявлено, что суммарный расход - это справочное значение, и точность там ненужна.
Запуск и модернизация оборудования без проекта и документации. Дорого.

Автор темы
ASUTP_PLC
эксперт
эксперт
Сообщения: 1055
Зарегистрирован: 11 ноя 2012, 18:21
Имя: Нурисламов Руслан М.
Страна: Казахстан
город/регион: Алматы
Благодарил (а): 23 раза
Поблагодарили: 31 раз

Re: Числа формата Float.

Сообщение ASUTP_PLC »

Я в универе численные методами увлекался. Поэтому "мы всегда так делаем" именно в моем случае не совсем ко мне относится.

Конечно же сплошь и рядом наблюдаю, можно сделать лучше, но время на ревизию не дают. Дается чисто прикладная задача... время посчитано, вперед.
Решение же технологических задач часто не предусматривает большой точности... Так что все верно. Каждый прав по своему. Со своей правдой.
Ответить

Вернуться в «Общие вопросы»