- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Числа формата Float.
Модератор: kirillio
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Числа формата Float.
Всем добрый день.
Есть контроллер на который была возложена функция считать сумматор.
Имеем входной сигнал в формате вещественного числа, допустим качественно он варьируется от 50 до 200. /это положим кубометры в час/
Контроллер каждую секунду берет это число, делит на 3600 /считаем такое количество у нас секунд в часе/.
И кидаем эту часть вещественного числа в другую ячейку, которую иногда сбрасываем на ноль (как обычный ресет сумматора).
И интересная вещь начинается, когда такой процесс протекает не один день, а несколько месяцев подряд.
Получается секундная часть от расхода 50, это число порядка 0,013(8) или говоря проще - 1,3(8) *10^ -2.
К примеру счетчик досчитал до 300000 кубов, а далее эту маленькую песчинку кидаем в кучу (которая треть о миллиона).
В формате вещественного числа имеем обычную ситуацию, в этой куче песчинку мы не видим. Счетчик начнет безбожно врать. И чем больше накоплено, тем больше вранья.
ПЛК обычный и 32 битами вещественного числа мы имеем ограничение разрядов. /типичное значение, два регистра по 16 бит ПЛК/.
Вопрос1: как избежать потери точности, особенно если мы не имеем права сумматор ресетить до поры до времени. (а это может быть и годовой интервал).
Вопрос2: нет ли здесь математиков, дабы просто поделились соображениями как производить оценку точности расчетов, и сколько мы можем просто слить на округления.
Вопросы как я понимаю больше риторические. Если бы были расчеты математических моделей, то конечно есть варианты, взять разрядность побольше и рассчитать
с более длинной сеткой числа. Реально помогает и повышает точность.
А как быть на простом контроллере?
Есть контроллер на который была возложена функция считать сумматор.
Имеем входной сигнал в формате вещественного числа, допустим качественно он варьируется от 50 до 200. /это положим кубометры в час/
Контроллер каждую секунду берет это число, делит на 3600 /считаем такое количество у нас секунд в часе/.
И кидаем эту часть вещественного числа в другую ячейку, которую иногда сбрасываем на ноль (как обычный ресет сумматора).
И интересная вещь начинается, когда такой процесс протекает не один день, а несколько месяцев подряд.
Получается секундная часть от расхода 50, это число порядка 0,013(8) или говоря проще - 1,3(8) *10^ -2.
К примеру счетчик досчитал до 300000 кубов, а далее эту маленькую песчинку кидаем в кучу (которая треть о миллиона).
В формате вещественного числа имеем обычную ситуацию, в этой куче песчинку мы не видим. Счетчик начнет безбожно врать. И чем больше накоплено, тем больше вранья.
ПЛК обычный и 32 битами вещественного числа мы имеем ограничение разрядов. /типичное значение, два регистра по 16 бит ПЛК/.
Вопрос1: как избежать потери точности, особенно если мы не имеем права сумматор ресетить до поры до времени. (а это может быть и годовой интервал).
Вопрос2: нет ли здесь математиков, дабы просто поделились соображениями как производить оценку точности расчетов, и сколько мы можем просто слить на округления.
Вопросы как я понимаю больше риторические. Если бы были расчеты математических моделей, то конечно есть варианты, взять разрядность побольше и рассчитать
с более длинной сеткой числа. Реально помогает и повышает точность.
А как быть на простом контроллере?
-
- частый гость
- Сообщения: 441
- Зарегистрирован: 21 июл 2013, 19:32
- Имя: Вадим
- город/регион: Северодвинск
- Благодарил (а): 15 раз
- Поблагодарили: 39 раз
Re: Числа формата Float.
Вы можете для сумматора создать искусственный целочисленный регистр с любой разрядностью, положим 64 бита. И складывайте на здоровье туда каждую секунду свои значения, не деля их при этом ни на что, когда нужно будет считать сумматор - тогда и разделите. Реализуется на самом простом контроллере, точность не теряется вообще.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
Примерно так и думал сделать. Мне наоборот сказали сделать так чтоб все не доходило до годовых значений. Так даже проще...
-
- БАН
- Сообщения: 642
- Зарегистрирован: 03 июн 2010, 12:26
- Имя: Козин Александр Елисеевич
- Страна: Украина
- город/регион: Одесса
- Благодарил (а): 2 раза
- Поблагодарили: 6 раз
- Забанен: Бессрочно
Re: Числа формата Float.
А чего вы собственно ожидали? Максимальная точность обычного числа формата float - 6.5 разрядов, если у вас уже это значение достигнуто - прибавляйте сколь угодно - результата не будет. Здесь нужени или формат double, или, как вам правильно подсказывают выше - переводите в целочисленный формат с любой точностью, и суммируйте на здоровье. Еще лучше - анализировать превышение числом float определенного порога, например 1, или 10, и по результатам сравнения использовать уже целочисленный счетчик с 16 (если устороит), или 32 разрядами.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
Я могу сделать как угодно. Наоборот я пытаюсь порядок привнести в систему. Написать просто это один вариант (уже и так было до меня), а написать правильно - сами понимаете, надо немного все подкорректировать. Народ хочет чтоб все просто примитивно и чтоб работало. А это так как оно работает и сейчас. По сути это моя инициатива сделать все как надо.
Время конечно же тоже мое. Просто считают поверхностно, не вдаваясь в детали. Обратная связь хромает. Пока что я чувствую что это как бы и надо и не надо...
Количество контроллеров больше 50 штук, соответственно работа не пяти минут.
Время конечно же тоже мое. Просто считают поверхностно, не вдаваясь в детали. Обратная связь хромает. Пока что я чувствую что это как бы и надо и не надо...
Количество контроллеров больше 50 штук, соответственно работа не пяти минут.
-
- почётный участник форума
- Сообщения: 3574
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Числа формата Float.
Нужно перейти на целочисленный подсчет с разрядностью 32 или даже 64 бита.ASUTP_PLC писал(а):Вопрос1: как избежать потери точности, особенно если мы не имеем права сумматор ресетить до поры до времени. (а это может быть и годовой интервал).
Если этого недостаточно, то использовать комбинацию из двух и более регистров для получения 128, 256-битного регистра....
Если перейти на целочисленный подсчет, то потерь не будет. Главное чтобы разрядности хватало.ASUTP_PLC писал(а):Вопрос2: нет ли здесь математиков, дабы просто поделились соображениями как производить оценку точности расчетов, и сколько мы можем просто слить на округления.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
Я написал програмку, правда количество округлений уменьшил ровно в двадцать раз. Подсчет в реал формате. Деления веду в двадцать раз реже.
Сумматор работает также как и работал, формате real.
Запустил на контрольный прогон. Два сумматора считают одно и тоже, разными методами. Еще заставил контроллер считать разницу в отдельный регистр.
Уже есть осязаемая разница. Завтра количественно будет ясно. А разница есть.
Сумматор работает также как и работал, формате real.
Запустил на контрольный прогон. Два сумматора считают одно и тоже, разными методами. Еще заставил контроллер считать разницу в отдельный регистр.
Уже есть осязаемая разница. Завтра количественно будет ясно. А разница есть.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
По сути поменялся размер ошибки в абсолютном значении. Даже в 10 раз выше точность меня устроит. А где-то так навскидку и выходит.
-
- не первый раз у нас
- Сообщения: 353
- Зарегистрирован: 02 фев 2010, 22:28
- Имя: Корнеев Дмитрий
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 1 раз
- Поблагодарили: 7 раз
Re: Числа формата Float.
Как я понял, задача ставится интегрировать мгновенные значения расхода и по ним вычислять объем? Если так, то это классический пример из серии "в акваланге, в гамаке и стоя".. Для этого обычно импульсный выход используется.
Запуск и модернизация оборудования без проекта и документации. Дорого.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
На данном объекте был факт экономии абсолютно на всем. Классический пример приводящий к повторяющимся проблемам.Barsik писал(а):Как я понял, задача ставится интегрировать мгновенные значения расхода и по ним вычислять объем? Если так, то это классический пример из серии "в акваланге, в гамаке и стоя".. Для этого обычно импульсный выход используется.
Запустить это одно, обеспечить надежное функционирование - немного другое.
Когда к общему количеству больше чем из 50 контроллеров дал заявку на еще пару (целью было разгрузить на связи критичные точки), мне показали просто дулю.
Был даже разговор с главным инженером предприятия. Так и так, говорю - будет система затыкаться. А каждый контроллер на своем месте. Лишних нет.
Решение - дополнить оборудованием/и суть моего решения/. Что самое интересное и денег не просил. Человек я пришлый, свою работу сделать должен и свободен.
Их социалку не напрягаю.
Все что говорил абсолютно никак не восприняли. И разговор в таком русле: я не могу контроллер для тебя дать. Я же говорю, что не мне контроллер нужен,
я его не домой к себе тащу. Он нужен ВАМ. Просто чтоб было все в порядке.
Когда так все на тормозах спускается, весь проект уже не проект, а так, большая шабашка. Со своего карамана оборудование ставить, - нет уж увольте...
-
- БАН
- Сообщения: 642
- Зарегистрирован: 03 июн 2010, 12:26
- Имя: Козин Александр Елисеевич
- Страна: Украина
- город/регион: Одесса
- Благодарил (а): 2 раза
- Поблагодарили: 6 раз
- Забанен: Бессрочно
Re: Числа формата Float.
Странный вы товарищ, ASUTP_PLC Я же вам написал и причину, причем абсолютно точно, и что и как нужно сделать, чтобы с гарантией иметь нужный результат. Не у вас одного эта проблема с обработкой счетчиков в плавающем формате. Однако нет пророка в своем отечестве... Осталось только написать это за вас?
-
- почётный участник форума
- Сообщения: 3574
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Числа формата Float.
Ага, забудьте тип Real/Float при работе со счетчиками. Этот тип хранит очень большие и очень маленькие числа, но имеет погрешность при арифметических операциях.
-
- БАН
- Сообщения: 642
- Зарегистрирован: 03 июн 2010, 12:26
- Имя: Козин Александр Елисеевич
- Страна: Украина
- город/регион: Одесса
- Благодарил (а): 2 раза
- Поблагодарили: 6 раз
- Забанен: Бессрочно
Re: Числа формата Float.
Да не имеет он никакой погрешности в пределах до 6.5 знаков (значащих цифр мантиссы). Если соблюдается это условие - никакой погрешности не будет. Отсюда и мои рекомендации. Если складывать числа в пределах до 10-Е6, например, и анализировать переход через 1, прибавляя ее к целочисленному счетчику с коррекцией суммы на -1, то гарантируется абсолютно точная работа.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
Я поделился своими измышлениями. Пока изливал проблему, разобрался в ней сам. Решил ее тем способом который меня устроил.
Уж не для этого ли существует этот форум?
Что самое интересное, стоило чуть поглубже поразбираться, так сразу столько негатива... И такая позиция не только здесь.
До того просто тупой код от сих до сих был написан, ни у кого никаких сомнений и мыслей не приходило.
Выяснил особенности и сразу словил на себя негатив.
Да тот кому надо сам придет и возьмет свое. Нет надобности - не возьмет.
Уж не для этого ли существует этот форум?
Что самое интересное, стоило чуть поглубже поразбираться, так сразу столько негатива... И такая позиция не только здесь.
До того просто тупой код от сих до сих был написан, ни у кого никаких сомнений и мыслей не приходило.
Выяснил особенности и сразу словил на себя негатив.
Да тот кому надо сам придет и возьмет свое. Нет надобности - не возьмет.
-
- почётный участник форума
- Сообщения: 3574
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 271 раз
Re: Числа формата Float.
Даже если условие 6,5 знаков соблюсти, а потом прибавить очень маленькое число к очень большому, то происходит потеря маленького числа. Независимо от предусмотренного числа знаков после запятой. Важна разница между большим и маленьким числом при сложении, отношение складываемых чисел не должно превышать порядка миллиона.Alexander писал(а):Да не имеет он никакой погрешности в пределах до 6.5 знаков (значащих цифр мантиссы).
Это уточнение к Вашим словам, вдруг непонятно.
-
- не первый раз у нас
- Сообщения: 353
- Зарегистрирован: 02 фев 2010, 22:28
- Имя: Корнеев Дмитрий
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 1 раз
- Поблагодарили: 7 раз
Re: Числа формата Float.
Если это про меня, то о отношении к вопросу вообще не думалось. Но видел, причем не у каких то там колхозников, в в проекте весьма известной швейцарской фирмы описанный тут метод измерения объема. Чем был немало поражен, потому что там использовались расходомеры Е+Н, импульсный выход которых никак не использовался. На вопрос типа "что за фигня?" мне было отвечено что "мы всегда так делаем", но расхождения с показаниями на дисплее расходомера и в SCADе составляли процентов 20, тогда было заявлено, что суммарный расход - это справочное значение, и точность там ненужна.так сразу столько негатива...
Запуск и модернизация оборудования без проекта и документации. Дорого.
-
- эксперт
- Сообщения: 1055
- Зарегистрирован: 11 ноя 2012, 18:21
- Имя: Нурисламов Руслан М.
- Страна: Казахстан
- город/регион: Алматы
- Благодарил (а): 23 раза
- Поблагодарили: 32 раза
Re: Числа формата Float.
Я в универе численные методами увлекался. Поэтому "мы всегда так делаем" именно в моем случае не совсем ко мне относится.
Конечно же сплошь и рядом наблюдаю, можно сделать лучше, но время на ревизию не дают. Дается чисто прикладная задача... время посчитано, вперед.
Решение же технологических задач часто не предусматривает большой точности... Так что все верно. Каждый прав по своему. Со своей правдой.
Конечно же сплошь и рядом наблюдаю, можно сделать лучше, но время на ревизию не дают. Дается чисто прикладная задача... время посчитано, вперед.
Решение же технологических задач часто не предусматривает большой точности... Так что все верно. Каждый прав по своему. Со своей правдой.