Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Правильная реализация сдвига запятой в double  (Прочитано 12155 раз)

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Всем привет  :)
Возник вопрос, как в переменной Simple-Scada 2 типа double сделать правильный сдвиг запятой? К примеру я вполе я ввожу число 200 и скада должна его распарсить как 2.00. Я пробовал настраивать шкалу и саму переменную, но выходит только это: 200.00. Ввести к примеру мне нужно 180 и я должен увидеть 1.80
Будьте добры, как победить данную проблему. Спасибо :))
« Изменён: 25 Сентября 2019, 11:15:59 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #1 : 24 Сентября 2019, 18:08:56 »
Здравствуйте.

См. свойство сдвиг запятой на вкладке "Дополнительные" в окне создания / редактирования переменной. Описание и скрины есть в руководстве по этой ссылке.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #2 : 25 Сентября 2019, 11:00:04 »
Здравствуйте.

См. свойство сдвиг запятой на вкладке "Дополнительные" в окне создания / редактирования переменной. Описание и скрины есть в руководстве по этой ссылке.
Здравствуйте. Я так и делал. Шкала у меня от 0-9999 (по другому не могу ввести число 180) и сдвиг -2. В итоге когда ввожу 180, он мне и віводит в поле 180, а не 1.80. Подскажите, где я мог ошибиться?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #3 : 25 Сентября 2019, 11:13:33 »
Вы уверены что нужно вводить одно число, а видеть другое? Это очень странно, т.к. при вводе нужно будет заранее продумывать какое значение нужно ввести чтобы получить нужное значение.
Учитывайте, что когда у переменной включен сдвиг запятой - скада берёт на себя все преобразования, как на чтение так и на запись. Пример: на контроллере есть переменная которая меняется в диапазоне от 0 до 200. В скаде нужно видеть эту переменную в шкале от 0.00 до 2.00. Тогда добавляем переменную в скаду, задаём реальную шкалу 0..200 и включаем сдвиг запятой -2. Теперь пользователь будет видеть значения в шкале от 0.00 до 2.00, как и требовалось. Вводить значения он тоже будет в этой шкале! Но на контроллер скада будет записывать значения в шкале 0 до 200. Таким образом пользователь вводит значения в той же шкале, которую и видит на экране (без путаницы со шкалами), а на контроллер идут значения в оригинальной шкале.
Обычно все задачи связанные с преобразованием шкалы решаются именно так, исключая путаницу при вводе значений и оператору не нужно знать в какой шкале значения хранятся на контроллере. Т.е. в Вашем случае нужно вводить не 180, а 1.80 (в той же шкале которую Вы видите на экране), а на контроллер пойдёт 180.
Если Вам всё таки нужно видеть значения в одной шкале, а вводить в другой, то нормально реализовать такую систему не получится и скорее всего в ближайшее время такой возможности не появится, т.к. пока Вы первый пользователь которому нужна такая сложная система ввода.
« Изменён: 25 Сентября 2019, 11:15:20 от Simple-Scada »

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #4 : 25 Сентября 2019, 11:23:35 »
Получается я не смогу в поле в котором ввожу значение 200 отобразить 2.00?

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

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

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

По поводу передачи этой переменной на контролер вопрос лежит по другому, это не важно. Важно именно отображение
« Изменён: 25 Сентября 2019, 11:31:08 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #5 : 25 Сентября 2019, 11:26:09 »
В каком реальном диапазоне у Вас меняется переменная на контроллере?
В каком диапазоне нужно видеть значение в скаде?

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

Цитировать
В поле я ввожу 200 и скада сообщает об ошибке "Значение должно быть не больше 2. Вы ввели: 200!"
Верно, ведь если Вы сместили запятую на 2 знака и оригинальная шкала равна 0..200, значит на экране пользователь будет видеть значения от 0 до 2. Вводить значения тоже нужно будет от 0 до 2. На контроллер будут приходить значения от 0 до 200.
« Изменён: 25 Сентября 2019, 11:30:50 от Simple-Scada »

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #6 : 25 Сентября 2019, 11:41:53 »
В каком реальном диапазоне у Вас меняется переменная на контроллере?
В каком диапазоне нужно видеть значение в скаде?
Общий диапазон это от 0-300, значит шкала должна быть от 0-300. Контроллер пока не трогаем.
Сдвиг запятой -2. Получается, что при вводе 255 скада должна распрасить число в 2.55. Верно?

Извините, если что  :-\ :-[

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #7 : 25 Сентября 2019, 11:46:32 »
Всё крайне примитивно. Одно простое правило: пользователь и вводит и видит значения в одной и той же шкале. Пользователь ничего не должен знать о реальной шкале контроллера. Если на контроллере значение меняется от 0 до 300, значит в скаде у переменной должна быть выбрана шкала от 0 до 300. Далее если Вы включите сдвиг запятой -2, то пользователь будет видеть значения уже не в шкале 0..300, а в шкале 0..3. Вводить значения в поле тоже нужно будет в шкале 0..3. Если введёт 2, то на контроллер запишется значение 200. А видеть пользователь будет то же значение которое и ввёл, т.е. 2.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #8 : 25 Сентября 2019, 11:53:10 »
Да. Всё именно так как Вы сказали. Как тогда сделать, чтобы при вводе 2 было 00.2, при вводе 150 было 1.50, при вводе 100 было 1.00? Именно с визуальной точки зрения.
« Изменён: 25 Сентября 2019, 11:57:30 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #9 : 25 Сентября 2019, 11:56:56 »
Что значит "при вводе 150 было 1.50"? Т.е. чтобы при вводе в поле 150 на контроллер пошло 1.50? Тогда нужно просто сдвиг запятой сделать в другую строну, т.е. +2 (вместо -2).
Если же Вы хотите в одном поле работать в двух разных шкалах (видеть в одной шкале, вводить в другой), то это невозможно.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #10 : 25 Сентября 2019, 12:00:32 »
В контроллер уйдёт 150 как Вы и говорили так и нужно.
Я имею ввиду именно визуальную часть, чтобы поле отображало так. Вот пользователь в поле ввёл 150 и нужно чтобы это же самое поле отобразило 1.50
« Изменён: 25 Сентября 2019, 13:14:44 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Правильная реализация сдвига запятой в double
« Ответ #11 : 25 Сентября 2019, 13:21:57 »
Цитировать
Вот пользователь в поле ввёл 150 и нужно чтобы это же самое поле отобразило 1.50
Т.е. ввод в шкале 0.300, а отображение в шкале 0..3. Как мы и писали выше: в двух разных шкалах через одно поле работать невозможно. Можете описать для какой задачи такое требуется? Что это за параметр с которым нужно так работать и почему? И ещё вопрос: как оператор работает с такими полями? Ведь получается что оператор при вводе должен помнить что чтобы получить 1.50, нужно вводить 150.
Или здесь цель только в том чтобы уйти от ввода десятичной запятой? Но от чего такое требование? Почему просто не ввести запятую (или точку) с клавиатуры?

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #12 : 25 Сентября 2019, 13:32:55 »
Или здесь цель только в том чтобы уйти от ввода десятичной запятой? Но от чего такое требование? Почему просто не ввести запятую (или точку) с клавиатуры?
Совершенно верно. Просто избавиться от ввода точки с клавиатуры. Извините, что я Вам мозг этим выношу, такая претензия заказчика просто. Понимаете? Мне-то не сложно вводить с клавиатуры, но вот как написано в требованиях, так нужно делать  :(

Я так понимаю, что выхода нет в данной ситуации?

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #13 : 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.
Ограничения при вводе - указатель мыши должен находится в поле ввода (иначе поле ввода невидимо, а ввод может быть продолжен).
« Изменён: 25 Сентября 2019, 19:41:12 от pan2000 »

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Правильная реализация сдвига запятой в double
« Ответ #14 : 26 Сентября 2019, 12:11:27 »
Есть лазейка

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

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