Просмотр полной версии : Лишние знаки после запятой.
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;
И это помогло! Точность теперь можно вывести во внешнее значение/команду и позволять пользователю менять в окне настроек датчика.
Такую же формулу применяю в ПЛК, чтобы отсекать лишние знаки после запятой и не дергать зря подсистему трендов.
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;
Это не мой случай, это округление неправильное.
plcmaster
05.07.2023, 20:04
Это не мой случай, это округление неправильное.
У меня была задача отрезать хвост, а не округлять.
Для правильного округления последнего знака код нужно изменить вот так:
Accuracy := 0.001;
Value_out := DINT_TO_LREAL(LREAL_TO_DINT(Value_in/Accuracy+0.5))*Accuracy;
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot