Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

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

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

    По умолчанию

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

  2. #12
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    чето какой то ерундой занимаетесь, у нас что уже преобразования DINT_TO_REAL и/или обратно перестали работать?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    чето какой то ерундой занимаетесь, у нас что уже преобразования DINT_TO_REAL и/или обратно перестали работать?
    Не хочет ТС REAL использовать
    Пост #1
    В REAL тоже не все так гладко, так как к большой сумме прибавляются малые значения и накапливается ошибка (нужно допиливать напильником).
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #14
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    ну наверное на самом деле что изменилось в этом мире, раз целочисленные начали в реале ошибку привносить
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну наверное на самом деле что изменилось в этом мире, раз целочисленные начали в реале ошибку привносить
    Так REAL ведь не точные числа
    Например при сложении
    4 000 000 + 0.005
    получим результат 4 000 000

    ЗЫ.
    Даже
    40 000 + 0.005
    получим результат 40 000
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #16

    По умолчанию

    petera, пока не пробовал, только в фильтре циклов нет для скорости. есть буфер приходящих значений. новое прлюсуецо а старое отнимаецо. как то так:

    m_yNew: BYTE := 0;
    m_yOld: BYTE;
    m_aData: ARRAY [0..255] OF F_DATA;

    m_aData[m_yNew].dwX := i_dwX;
    m_aData[m_yNew].dnY := i_dnY;

    m_yOld := m_yNew - m_yLen; (* m_yLen - глубина *)
    m_dnSXY := m_dnSXY + i_dwX * i_dnY - m_aData[m_yOld].dwX * m_aData[m_yOld].dnY;
    m_yNew := m_yNew + 1;

    поэтому думаю с разделением сумм тоже траблы получацо =(
    Последний раз редактировалось lazy; 14.10.2016 в 17:06.

  7. #17

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    Написал некий фильтр в котором суммируются данные в переменной DINT итд, при маленькой глубине фильтра (8-16 значений) все работает,
    INT для входящих тоже не вариант так как значения могут быть больше 32767
    2147483647 / 16 = 134 217 727

    130 миллионов, что такое измеряете? неужели аналоговый сигнал разрешением в 27 бит получаете? или что то напутали всётаки?

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

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    petera, пока не пробовал, только в фильтре циклов нет для скорости. есть буфер приходящих значений. новое прлюсуецо а старое отнимаецо. как то так:

    m_yNew: BYTE := 0;
    m_yOld: BYTE;
    m_aData: ARRAY [0..255] OF F_DATA;

    m_aData[m_yNew].dwX := i_dwX;
    m_aData[m_yNew].dnY := i_dnY;

    m_yOld := m_yNew - m_yLen; (* m_yLen - глубина *)
    m_dnSXY := m_dnSXY + i_dwX * i_dnY - m_aData[m_yOld].dwX * m_aData[m_yOld].dnY;
    m_yNew := m_yNew + 1;

    поэтому думаю с разделением сумм тоже траблы получацо =(
    В структуре F_DATA
    dwX: DINT ???
    dnY: DINT ???

    И m_dnSXY тоже DINT ???
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #19

    По умолчанию

    dwX: DWORD
    dnY: DINT
    m_dnSXY DINT

  10. #20

    По умолчанию

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

Страница 2 из 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

Ваши права

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