Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 29 из 29

Тема: Функция округления вещественных чмсел

  1. #21

    По умолчанию

    Вот это деловой подход!
    С такими талантами думаю Вам под силу написать "народную" функцию универсального округления!
    С удовольствием добавлю ее в свою библиотеку.

  2. #22
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,795

    По умолчанию

    Цитата Сообщение от Cbug Посмотреть сообщение
    Да... ребята. Прямо сборище интеллектуалов!

    Надеюсь, что тот неопытный новичок который придет сюда за знаниями сможет найти здесь что-то из большой кучи безполезных постов.

    Функция реально рабочая - преобразует значения датчиков давления (со всегда положительными значениями) в регистр modbus, для последующего отображения на hmi со смещением десятичной точки.

    Заменить типы переменных на какие кому необходимо не составит труда.
    Датчики давления со всегда положительными значениями... нда теоретик , а что будет показывать функция ваша, если датчик чуть-чуть свакуумировался (такое бывает сплошь и рядом), или дрожание значения 3.8ма...4.2ма? И ведь пишут теоретики ересь типа real_to_word, а в результате та-дам ни с того ни с сего защиты отработали и...ракета...самолет утонули в мировом океане, хим завод выбросил в окружающую среду какую-то вредную хрень и тд и тп.
    А неопытному новичку на форумах нефиг знаний искать!!! Только ответы на конкретные вопросы! А знания надо искать в учебниках, руководствах пользователя и пр. документах, благо интернет сейчас позволяет не рыскать по техническим библиотекам!

  3. #23

    По умолчанию

    Всем привет. Как будет выглядеть функция ROUND на языке ST?

  4. #24

    По умолчанию

    Цитата Сообщение от Sergei2257 Посмотреть сообщение
    Всем привет. Как будет выглядеть функция ROUND на языке ST?
    Например так
    Код:
    FUNCTION ROUND : REAL
    VAR_INPUT
          in : REAL;
          N : INT;     //    кол-во знаков от 0 до 5  
    END_VAR
    VAR
         X: REAL;
         DECADES : ARRAY[0..5] OF REAL := [1.0,10.0,100.0,1000.0,10000.0,100000.0];
    END_VAR
    ___________________________________________________________________
    X :=DECADES[LIMIT(0,N,5)];
    ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;  // 1 вариант обрезание
    
    // ROUND := DINT_TO_REAL( TRUNC( 100* ( in+ 0.005 ) ) ) / 100;   // 2 вариант округление
    Последний раз редактировалось kondor3000; 16.08.2026 в 14:49.

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

    По умолчанию

    Вот проблему нашли, в смысле, на FBD, вроде как ещё 14 миллиардов лет тому назад делали, мне кажется ещё до Большого взрыва:

    Округление.png
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  6. #26
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,189

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Например так
    Код:
    FUNCTION RAUND : REAL
    VAR_INPUT
          in : REAL;
          N : INT;
    END_VAR
    
    VAR
         X: REAL;
        DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,1000000.0,10000000.0;
    END_VAR
    ________________________________________________________________
    X :=DECADES[LIMIT(0,N,8)];
    RAUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;  // 1 вариант обрезание
    
    RAUND := DINT_TO_REAL( TRUNC( 100* ( in+ 0.005 ) ) ) / 100;    // 2 вариант округление
    Как по мне, не вижу смысла указывать какие-то "точки после запятой". Просто округлитель передать и все.
    Нужно 0.1 - так его и передать. Нативно и очевидно. Нужно до 5 округлить - новую функцию писать?

  7. #27

    По умолчанию

    Числа real почти всегда будут иметь в десятичном представлении что угодно, кроме нулей. Поэтому подозреваю, что запрос этой функции - неправильное решение какой-то задачи.

    Так для чего требуется округление для чисел типа real?

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

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    Числа real почти всегда будут иметь в десятичном представлении что угодно, кроме нулей. Поэтому подозреваю, что запрос этой функции - неправильное решение какой-то задачи.

    Так для чего требуется округление для чисел типа real?
    Так вроде округлять можно до целых, десятых долей, сотых долей единиц измерения и т. д., в смысле, непонятно при чём здесь нули, их при округлении может не быть совсем!
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  9. #29

    По умолчанию

    Дело в том, что в формате чисел real невозможно точно выразить и хранить числа, не являющиеся степенью числа 2. Поэтому округление значения в памяти переменной - просто потеря точности, т.к. число после округления станет чем-то подобным 1,000000001 или 0,999999999, но никак не 1,00000000 - пример условный. Это свойство формата хранения.

    Поэтому и интересуюсь - какая задача решалась изначально? Ну не вывод же числа на экран самодельной подпрограммой - вопрос в разделе СПК, который, наверняка, имеет штатный элемент визуализации чисел.

    Какая задача решалась изначально?

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. 05 функция modbus
    от desperadoes в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 12.02.2014, 11:32
  2. Функция преобразования времени
    от KnDmPetr в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 21.05.2012, 16:26

Ваши права

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