Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: razorqhex от 24 Сентября 2019, 17:30:06

Название: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 24 Сентября 2019, 17:30:06
Всем привет  :)
Возник вопрос, как в переменной Simple-Scada 2 типа double сделать правильный сдвиг запятой? К примеру я вполе я ввожу число 200 и скада должна его распарсить как 2.00. Я пробовал настраивать шкалу и саму переменную, но выходит только это: 200.00. Ввести к примеру мне нужно 180 и я должен увидеть 1.80
Будьте добры, как победить данную проблему. Спасибо :))
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 24 Сентября 2019, 18:08:56
Здравствуйте.

См. свойство сдвиг запятой на вкладке "Дополнительные" в окне создания / редактирования переменной. Описание и скрины есть в руководстве по этой ссылке (https://simple-scada.com/help/manual/index.html?variable-new.html#var_dop).
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 11:00:04
Здравствуйте.

См. свойство сдвиг запятой на вкладке "Дополнительные" в окне создания / редактирования переменной. Описание и скрины есть в руководстве по этой ссылке (https://simple-scada.com/help/manual/index.html?variable-new.html#var_dop).
Здравствуйте. Я так и делал. Шкала у меня от 0-9999 (по другому не могу ввести число 180) и сдвиг -2. В итоге когда ввожу 180, он мне и віводит в поле 180, а не 1.80. Подскажите, где я мог ошибиться?
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 25 Сентября 2019, 11:13:33
Вы уверены что нужно вводить одно число, а видеть другое? Это очень странно, т.к. при вводе нужно будет заранее продумывать какое значение нужно ввести чтобы получить нужное значение.
Учитывайте, что когда у переменной включен сдвиг запятой - скада берёт на себя все преобразования, как на чтение так и на запись. Пример: на контроллере есть переменная которая меняется в диапазоне от 0 до 200. В скаде нужно видеть эту переменную в шкале от 0.00 до 2.00. Тогда добавляем переменную в скаду, задаём реальную шкалу 0..200 и включаем сдвиг запятой -2. Теперь пользователь будет видеть значения в шкале от 0.00 до 2.00, как и требовалось. Вводить значения он тоже будет в этой шкале! Но на контроллер скада будет записывать значения в шкале 0 до 200. Таким образом пользователь вводит значения в той же шкале, которую и видит на экране (без путаницы со шкалами), а на контроллер идут значения в оригинальной шкале.
Обычно все задачи связанные с преобразованием шкалы решаются именно так, исключая путаницу при вводе значений и оператору не нужно знать в какой шкале значения хранятся на контроллере. Т.е. в Вашем случае нужно вводить не 180, а 1.80 (в той же шкале которую Вы видите на экране), а на контроллер пойдёт 180.
Если Вам всё таки нужно видеть значения в одной шкале, а вводить в другой, то нормально реализовать такую систему не получится и скорее всего в ближайшее время такой возможности не появится, т.к. пока Вы первый пользователь которому нужна такая сложная система ввода.
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 11:23:35
Получается я не смогу в поле в котором ввожу значение 200 отобразить 2.00?

Смотрите, у меня такие параметры:
Шкала: минимум 0, максимум 200, поле "единица измерения" пустая
Переменная: тип данных double, тег внутренний, формат 0.##, сдвиг запятой -2

В поле я ввожу 200 и скада сообщает об ошибке "Значение должно быть не больше 2. Вы ввели: 200!"

UPD: если же точку вводить вручную, то всё в принципе нормально. Просто вопрос состояит в том, как можно автоматизировать ввод точки, чтобы пользователь ввёл целое число (200), а поле отобразило с запятой (2.00).

По поводу передачи этой переменной на контролер вопрос лежит по другому, это не важно. Важно именно отображение
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 25 Сентября 2019, 11:26:09
В каком реальном диапазоне у Вас меняется переменная на контроллере?
В каком диапазоне нужно видеть значение в скаде?

Цитировать
Просто вопрос состояит в том, как можно автоматизировать ввод точки, чтобы пользователь ввёл целое число (200), а поле отобразило с запятой (2.00).
При включенном сдвиге запятой пользователь должен вводить значение в той шкале, в какой он видит это значение на экране. Если пользователь видит в поле значения в диапазоне от 0 до 2, то и вводить он сможет значения только от 0 до 2, не ниже и не выше.

Цитировать
В поле я ввожу 200 и скада сообщает об ошибке "Значение должно быть не больше 2. Вы ввели: 200!"
Верно, ведь если Вы сместили запятую на 2 знака и оригинальная шкала равна 0..200, значит на экране пользователь будет видеть значения от 0 до 2. Вводить значения тоже нужно будет от 0 до 2. На контроллер будут приходить значения от 0 до 200.
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 11:41:53
В каком реальном диапазоне у Вас меняется переменная на контроллере?
В каком диапазоне нужно видеть значение в скаде?
Общий диапазон это от 0-300, значит шкала должна быть от 0-300. Контроллер пока не трогаем.
Сдвиг запятой -2. Получается, что при вводе 255 скада должна распрасить число в 2.55. Верно?

Извините, если что  :-\ :-[
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 25 Сентября 2019, 11:46:32
Всё крайне примитивно. Одно простое правило: пользователь и вводит и видит значения в одной и той же шкале. Пользователь ничего не должен знать о реальной шкале контроллера. Если на контроллере значение меняется от 0 до 300, значит в скаде у переменной должна быть выбрана шкала от 0 до 300. Далее если Вы включите сдвиг запятой -2, то пользователь будет видеть значения уже не в шкале 0..300, а в шкале 0..3. Вводить значения в поле тоже нужно будет в шкале 0..3. Если введёт 2, то на контроллер запишется значение 200. А видеть пользователь будет то же значение которое и ввёл, т.е. 2.
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 11:53:10
Да. Всё именно так как Вы сказали. Как тогда сделать, чтобы при вводе 2 было 00.2, при вводе 150 было 1.50, при вводе 100 было 1.00? Именно с визуальной точки зрения.
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 25 Сентября 2019, 11:56:56
Что значит "при вводе 150 было 1.50"? Т.е. чтобы при вводе в поле 150 на контроллер пошло 1.50? Тогда нужно просто сдвиг запятой сделать в другую строну, т.е. +2 (вместо -2).
Если же Вы хотите в одном поле работать в двух разных шкалах (видеть в одной шкале, вводить в другой), то это невозможно.
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 12:00:32
В контроллер уйдёт 150 как Вы и говорили так и нужно.
Я имею ввиду именно визуальную часть, чтобы поле отображало так. Вот пользователь в поле ввёл 150 и нужно чтобы это же самое поле отобразило 1.50
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: Simple-Scada от 25 Сентября 2019, 13:21:57
Цитировать
Вот пользователь в поле ввёл 150 и нужно чтобы это же самое поле отобразило 1.50
Т.е. ввод в шкале 0.300, а отображение в шкале 0..3. Как мы и писали выше: в двух разных шкалах через одно поле работать невозможно. Можете описать для какой задачи такое требуется? Что это за параметр с которым нужно так работать и почему? И ещё вопрос: как оператор работает с такими полями? Ведь получается что оператор при вводе должен помнить что чтобы получить 1.50, нужно вводить 150.
Или здесь цель только в том чтобы уйти от ввода десятичной запятой? Но от чего такое требование? Почему просто не ввести запятую (или точку) с клавиатуры?
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 25 Сентября 2019, 13:32:55
Или здесь цель только в том чтобы уйти от ввода десятичной запятой? Но от чего такое требование? Почему просто не ввести запятую (или точку) с клавиатуры?
Совершенно верно. Просто избавиться от ввода точки с клавиатуры. Извините, что я Вам мозг этим выношу, такая претензия заказчика просто. Понимаете? Мне-то не сложно вводить с клавиатуры, но вот как написано в требованиях, так нужно делать  :(

Я так понимаю, что выхода нет в данной ситуации?
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: pan2000 от 25 Сентября 2019, 19:29:23
... но вот как написано в требованиях, так нужно делать
Я так понимаю, что выхода нет в данной ситуации?

Есть лазейка, а для выхода нужно изменить возникновение события OnDoneInput объекта "Поле" на завершение ввода, в т.ч. и без изменения переменной (Enter или клик мыши вне поля ввода переменной).

Построить двухслойную структуру из объектов поле, каждый из которых связан со своей переменной. Верхнее поле Field2 для вывода, ввод запрещен. Нижнее Field1 - для ввода.
Скрипты по событиям:

Field2_OnClick, Field2_OnMouseEnter
Код: (delphi)
begin
  Field2.Visible := false;
end.

Field1_OnMouseLeave (вернуть верхнее поле если переменная не изменилась, собственно это и есть лазейка), Field1_OnDoneInput
Код: (delphi)
begin
  VisVar.Value := ExtVar.Value / 100;  // VisVar - внутренняя вещественная переменная формата 0.## для вывода,
  Field2.Visible := true;              // ExtVar - переменная контроллера со шкалой 0..300
end.
Ограничения при вводе - указатель мыши должен находится в поле ввода (иначе поле ввода невидимо, а ввод может быть продолжен).
Название: Re: Правильная реализация сдвига запятой в double
Отправлено: razorqhex от 26 Сентября 2019, 12:11:27
Есть лазейка

Отлично. Большое спасибо

Есть способ по проще  ;)
Создаём переменную типа double и в неё же пихаем шкалу 0...300, подключаем переменную к полю Field1. По событию OnDoneInput пишем этот код:
Код
begin
  vrZ.Value := Field13.Value / 100;
end.
И как только редактирование поля завершено, значение принимает нужный мне вид. Всем спасибо  :)