Показано с 1 по 9 из 9

Тема: Лишние знаки после запятой.

  1. #1
    Пользователь
    Регистрация
    02.04.2012
    Адрес
    СПб
    Сообщений
    7

    По умолчанию Лишние знаки после запятой.

    Добрый день.
    Столкнулся с проблемой, хожу вокруг да около, а решить не могу. МастерСкада 4Д.
    Данные температуры от регулятора ОВЕН. На экране два элемента: стрелочный индикатор и поле вывода текста. У обоих элементов одинаковый источник данных. Так вот в стрелочном регуляторе количество знаков после запятой нормально настраивается. В поле вывода текста эти же данные с 8-10 знаков после запятой. Никак не смог найти, где же настраивается этот параметр.
    Подскажите, пожалуйста.

  2. #2

    По умолчанию

    в поле текст нажмите на стрелку связи, и в открывшимся списке связей выбирете редактирование конвертации значений. напишите f2 в поле формат значений это отформатирует значение, чтобы после точки выводилось 2 знака

  3. #3
    Пользователь
    Регистрация
    02.04.2012
    Адрес
    СПб
    Сообщений
    7

    По умолчанию

    Спасибо. Теперь понятно.

  4. #4

    По умолчанию

    Расскажу свой опыт, может кому-то поможет.
    У меня в проекте несколько сотен датчиков. Температуре нужна точность 0.1, давлению 0.001 МПа, уровню 0 мм, вибрациям 0.01. И вот когда я сделал шаблонный элемент "Аналоговый датчик" с окном настроек диапазона и уровней срабатывания HH H L LL (итого 7 полей в/в включая сам датчик). Возник вопрос как динамически указывать нужную точность для разных типов значений.
    Всё было бы сказочно простым, если бы в мастерскаде сделали поле "число знаков после запятой" доступным для динамизации. Но мастерскада не любит, чтобы разработчику было просто, поэтому они спрятали эту настройку в отдельное окошко. Для каждого датчика менять по 7 полей выливалось в несколько тысяч кликов, обезьяньей работы. Я выставил авто, чтобы мастерскада сама аккуратненько ставила сколько нужно.

    И вот тут, ребята, самая засада. Поля значений мастерскады имеют внутренний тип LREAL. И когда на них вешаешь REAL, то при неявном преобразовании после 7го знака дроби появляется всякий мусор. Было у вас 0.5, станет 0.500000005645956 или 0.49999999994858647. И вся эта борода вываливается на экран, так что целая часть числа оказывается за горизонтом.
    Выход я нашёл в том, чтобы прогонять входное значение через ST-скрипт где делать из REAL очищенный от вредных примесей LREAL. И уже этот выход скрипта привязывать к значению.

    Value_out : LREAL;
    Value_in: REAL;
    Accuracy: LREAL;

    (*TODO: TYPE PROGRAM CODE HERE*)
    Accuracy := 0.001;
    Value_out := DINT_TO_LREAL(LREAL_TO_DINT(Value_in/Accuracy))*Accuracy;

    И это помогло! Точность теперь можно вывести во внешнее значение/команду и позволять пользователю менять в окне настроек датчика.
    Такую же формулу применяю в ПЛК, чтобы отсекать лишние знаки после запятой и не дергать зря подсистему трендов.
    Последний раз редактировалось plcmaster; 04.07.2023 в 18:16.

  5. #5
    Пользователь
    Регистрация
    21.12.2011
    Адрес
    Северодвинск
    Сообщений
    438

    По умолчанию

    Value_in: 1,8;
    Accuracy: 1;
    Value_out : 1;

  6. #6

    По умолчанию

    На самом деле все делается проще.
    https://support.mps-soft.ru/MasterSC...nalogovie.html
    Поле формат - указываете сколько знаков после запятой.
    Затем эту шкалу назначаете переменной - эти настройки шкалы (в том числе и формат) применяться к элементам мнемосхемы и тренда.
    Элементы на мнемосхемы должны быть созданы вытаскиванием элементов из дерева объектов.
    Спасибо.

  7. #7

    По умолчанию

    Цитата Сообщение от VaBo Посмотреть сообщение
    Value_in: 1,8;
    Accuracy: 1;
    Value_out : 1;
    Чтобы было более интуитивно понятно, код должен выглядеть так:
    Было
    Accuracy := 1000.0;
    Value_out := DINT_TO_LREAL(LREAL_TO_DINT(Value_in*Accuracy))/Accuracy;

    Стало
    Accuracy := 0.001;
    Value_out := DINT_TO_LREAL(LREAL_TO_DINT(Value_in/Accuracy))*Accuracy;

    В вашем случае надо писать Accuracy := 0.1;

  8. #8
    Пользователь
    Регистрация
    21.12.2011
    Адрес
    Северодвинск
    Сообщений
    438

    По умолчанию

    Это не мой случай, это округление неправильное.

  9. #9

    По умолчанию

    Цитата Сообщение от VaBo Посмотреть сообщение
    Это не мой случай, это округление неправильное.
    У меня была задача отрезать хвост, а не округлять.
    Для правильного округления последнего знака код нужно изменить вот так:

    Accuracy := 0.001;
    Value_out := DINT_TO_LREAL(LREAL_TO_DINT(Value_in/Accuracy+0.5))*Accuracy;

Похожие темы

  1. 4 байта в число с плавающей запятой
    от Пьер в разделе СПК1хх
    Ответов: 41
    Последнее сообщение: 18.03.2019, 19:37
  2. Как убрать скачки значения в знаки после запятой
    от skinnbatter в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 04.06.2017, 11:10
  3. Modbus String Output Module - передает лишние нули
    от StarJedy в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 09.11.2015, 11:53
  4. непонятные знаки при адресации ИП320
    от desperadoes в разделе Панели оператора (HMI)
    Ответов: 4
    Последнее сообщение: 25.07.2011, 12:14
  5. Положение запятой в ТРМ138
    от Turboblock в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 21.07.2009, 09:45

Ваши права

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