PDA

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



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

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

Aeroplan
19.02.2018, 14:12
Спасибо. Теперь понятно.

plcmaster
03.07.2023, 18:53
Расскажу свой опыт, может кому-то поможет.
У меня в проекте несколько сотен датчиков. Температуре нужна точность 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;

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

VaBo
03.07.2023, 19:17
Value_in: 1,8;
Accuracy: 1;
Value_out : 1;

SCADAMaster
03.07.2023, 19:22
На самом деле все делается проще.
https://support.mps-soft.ru/MasterSCADAHelp/index.html?proekt_stranicy_svojstv_elementov_srran icy_svojstv_sistemy_zakladka_analogovie.html
Поле формат - указываете сколько знаков после запятой.
Затем эту шкалу назначаете переменной - эти настройки шкалы (в том числе и формат) применяться к элементам мнемосхемы и тренда.
Элементы на мнемосхемы должны быть созданы вытаскиванием элементов из дерева объектов.

plcmaster
04.07.2023, 18:18
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;

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

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

У меня была задача отрезать хвост, а не округлять.
Для правильного округления последнего знака код нужно изменить вот так:

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