Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: Переполнение DINT

  1. #1

    По умолчанию Переполнение DINT

    Добрый день!

    Написал некий фильтр в котором суммируются данные в переменной DINT итд, при маленькой глубине фильтра (8-16 значений) все работает, но стоит увеличить его глубину и DINT начинает переполняться, сумма положительных значений превращается в отрицательную. Как можно побороть это? Какие есть форматы целого со знаком (типа DINT64 или что то в этом роде)? DWORD не подходит так как значения могут приходить и отрицательные. В REAL тоже не все так гладко, так как к большой сумме прибавляются малые значения и накапливается ошибка (нужно допиливать напильником).

    Заранее благодарен

  2. #2
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Для результата(суммы) используйте UDINT
    для входных значений - INT или DINT
    Захват-2.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #3

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Для результата(суммы) используйте UDINT
    для входных значений - INT или DINT
    UDINT тот же DWORD сумма должна быть со знаком так как иногда могут приходить и отрицательные значения. INT для входящих тоже не вариант так как значения могут быть больше 32767. Нужен более вместительный формат целого со знаком чем от -2147483648 до 2147483647.

  4. #4
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    так можно предварительно выделить знак.
    При работе с DWORD учитывайте самый старший бит как знак.

  5. #5

    По умолчанию

    LINT используйте

  6. #6
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    8,242

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    Добрый день!

    Написал некий фильтр в котором суммируются данные в переменной DINT итд, при маленькой глубине фильтра (8-16 значений) все работает, но стоит увеличить его глубину и DINT начинает переполняться, сумма положительных значений превращается в отрицательную. Как можно побороть это? Какие есть форматы целого со знаком (типа DINT64 или что то в этом роде)? DWORD не подходит так как значения могут приходить и отрицательные. В REAL тоже не все так гладко, так как к большой сумме прибавляются малые значения и накапливается ошибка (нужно допиливать напильником).

    Заранее благодарен
    Математику никак нельзя применить?
    (а+б)/с = а/с + б/с
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  7. #7
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    UDINT тот же DWORD сумма должна быть со знаком так как иногда могут приходить и отрицательные значения. INT для входящих тоже не вариант так как значения могут быть больше 32767. Нужен более вместительный формат целого со знаком чем от -2147483648 до 2147483647.
    Ну тогда только если разделить суммирование положительных и отрицательных чисел по двум переменным UDINT, а в конце из положительной суммы вычитать отрицательную.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #8

    По умолчанию

    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    Математику никак нельзя применить?
    (а+б)/с = а/с + б/с
    Ващето гениально
    попробую, но боюсь не всегда может прокатить при a < c например. где с - глубина фильтра.

  9. #9
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Ну тогда только если разделить суммирование положительных и отрицательных чисел по двум переменным UDINT, а в конце из положительной суммы вычитать отрицательную.
    Код:
    VAR
    	SumPlus: UDINT;
    	SumMinus: UDINT;
    	Curr: DINT;
    	Sum: DINT;
    END_VAR
    
    IF Curr >=0 THEN
    SumPlus:=SumPlus + Curr;
    ELSE
    SumMinus:=SumMinus - Curr;
    END_IF
    Sum:=SumPlus - SumMinus;
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  10. #10

    По умолчанию

    petera, ок, попробую, спасибо )
    Последний раз редактировалось lazy; 14.10.2016 в 13:31.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Идет переполнение стека ПР 110
    от Николай_10 в разделе Программируемые реле
    Ответов: 8
    Последнее сообщение: 30.04.2015, 16:50
  2. Переполнение диапазона
    от Boris_K в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 15.12.2014, 17:28
  3. Modbus DINT
    от olegsv в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 25.01.2012, 09:01

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •