Добрый день. После перехода с 10 версии на 12 также столкнулся со сбоем в работе этой функции.
В универсальном скрипте было только это:
TM_Field(Sender).Text:=FloatToStr(TM_Object(Sender).Variable.AsFloat +TM_Object(Sender).VariableEx.AsFloat);
У TM_Field этот скрипт висит на событиях "OnDataChange" и "OnDataChangeEx"
Также у TM_Field указаны основная переменная и дополнительная.
Решаемая задача: это при изменении переменных всегда видеть их сумму.
Этот вариант стал работать
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 то уже точность надо еще выше ставить....
Здравствуйте.
Если у поля задана основная переменная, то в поле будет выводиться значение этой переменной. Если при этом через скрипт записывать что-либо в свойство поля "Текст", то не гарантируется что все будет работать корректно(даже если это работает сейчас, корректная работа в будущих версиях не гарантируется), т.к. это ненормальный режим работы. Вычисления с переменными можно производить в скрипте "Изменились переменные (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), задав нужное количество знаков после запятой через формат, например:
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.