Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Виктория от 19 Октября 2021, 07:23:54

Название: FloatToStr
Отправлено: Виктория от 19 Октября 2021, 07:23:54
Здравствуйте. Проверьте на корректность работу FloatToStr в версии scada 2.5.11.0. Не работает данная функция.
Название: Re: floattostr
Отправлено: Simple_Scada от 19 Октября 2021, 08:58:10
Здравствуйте.

Функция FloatToStr (https://simple-scada.com/help/script/floattostr.html) преобразует вещественное число в строку UTF8String. Возможно в скрипте Вы складываете строки с разными типами данных, например пытаетесь в переменную "String" записать результат FloatToStr(UTF8String), что невозможно без преобразования к типу "String" с помощью функции UTF8ToString (https://simple-scada.com/help/script/utf8tostring.html) или использования приведения значения переменной к строке - свойство AsStr (https://simple-scada.com/help/script/varasstr.html).

Пришлите код скрипта, в котором не работает FloatToStr.
Название: Re: FloatToStr
Отправлено: Виктор К от 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 указаны основная переменная и дополнительная.

Решаемая задача: это при изменении переменных всегда видеть их сумму.
Название: Re: FloatToStr
Отправлено: Виктор К от 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 то уже точность надо еще выше ставить....
Название: Re: FloatToStr
Отправлено: Simple_Scada от 27 Октября 2021, 13:50:37
Здравствуйте.

Если у поля задана основная переменная, то в поле будет выводиться значение этой переменной. Если при этом через скрипт записывать что-либо в свойство поля "Текст", то не гарантируется что все будет работать корректно(даже если это работает сейчас, корректная работа в будущих версиях не гарантируется), т.к. это ненормальный режим работы. Вычисления с переменными можно производить в скрипте "Изменились переменные (https://simple-scada.com/help/script/changemulvar.html)" или применительно к Вашей задаче, можно использовать скрипт "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)".

Работу функции FloatToStr проверим. Сейчас Вы можете использовать вместо нее FormatFloat (https://simple-scada.com/help/script/formatfloat.html), задав нужное количество знаков после запятой через формат, например:
Код: (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.