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

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

Автор Тема: FloatToStr  (Прочитано 1226 раз)

Виктория

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
FloatToStr
« : 19 Октября 2021, 07:23:54 »
Здравствуйте. Проверьте на корректность работу FloatToStr в версии scada 2.5.11.0. Не работает данная функция.
« Изменён: 19 Октября 2021, 08:58:25 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: floattostr
« Ответ #1 : 19 Октября 2021, 08:58:10 »
Здравствуйте.

Функция FloatToStr преобразует вещественное число в строку UTF8String. Возможно в скрипте Вы складываете строки с разными типами данных, например пытаетесь в переменную "String" записать результат FloatToStr(UTF8String), что невозможно без преобразования к типу "String" с помощью функции UTF8ToString или использования приведения значения переменной к строке - свойство AsStr.

Пришлите код скрипта, в котором не работает FloatToStr.

Виктор К

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: FloatToStr
« Ответ #2 : 26 Октября 2021, 14:20:54 »
Добрый день. После перехода с 10 версии на 12 также столкнулся со сбоем в работе этой функции.

В универсальном скрипте было только это:
Код
TM_Field(Sender).Text:=FloatToStr(TM_Object(Sender).Variable.AsFloat +TM_Object(Sender).VariableEx.AsFloat);
       

У TM_Field этот скрипт висит на событиях "OnDataChange" и "OnDataChangeEx"
Также у TM_Field указаны основная переменная и дополнительная.

Решаемая задача: это при изменении переменных всегда видеть их сумму.
« Изменён: 26 Октября 2021, 14:27:39 от Виктор К »

Виктор К

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: FloatToStr
« Ответ #3 : 26 Октября 2021, 14:43:22 »
Этот вариант стал работать

Код
TM_Field(Sender).Text:=UTF8ToString(FloatToStr(TM_Object(Sender).Variable.AsFloat +TM_Object(Sender).VariableEx.AsFloat)); 

НО, что-то с точностью не то.

TM_Object(Sender).Variable.AsFloat= 0.72
TM_Object(Sender).VariableEx.AsFloat= 2.23
а в TM_Field(Sender).Text присваивается значение '3.'

если у FloatToStr поставить точность 4 то получаем уже '2.9'
если у FloatToStr поставить точность 5 то получаем верное значение '2.95'. Это пока сумма <10.00, если больше 10 то уже точность надо еще выше ставить....
« Изменён: 26 Октября 2021, 15:07:46 от Виктор К »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: FloatToStr
« Ответ #4 : 27 Октября 2021, 13:50:37 »
Здравствуйте.

Если у поля задана основная переменная, то в поле будет выводиться значение этой переменной. Если при этом через скрипт записывать что-либо в свойство поля "Текст", то не гарантируется что все будет работать корректно(даже если это работает сейчас, корректная работа в будущих версиях не гарантируется), т.к. это ненормальный режим работы. Вычисления с переменными можно производить в скрипте "Изменились переменные" или применительно к Вашей задаче, можно использовать скрипт "Прошла секунда".

Работу функции FloatToStr проверим. Сейчас Вы можете использовать вместо нее FormatFloat, задав нужное количество знаков после запятой через формат, например:
Код: (delphi)
begin
  if Sender is TM_Field then   // проверяем, что Sender это Поле
    with Sender as TM_Field do // приводим Sender к типу "TM_Field"
      Text := UTF8Encode(FormatFloat('0.##', Variable.AsFloat + VariableEx.AsFloat));
end.